suctf2019-Upload-Labs-2
suctf2019 的题目
buuoj上的环境:https://buuoj.cn/challenges#[SUCTF%202019]Upload%20Labs%202
源码下载:https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload%20Labs%202
首先是一个文件上传,有三点限制
- 后缀只能是gif,jpeg,jpg,png
- 检查了MIME类型,抓包改下即可
- 文件内容不能出现<?,但是限制的很不严谨用< ?就可以绕过
1
2
3
4
5
6function check(){
$data = file_get_contents($this->file_name);
if (mb_strpos($data, "<?") !== FALSE) {
die("<? in contents!");
}
}
然后有一个查看上传文件类型的功能
1 | if (isset($_POST["submit"]) && isset($_POST["url"])) { |
跟进到File类和getMIME()看看
1 |
|
这里注意两个点后面会用到:
- File类被实例化
- 调用了finfo_file函数
先去看看admin.php
1 | include 'config.php'; |
这里需要一个ssrf,然后提交一些参数就可以在公网服务器上收到flag
那么如何才能有ssrf呢?回到刚才的finfo_file上,看一看这个函数的c源码
1 | case FILEINFO_MODE_FILE: |
其中调用了php_stream_locate_url_wrapper这个函数
在https://blog.zsxsoft.com/post/38 中讲了,使用了php_stream_locate_url_wrapper的php函数,都会存在phar反序列化的问题
phar反序列化如何触发一个ssrf呢,这里可以利用到SoapClient的CRLF注入漏洞(https://skysec.top/2018/08/17/SOAP%E5%8F%8A%E7%9B%B8%E5%85%B3%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6/#SOAP%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E4%B9%8BCRLF%E4%B8%8ESSRF%EF%BC%88%E4%BA%8C%EF%BC%89)
正好File类被实例化了,也就是说我们可以给File类写一个__construct方法然后用phar反序列化去执行它
但这还有一个问题,那就是前面对协议的过滤
1 | if(preg_match('/^(ftp|zlib|data|glob|phar|ssh2|compress.bzip2|compress.zlib|rar|ogg|expect)(.|\\s)*|(.|\\s)*(file|data|\.\.)(.|\\s)*/i',$_POST['url'])){ |
url的开头不能以phar开头,但可以用php伪协议绕过
1 | php://filter/resource=phar:// |
最后附上官方的poc
1 |
|