首页 > 基础资料 博客日记
PortSwigger SQL注入LAB11
2026-06-11 17:30:02基础资料围观3次
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)确保单行返回,然后对目标字段施加强制类型转换以触发报错并读取返回内容。
防御建议:
- 不要在生产环境中将详细的数据库错误信息直接暴露给客户端。对外返回通用错误提示,并在服务端记录详细日志供审计与告警使用。
- 使用参数化查询或预编译语句(prepared statements),避免将 cookie、URL、表单等外部数据直接拼接到 SQL 中。
- 对输入进行严格的白名单校验与长度限制,尤其是在将值传递给数据库之前做类型与范围检查。
- 数据库账号遵循最小权限原则,应用仅使用具备必要权限的账户访问数据。
- 对敏感数据(如密码)使用强哈希并加盐存储(推荐 bcrypt、scrypt、Argon2),避免明文或可逆加密。
- 对异常请求与探测行为实施速率限制、封禁与告警,结合日志和监控及时发现注入尝试。
- 部署 WAF、输入校验库或安全中间件作为额外防线,并定期进行安全测试与代码审计。
- 对会话与 cookie 使用安全属性(HttpOnly、Secure、SameSite),并避免将未经校验的 cookie 值直接用于后端查询。
博客园技术分享 · 请勿用于非法测试
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 微调LLM前你需要了解的一些概念-- 反向传播解析
- 线上 Redis 突然“爆”了,怎么办?
- PortSwigger SQL注入LAB11
- 机房断电搞崩服务器 | 人大金仓 V8 全量备份跨实例完整恢复实录
- AI Agent 的 4 个工程关键词:Prompt、Context、Loop、Harness 到底是什么?
- DeepSeek-Reasonix:一个为缓存而生的终端编程 Agent,极致的缓存!
- MySQL 大批量 LONGTEXT 数据迁移导致临时表空间溢出的解决方案
- C#从零开始:自己实现窗口滚动截屏Win
- 基于SQL实现分组的文字排序聚合
- MagicWorld 实现长时交互视频世界建模

