suctf2019-Upload-Labs-2
suctf2019 的题目
buuoj上的环境:https://buuoj.cn/challenges#[SUCTF 2019]Upload Labs 2
源码下载:https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload Labs 2
首先是一个文件上传,有三点限制
- 后缀只能是gif,jpeg,jpg,png
- 检查了MIME类型,抓包改下即可
- 文件内容不能出现<?,但是限制的很不严谨
1 | function check(){ |
用< ?就可以绕过
然后有一个查看上传文件类型的功能
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及相关漏洞研究/#SOAP漏洞利用之CRLF与SSRF(二))
正好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 |
|