• PortSwigger SQL注入LAB10


    PortSwigger SQL注入LAB10

    LAB10祝贺!做了那么久LAB终于破个位数了,而来到LAB10,我们就要开始我们SQL盲注的学习了,那么我们现在开始吧:

    【本篇目标】
    1. 理解并掌握SQL盲注的技能
    2. 通过SQL盲注来获取所需administrator的密码,并完成登录

    一、理解cookie在此处的作用

    LAB10描述

    我们先来看LAB10的题目,他说应用使用了cookie进行了跟踪分析,跟之前不同的是SQL的查询结果不会返回也不会显示错误信息了,这倒是更加贴近实际了,但是如果返回了任何行的话,页面会显示"Welcome back"的消息。

    最终的目标还是老样子,从users表中获取administrator用户的密码并成功登录

    那我们先来看看这个cookie在这里是怎么起作用的吧

    Burp Suite 抓取结果1

    让我们注意Request中的这段语句:Cookie: TrackingId=jGWk2ssV921g19Md; session=rAqozxAugWrDopcMDvMvwQitXjCUcd38

    这就是题目中所说的TrackingId,那如果我们现在更改他会发生什么呢:

    Burp Suite 抓取结果2

    我们可以发现右上角原先 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"

    Burp Suite 抓取结果3

    我们可以看到服务器返回了"Welcome back"字符,证明了我们的想法

    2.2 构建密码长度获取语句

    既然我们知道了盲注的基础语法,那么接下来我们尝试获取密码的长度:

    ' AND (SELECT 'a' FROM users WHERE username = 'administrator' AND LENGTH(password) > 1) = 'a' -- 

    这里我们用AND再次并列了一个条件,这个条件通过调用LENGTH()函数来判断administrator密码的长度是否大于1

    Burp Suite 抓取结果4

    这里我们可以看到服务器成功回显了 "Welcome back" 提示,说明 administrator 密码的长度大于 1,那么我们可以不断递增 1 的值来获得密码确切的位数。注意:在某些数据库或字符集下,LENGTH() 按字节计数。

    三、使用Intruder

    3.1 爆破获取密码长度

    但是如果我们全部手动来完成这些工作的话,单单获取密码位数就会消耗我们大量的时间和精力,所以这时候我们就需要用到Burp suite的Intruder

    我们通过右键--Send to Intruder来将当前会话发送至Intruder,然后把我们原先的1设置为Payload:

    Burp Suite 抓取结果5

    接下来我们需要设置Payload的变化情况,我们打开Payload子页,由于我们此处的Payload全程都是一个数字,那么我们在Payload Type中把它设置为Numbers,然后在下面的Payload settings将他的范围设置为1-30:

    Burp Suite抓取结果6

    点击Start attack开始攻击 我们获得了如下结果:

    Burp Suite抓取结果7

    通过判断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进行尝试

    Burp Suite抓取结果8

    在 Payload 中将类型设置为 Brute forcer(暴力破解),并在 Payload settings 的 Character set 添加小写字母 a-z 与数字 0-9。由于我们逐字符爆破,把 Min length 和 Max length 都设置为 1。

    Burp Suite抓取结果9

    为了我们更快速的找到结果,我们可以在settings中找到Grep-Match来添加字段"Welcome back",这样在攻击结果页面中我们可以直接通过是否返回"Welcome back"字段来快速筛选

    Burp Suite抓取结果10

    按下开始攻击并等待攻击完成:

    Burp Suite抓取结果11

    我们可以看到,当 Payload 为 1 的时候,服务器回显了 "Welcome back" 提示,证明 administrator 密码的第一位为 1。

    3.3 爆破获取密码

    既然已经学会如何获取第一位密码字符的方法了,那么我们稍微更改一下之前语句中的Payload就可以获得每一位密码字符了,然后再把他们拼接起来就可以获得完整的密码

    但是在 sniper 模式下,我们只能自动更改一个 Payload 的值,所以我们需要切换 Attack typeCluster bomb(集束炸弹),并将代表第一个字符的 "1" 设置为第一个 Payload,把用于比较的 "a" 设置为第二个 Payload。

    Burp Suite抓取结果12

    我们把第一个 Payload 的类型设置为 Numbers,并把范围设为 1-20。

    Burp Suite抓取结果13

    接着把第二个 Payload 的类型设置为 Simple list,并从 Add from list 中添加小写 a-z、大写 A-Z 以及数字 0-9 到列表中(Burp Suite 社区版不支持 Add from list 功能)。

    Burp Suite抓取结果14

    点击 Start attack 开始攻击并分析结果:

    Burp Suite抓取结果15

    3.4 拼接密码

    现在我们就已经得知所有密码在每一位的值了,这里我使用记事本来将它们全部拼接起来:

    拼接密码

    至此,我们得出来最终的密码10rmb7z5lls76ambkk6v

    四、登陆验证结果

    那么现在我们就去网页中使用我们获得的密码来进行登陆:

    LAB解决

    登陆成功 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)并结合日志监控与告警,及时发现异常流量或大量探测行为。

    博客园技术分享 · 请勿用于非法测试

  • 相关阅读:
    字节跳动面试真题-寻找两个正序数组的中位数
    【老生谈算法】matlab实现LMMSE算法信道均衡源码——LMMSE算法
    学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化
    Visual studio2019 配置使用pthread
    K8S部署ECK采集日志
    自动驾驶感知算法实战12——BEV 基于图像/Lidar/多模态数据的3D检测与分割任务
    第三章-Mybatis源码解析-以xml方式走流程-mapper解析(一)
    信息保障和数字取证:不断深化的关系
    Java 面试题:Java 的文件拷贝方式有几种?哪一种最高效?
    ElementPlus· tab切换/标签切换 + 分页
  • 原文地址:https://www.cnblogs.com/CH3CH2OH-Blog/p/20204936