从业者-盲注-可见错误
# 实验室:基于可见错误的SQL注入
提示
官方于 2023-05 新增该实验室。
# 题目
此实验室包含一个 SQL 注入漏洞。应用程序通过跟踪 Cookie 进行分析,并执行包含所提交 Cookie 值的 SQL 查询。但程序不返回 SQL 查询的结果。
数据库包含另一个名为users
的表,其中的列名为username
和password
。要解决实验室问题,请找到一种泄露administrator
用户密码的方法,然后登录其帐户。
- name: 实验室-从业者
desc: 基于可见错误的SQL注入 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/sql-injection/blind/lab-sql-injection-visible-error-based
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “Access the lab” 进入实验室。

实验室页面如下。

使用 BurpSuite 捕获站点数据包,并转发至 Repeater 功能模块。
在 Cookie 中找到TrackingId
参数,在其后方添加一个单引号,应用程序返回了 500 状态码和错误信息。

通过搜索引擎查询错误信息,得知站点使用的数据库为 PostgreSQL。

# 过程
在经过多次尝试之后(我是fw),我找到了解决方案。

经过多次尝试,得到的信息如下:
- 原始查询的列数为 1 列,查询的数据类型为字符串。
- 查询语句的总长度不能超过 95 个字符(不包含注释符号),超过的部分会被截断。
- ......等
# 尝试-1
正如上面所说,最大的难题就是字符长度限制,“原始查询 + 注入的语句” 拼接后的总长度必须保持在 95 个字符以内。
首先尝试了 UNION 攻击,但是太长了,导致语句被截断。
失败。

# 尝试-2
尝试将TrackingId
原来的参数值删除,节约出了 16 个字符的空间。
但总长度还是超过了 95 个字符,失败。

# 成功
此处改为使用OR
运算符,可以使长度最小化。
' OR CAST((SELECT username FROM users LIMIT 1) AS int)-- qwe
但,程序返回了另一个错误信息 “OR 的参数必须是布尔类型,而不是整数类型”。

解决办法很简单,只需要将转换的目标类型从int
改为bool
就可以了。
' OR CAST((SELECT username FROM users LIMIT 1) AS int)-- qwe
再次发送数据包,要查询的数据被包含在错误信息当中,并一起返回给了我们。
成功。

修改注入语句,改为查询 password 字段。
' OR CAST((SELECT password FROM users LIMIT 1) AS bool)-- qwe
获得密码insobaok86c3ovy15shl
。

进入实验室登录界面,输入刚刚获得的用户名和密码,进行登录。

登录成功,实验完成。

# 另一种成功
后来我还尝试了 “堆叠查询”,可以实现相同的成果。
'%3bSELECT CAST((SELECT username FROM users LIMIT 1) AS int)-- qwe
