PortSwigger SQL注入LAB10
LAB10祝贺!做了那么久LAB终于破个位数了,而来到LAB10,我们就要开始我们SQL盲注的学习了,那么我们现在开始吧:
【本篇目标】
- 理解并掌握SQL盲注的技能
- 通过SQL盲注来获取所需administrator的密码,并完成登录
一、理解cookie在此处的作用
我们先来看LAB10的题目,他说应用使用了cookie进行了跟踪分析,跟之前不同的是SQL的查询结果不会返回也不会显示错误信息了,这倒是更加贴近实际了,但是如果返回了任何行的话,页面会显示"Welcome back"的消息。
最终的目标还是老样子,从users表中获取administrator用户的密码并成功登录
那我们先来看看这个cookie在这里是怎么起作用的吧
让我们注意Request中的这段语句:Cookie: TrackingId=jGWk2ssV921g19Md; session=rAqozxAugWrDopcMDvMvwQitXjCUcd38
这就是题目中所说的TrackingId,那如果我们现在更改他会发生什么呢:
我们可以发现右上角原先 Home 和 My account 之间的 Welcome back 消失了,这就是题目中所说的:我们可以通过是否回显 Welcome back 来判断是否有查询结果回显。
二、布尔盲注
2.1 理解语法
既然知道服务器会通过对TrackingId进行查询来决定是否返回Welcome back,那么TrackingId就是我们要进行盲注的目标了
思考一下,既然服务器会通过判断TrackingId是否合法来决定是否回显值,这何尝不是一种布尔判断呢,既然如此,我们可以对其进行布尔盲注,我们先通过一段简单的语句来了解他:
' AND ( 'a' FROM users username = 'administrator') = 'a' --
这段语句是什么意思呢?首先第一个 AND 把服务器验证 TrackingId 和后面我们自己编写的语句进行了布尔连接,也就是说只有在 TrackingId 合法且我们编写的语句成立的情况下,服务器才会返回 "Welcome back"。
接下来我们看括号内的内容,括号内的意思是去users表中寻找username为administrator的数据,如果找到了就返回a这个字符
再往下面就不需要过多的解释了,目的就是为了判断括号内中的语句是否成立,如果成立的话,整段语句成立,服务器便会返回"Welcome back",反之,如果括号内的语句不成立,便不会返回"Welcome back"
我们可以看到服务器返回了"Welcome back"字符,证明了我们的想法
2.2 构建密码长度获取语句
既然我们知道了盲注的基础语法,那么接下来我们尝试获取密码的长度:
' AND (SELECT 'a' FROM users WHERE username = 'administrator' AND LENGTH(password) > 1) = 'a' --
这里我们用AND再次并列了一个条件,这个条件通过调用LENGTH()函数来判断administrator密码的长度是否大于1
这里我们可以看到服务器成功回显了 "Welcome back" 提示,说明 administrator 密码的长度大于 1,那么我们可以不断递增 1 的值来获得密码确切的位数。注意:在某些数据库或字符集下,LENGTH() 按字节计数。
三、使用Intruder
3.1 爆破获取密码长度
但是如果我们全部手动来完成这些工作的话,单单获取密码位数就会消耗我们大量的时间和精力,所以这时候我们就需要用到Burp suite的Intruder
我们通过右键--Send to Intruder来将当前会话发送至Intruder,然后把我们原先的1设置为Payload:
接下来我们需要设置Payload的变化情况,我们打开Payload子页,由于我们此处的Payload全程都是一个数字,那么我们在Payload Type中把它设置为Numbers,然后在下面的Payload settings将他的范围设置为1-30:
点击Start attack开始攻击 我们获得了如下结果:
通过判断Length值的突变,我们轻松找到了本次攻击的临界点------------在Payload值为20的时候服务器不再返回"Welcome back"字段,说明administrator密码的长度为20。
3.2 构建密码获取语句
既然我们已经知道如何获取密码的长度,那么只需调整语句即可逐位爆破出密码。
' AND (SELECT SUBSTRING(password, 1, 1) FROM users WHERE username = 'administrator') = 'a' --
这段语句通过调用 SUBSTRING() 函数取出 administrator 密码的第一个字符,与后面的 'a' 比较;若相等,服务器会回显 "Welcome back" 提示。
将他编辑好之后 我们先设置"a"为Payload进行尝试
在 Payload 中将类型设置为 Brute forcer(暴力破解),并在 Payload settings 的 Character set 添加小写字母 a-z 与数字 0-9。由于我们逐字符爆破,把 Min length 和 Max length 都设置为 1。
为了我们更快速的找到结果,我们可以在settings中找到Grep-Match来添加字段"Welcome back",这样在攻击结果页面中我们可以直接通过是否返回"Welcome back"字段来快速筛选
按下开始攻击并等待攻击完成:
我们可以看到,当 Payload 为 1 的时候,服务器回显了 "Welcome back" 提示,证明 administrator 密码的第一位为 1。
3.3 爆破获取密码
既然已经学会如何获取第一位密码字符的方法了,那么我们稍微更改一下之前语句中的Payload就可以获得每一位密码字符了,然后再把他们拼接起来就可以获得完整的密码
但是在 sniper 模式下,我们只能自动更改一个 Payload 的值,所以我们需要切换 Attack type 为 Cluster bomb(集束炸弹),并将代表第一个字符的 "1" 设置为第一个 Payload,把用于比较的 "a" 设置为第二个 Payload。
我们把第一个 Payload 的类型设置为 Numbers,并把范围设为 1-20。
接着把第二个 Payload 的类型设置为 Simple list,并从 Add from list 中添加小写 a-z、大写 A-Z 以及数字 0-9 到列表中(Burp Suite 社区版不支持 Add from list 功能)。
点击 Start attack 开始攻击并分析结果:
3.4 拼接密码
现在我们就已经得知所有密码在每一位的值了,这里我使用记事本来将它们全部拼接起来:
至此,我们得出来最终的密码10rmb7z5lls76ambkk6v
四、登陆验证结果
那么现在我们就去网页中使用我们获得的密码来进行登陆:
登陆成功 LAB10解决
五、总结与防御建议
总结:
- 通过本练习掌握了基于 TrackingId 的布尔盲注思路:利用页面是否回显"Welcome back"作为布尔判定信号,从而逐步探测出用户名为 administrator 的密码长度与每一位字符。
- 演示了用 Burp Suite 的 Intruder 自动化枚举(包括 Numbers、Brute forcer 与 Cluster bomb 模式)来加速长度探测和逐位爆破的实战流程,并最终得到示例密码。
防御建议:
- 使用参数化查询 / 预编译语句,避免将未验证的输入直接拼接到 SQL 中(这是防止 SQL 注入的首要手段)。
- 对所有输入进行白名单校验与长度限制,必要时严格限制字符集(例如只允许数字、字母等)。
- 在数据库账号上实施最小权限原则:应用使用的数据库用户仅授予必要的 SELECT/INSERT/UPDATE 权限,避免使用高权限账号运行应用查询。
- 对敏感数据(如密码)使用强哈希算法并加盐(推荐 bcrypt、scrypt 或 Argon2),并确保不在任何响应或回显中泄露原文或哈希细节。
- 不要在页面上回显敏感的调试信息;对外返回通用的错误提示,同时在服务器端记录详细日志以便审计与告警。
- 对异常请求与爆破行为启用速率限制、账户锁定、验证码与多因素认证(MFA),减缓自动化攻击并提升防护层级。
- 对 Cookie 和会话采取安全配置:设置 HttpOnly、Secure、SameSite,并尽量使用服务器端会话 ID 或对 cookie 值进行签名/加密,避免将未校验的 cookie 值直接用于数据库查询。
- 部署 Web 应用防火墙(WAF)并结合日志监控与告警,及时发现异常流量或大量探测行为。
博客园技术分享 · 请勿用于非法测试