首页 > 基础资料 博客日记

PortSwigger SQL注入LAB11

2026-06-11 17:30:02基础资料围观3

文章PortSwigger SQL注入LAB11分享给大家,欢迎收藏极客资料网,专注分享技术知识

PortSwigger SQL注入LAB12

今天我们来做PortSwigger SQL注入的LAB12,这道LAB跟之前的几道LAB不太一样,但是更加贴近现实了,那么我们现在开始吧:

【本篇目标】
1. 理解并掌握基于可视化错误的SQL注入
2. 通过SQL注入来获取所需administrator的密码,并完成登录

一、分析题目

LAB12描述

我们先来看LAB12的题目,他说应用使用了cookie进行了跟踪分析,SQL的查询结果不仅不会返回,但是服务器传回的错误是正常返回的。

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

二、制造错误

既然服务器可以返回错误,那我们就来看看它是怎样报错的。老样子,先破坏它的 cookie 查询语句,看看会发生什么:在 TrackingId 值的后面加一个 ' 来破坏查询。

Burp Suite 抓取结果1

我们可以看到返回了未终止字符串错误,这意味着在查询的代码中多了一个引号导致原先的引号未闭合,那么我们要是把原先后面的引号注释掉呢?

Burp Suite 抓取结果2

我们可以发现错误消失了,那么我们可以利用这一点,让服务器通过报错的形式来把密码说出来

三、构造报错语句

3.1 理解CAST()函数并构造错误

为了让密码出现在报错中,这里我们使用了 CAST(x AS y) 函数,作用是把 x 转换为 y 数据类型。我们的想法是把用户名字符串转换为整型(INT);由于该转换在数值上下文不合法,会触发服务器报错,从而泄露内容。

这里我们还是使用AND来将原语句与我们构造的语句连接起来,但是由于AND是一个逻辑运算符,所以他的左右两边都要求是布尔表达式,所以这里我们要在前面加一个1 =

这样我们就构造出了如下语句:

' AND 1 = CAST((SELECT username FROM users) AS INT) -- 

我们来运行一下看看结果:

Burp Suite抓取结果3

这里我们看到服务器还是返回了未终止字符串错误,但是不对啊,我们并没有引入更多的引号啊。

3.2 分析错误形成原因并修正

不要急,我们仔细来看一下报错,我们可以发现我们构造的语句在users)A处就强行截断了,那么说明我们的语句是没有错误的,只是字符达到服务器的上限导致强行截断了

那么我们把他前面TrackingId的值给他全部删掉,反正我们现在也用不到他了:

Burp Suite 抓取结果4

再次send之后,还是返回了报错,但是这次的报错不一样了,他这里说表达式使用的子查询返回了超过一行的数据,说明我们这里的查询本身可以容纳一行的数据,但是服务器返回的数据超过了这个值

此时在子查询后加上 LIMIT 1 可以强制只返回第一条记录,再发送请求试试:

Burp Suite抓取结果5

可以看到我们成功通过服务器的报错取出了 users 表中 username 列的第一条记录: administrator。

3.3 改进语句获取密码

既然我们已经成功获取了用户名并确认 administrator 为第一行,那么我们可以把子查询改为 password 字段,让服务器通过类型转换错误把密码显示出来:

' AND 1 = CAST((SELECT password FROM users LIMIT 1) AS INT) -- 

Burp Suite抓取结果6

我们可以看到,服务器通过报错返回了我们需要的密码:j1pxktuj08fg5upgq1bj

四、登陆验证结果

现在我们将获得的密码用于登录页面进行验证:

LAB解决

登录成功,LAB12 解决。

五、总结与防御建议


总结:

  • 本题演示了如何利用可视化错误(错误信息或异常)将数据库字段通过报错暴露:通过将查询结果强制转换为不兼容类型(如字符串强制转换为整数)来触发类型错误,从而在错误消息或响应中泄露数据。
  • 关键步骤包括:先定位能触发错误的注入点,使用子查询与行限制(如 LIMIT 1)确保单行返回,然后对目标字段施加强制类型转换以触发报错并读取返回内容。

防御建议:

  • 不要在生产环境中将详细的数据库错误信息直接暴露给客户端。对外返回通用错误提示,并在服务端记录详细日志供审计与告警使用。
  • 使用参数化查询或预编译语句(prepared statements),避免将 cookie、URL、表单等外部数据直接拼接到 SQL 中。
  • 对输入进行严格的白名单校验与长度限制,尤其是在将值传递给数据库之前做类型与范围检查。
  • 数据库账号遵循最小权限原则,应用仅使用具备必要权限的账户访问数据。
  • 对敏感数据(如密码)使用强哈希并加盐存储(推荐 bcrypt、scrypt、Argon2),避免明文或可逆加密。
  • 对异常请求与探测行为实施速率限制、封禁与告警,结合日志和监控及时发现注入尝试。
  • 部署 WAF、输入校验库或安全中间件作为额外防线,并定期进行安全测试与代码审计。
  • 对会话与 cookie 使用安全属性(HttpOnly、Secure、SameSite),并避免将未经校验的 cookie 值直接用于后端查询。

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


文章来源:https://www.cnblogs.com/CH3CH2OH-Blog/p/20455098
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云