0x00【概述】
SSRF(Server-Side Request Forgery):服务器端请求伪造,是一种由攻击者构造形成由服务器发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
成因:大都是由于服务器端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。比如从指定的URL地址获取网页文本内容,加载指定的地址的图片,下载等。
0x01【SSRF的利用方式】
1、可以对外网、服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息
大多数社交网站都提供了通过用户指定的url上传图片的功能。如果用户输入的url是无效的。大部分的web应用都会返回错误信息。攻击者可以输入一些不常见的但是有效的URI,比如:
http
:
//example.com:8080/dir/images/
http
:
//example.com:22/dir/public/image.jpg
http
:
//example.com:3306/dir/images/
根据服务器的返回信息来判断端口的开放情况。大部分的应用并不会去判断端口,只要是有效的URl,就会发出请求。而大部分的TCP服务在简历socket连接的时候就会发送banner信息(ASCII编码),能够作为原始的html的数据显示。
正常情况下,请求http://www.*********.com/robots.txt 返回的结果如下:
请求非http服务的端口,会返回banner信息:
请求关闭的端口会报错。
当然,对于大多数的应用,一般不会直接返回banner信息,可以通过报出的错误信息、响应时间、响应包大小来判断。
2、攻击运行在内网或者本地的应用乘程序(比如溢出)
3、对内网web应用进行指纹识别,通过访问默认文件实现
识别内网应用使用的框架,平台,模块以及cms可以为后续的攻击提供很多帮助。大多数web应用框架都有一些独特的文件和目录。通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。比如可以通过访问下列文件来判断phpMyAdmin是否安装:
Request: http://127.0.0.1:8080/phpMyAdmin/themes/original/img/b_tblimport.png
Request: http://127.0.0.1:8081/wp-content/themes/default/images/audio.jpg
Request: http://127.0.0.1:8082/profiles/minimal/translations/README.txt
4、攻击内网的web应用,主要是使用get参数就可以实现的攻击(strust2,sqli等)
5、利用file协议读取本地文件等
Request
:
file
:
///C:/Windows/win.ini
0x02【SSRF漏洞的寻找】
PHP相关函数:
- file_get_content()
- curl - curl_exec()
- socket - fsockopen()
一、从web功能上寻找
1、分享:通过URL地址分享网页内容
2、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3、在线翻译:通过URL地址翻译对应文本的内容
4、图片加载与下载:通过URL地址加载或下载图片
5、图片、文章收藏功能
二、从URL关键字中寻找
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
.....
0x03【SSRF漏洞的验证】
一、基本判断(排除法)
排除法一:
你可以直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞
排除法二:
使用burpsuit等抓包工具来判断是否不是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,是由服务端发起的,所有,在我们本地浏览器的请求中就不应该存在图片的请求,在此例子中,如果刷新当前页面,有如下请求,则可以判断不是SSRF。(前提是burpsuit截断图片的请求,默认是放行的)
用排除法的原因:
http://read.*******.com/image?imageUrl=http://www.baidu.com/img/bd_logo1.png
现在大多数修复SSRF的方法基本都是区分内外网来做限制(暂不考虑利用此问题来发起请求,攻击其他网站,从而隐藏攻击者IP,防止此问题就要做请求的地址的白名单了),如果我们请求 :
http:
//read.******.com/image?imageUrl=http://10.10.10.1/favicon.ico
而没有内容显示,我们是判断这个点不存在SSRF漏洞,还是http://10.10.10.1/favicon.ico这个地址被过滤了,还是http://10.10.10.1/favicon.ico这个地址的图片文件不存在,如果我们事先不知道http://10.10.10.1/favicon.ico这个地址的文件是否存在的时候是判断不出来是哪个原因的,所以我们采用排除法。
二、验证是否可以探测内网
经过简单的排除验证之后,我们就要验证看看此URL是否可以来请求对应的内网地址。在此例子中,首先我们要获取内网存在HTTP服务且存在favicon.ico文件的地址,才能验证是否是SSRF漏洞。
找存在HTTP服务的内网地址:
1、从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
2、通过二级域名暴力猜解工具模糊猜测内网地址
0x04【SSRF漏洞中URL地址的
过滤绕过
】
2、ip地址转换成进制
- 115.239.210.26 = 16373751032
3、使用短地址来生成内网地址
- http://10.10.116.11
- http://t.cn/RwbLKDx
4、端口绕过
5、xip.io
- 将foo.bar.10.0.0.1.xip.io resolves to 10.0.0.1这样的域名格式翻译成10.0.0.1
- mysite.10.0.0.1.xip.io 10.0.0.1
6、通过js跳转
0x05【如何防御】
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
参考链接:
http://www.freebuf.com/articles/web/20407.html
https://sobug.com/article/detail/11