SSRF漏洞笔记
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
成因:
SSRF 一般是由于服务端提供了从其他服务器获取数据的功能,但没对目标地址做过滤限制所致。
这里假定服务器为ServerA,它的域名是 http://www.a.com。
用户由于某些原因请求不到ServerB(URL:http://www.b.com,ServerA 为用户提供服务,用户访问 http://www.a.com?page=http://www.b.com, ServerA解析page后,去请求ServerB,之后将结果返回给用户
----------ServerA------------
url = param["page"]
result = HTTP_GET(url)
echo result
-----------------------------
这时,ServerA 就好像一个 “代理”在中转请求了。
利用:
如果没有对url进行过滤,被利用方法
1)http://www.a.com?page=http://墙外地址
如果 ServerA 在墙外,那就可以进行越墙了,作为一个梯子被利用。
2)http://www.a.com?page=http://127.0.0.1,
输入内网地址(或者locathost),可以进行内网访问或者扫描。也可以用 10.0.0.1.xip.io 这类xip .io 格式,或者www.10.0.0.1.xip.io,都等价于:10.0.0.1。
3)http://www.a.com?page=file:///etc/passwd
输入文件路径,可进行对服务器文件窥取了
寻找
浏览器可以通过确认是否存在 http://xxx?y=http://zzz 这类型地址来判断。
批量查找可能存在这漏洞的服务器,可以通过 google hack 来寻找,如 url 内包含关键字page、url、link、src、source、target、sourceURl、imageURL、domain等。
一些绕过技巧
1)黑名单绕过
如果内网ip(如127.0.) 在黑名单,可以把请求地址转为其他格式(如16进制)进行请求,如
10进制:http://2130706433/ = http://127.0.0.1
8进制:http://0300.0250.0000.0001(或 http://030052000001)= http://192.168.0.1
16进制:http://c0.a8.00.01 (或 http://0xc0a80001) = http://192.168.0.1
2)绕过白名单
如果服务只允许 http://jianshu.com 资源,可以使用http://jianshu.com:80@127.0.0.1形式来测试。
这个技巧在利用带账号密码的http请求:http://user:pwd@host。如果白名单只是简单的匹配是否http://jianshu.com开头,这个就可以被绕过了,因为http://jianshu.com:80@127.0.0.1,等价于http://127.0.0.1了(一般url都是无密码提供服务,所以账密等于无)。
修复
应使用白名单机制来过滤,允许户范围哪些资源的,或者业务上是想提供“代理”哪些资源,则这类型资源白名单化。
比如,业务上如只是想代理 简书的文章的,那么把如 http://jianshu.com 地址加入白名单,只允许白名单内的地址或者规则才允许请求。但仅仅白名单可能还不够,如果白名单不够严密的化(如上面技巧2可能被绕过),也应该做一些黑名单过滤,比如不允许出现某些字符串,比如“@”,比如“127.”,或者用正则表达式来排除某类型格式的url。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )