PortSwigger SQL注入LAB12
今天我们来做PortSwigger SQL注入的LAB12这道LAB跟之前的几道LAB不太一样但是更加贴近现实了那么我们现在开始吧:【本篇目标】1. 理解并掌握基于可视化错误的SQL注入2. 通过SQL注入来获取所需administrator的密码并完成登录一、分析题目我们先来看LAB12的题目他说应用使用了cookie进行了跟踪分析SQL的查询结果不仅不会返回但是服务器传回的错误是正常返回的。最终的目标还是老样子从users表中获取administrator用户的密码并成功登录二、制造错误既然服务器可以返回错误那我们就来看看它是怎样报错的。老样子先破坏它的 cookie 查询语句看看会发生什么在 TrackingId 值的后面加一个来破坏查询。我们可以看到返回了未终止字符串错误这意味着在查询的代码中多了一个引号导致原先的引号未闭合那么我们要是把原先后面的引号注释掉呢我们可以发现错误消失了那么我们可以利用这一点让服务器通过报错的形式来把密码说出来三、构造报错语句3.1 理解CAST()函数并构造错误为了让密码出现在报错中这里我们使用了CAST(x AS y)函数作用是把 x 转换为 y 数据类型。我们的想法是把用户名字符串转换为整型INT由于该转换在数值上下文不合法会触发服务器报错从而泄露内容。这里我们还是使用AND来将原语句与我们构造的语句连接起来但是由于AND是一个逻辑运算符所以他的左右两边都要求是布尔表达式所以这里我们要在前面加一个1 这样我们就构造出了如下语句: AND 1 CAST((SELECT username FROM users) AS INT) --我们来运行一下看看结果:这里我们看到服务器还是返回了未终止字符串错误但是不对啊我们并没有引入更多的引号啊。3.2 分析错误形成原因并修正不要急我们仔细来看一下报错我们可以发现我们构造的语句在users)A处就强行截断了那么说明我们的语句是没有错误的只是字符达到服务器的上限导致强行截断了那么我们把他前面TrackingId的值给他全部删掉反正我们现在也用不到他了:再次send之后还是返回了报错但是这次的报错不一样了他这里说表达式使用的子查询返回了超过一行的数据说明我们这里的查询本身可以容纳一行的数据但是服务器返回的数据超过了这个值此时在子查询后加上LIMIT 1可以强制只返回第一条记录再发送请求试试可以看到我们成功通过服务器的报错取出了 users 表中 username 列的第一条记录: administrator。3.3 改进语句获取密码既然我们已经成功获取了用户名并确认 administrator 为第一行那么我们可以把子查询改为 password 字段让服务器通过类型转换错误把密码显示出来 AND 1 CAST((SELECT password FROM users LIMIT 1) AS INT) --我们可以看到服务器通过报错返回了我们需要的密码j1pxktuj08fg5upgq1bj四、登陆验证结果现在我们将获得的密码用于登录页面进行验证登录成功LAB12 解决。五、总结与防御建议总结本题演示了如何利用可视化错误错误信息或异常将数据库字段通过报错暴露通过将查询结果强制转换为不兼容类型如字符串强制转换为整数来触发类型错误从而在错误消息或响应中泄露数据。关键步骤包括先定位能触发错误的注入点使用子查询与行限制如LIMIT 1确保单行返回然后对目标字段施加强制类型转换以触发报错并读取返回内容。防御建议