SSRF简介
SSRF是服务器端请求伪造
危害:
1.可以对服务器所在内网、本地进行端口扫描,获取一些服务的信息等
2.目标网站本地敏感数据的读取
3.内外网主机应用程序漏洞的利用
4.内外网web站点漏洞的利用
ssrf常用的相关协议:
gopher://: 发送GET或POST请求;攻击内网应用
dict://: 泄露安全软件版本信息,查看端口,操作内网远程访问等
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址,探测内网主机存活、端口开发情况
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
ssrf防御
5个思路
- 过滤返回信息,验证远程服务器对请求的响应,是比较容易的方法。如果web应用获取某种类型的文件,那么可以在把返回结果展示给用户之前先验证返回信息是否符合标准。
- 统一错误信息,避免用户根据错误信息来判断远程服务器端口状态。
- 限制请求的端口为http常用端口,比如80、443、8080、8090
- 黑名单内网IP,避免应用被用来获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file://、ftp://等引起的问题。
ssrf绕过技巧
- 利用@符号 http://demo.com@127.0.0.1
- 添加端口号 http://127.0.0.1:8080
- 利用短地址 http://dwz.cn/11S
- 利用特殊域名 xi.io
- 利用封闭式字母数字 ⓔ ⓧⓐ ⓜⓟ ⓛⓔ .ⓒ ⓞⓜ >>> example.com
清单:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20)
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
(a) (b) (c) (d) (e) (f) (g) (h) (i) (j) (k) (l) (m) (n) (o) (p) (q) (r) (s) (t) (u) (v) (w) (x) (y)
(z) Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ ℗ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ
Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ
ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓿
- 利用句号 http://127。0。0。1
- 利用进制转换 http://2130706433/ 2130706433=127.0.0.1
- 利用302跳转
实验环境
php:7.3.4nts
apache:2.4.39
浏览器:谷歌
实验步骤
ssrf(curl)
打开ssrf(curl)
点击文字,跳转404页面,从反馈信息来看是找不到对应的页面。
查看源码,发现有个RD变量影响路径,而RD变量的赋值代码如下
$RD = explode('/',$FILEDIR)[1];//用print($RD) 输出的结果vul
手动调整url为:http://pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu//vul/ssrf/ssrf_info/info1.php
发现修改url=后面的路径,可以实现未授权访问
访问根目录下的php,可以访问成功。里面多出一个1。
查看源码,发现echo $RES, 此代码是输出curl_exec的执行结果值。
注释掉该代码。
ssrf(file_get_content)
同上,此关卡使用了file伪协议。