SSRF小结

概述

SSRF(服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

原因
由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

漏洞出现点

  1. 分享(通过URL地址分享网页内容)
  2. 转码服务
  3. 在线翻译
  4. 网络抓取
  5. 邮件系统
  6. 图片加载与下载(通过URL地址加载或下载图片)
  7. 未公开的api实现以及其他调用URL的功能
  8. 从URL关键字中寻找:share,wap,url,link,src,target,image,source…

危害

  1. 内外网的端口和服务扫描
  2. 主机本地敏感数据的读取
  3. 内外网主机应用程序漏洞的利用
  4. 内外网Web站点漏洞的利用

漏洞产生

file_get_contents()fsockopen()curl_exec()三个函数使用不当时将会造成ssrf

下面看一个服务器中产生ssrf的代码,已附注释

<?php 
if (isset($_REQUEST['url'])) //获取url
{
    $link = $_REQUEST['url'];
    $filename = './curled/'.time().'.txt'; 
    $curlobj = curl_init($link);  //没过滤可控参数,直接初始化 cURL 会话。大忌!
$fp = fopen($filename,"w");
//设置 cURL 传输选项
    curl_setopt($curlobj, CURLOPT_FILE, $fp); //设置输出文件
    curl_setopt($curlobj, CURLOPT_HEADER, 0); //将头文件的信息作为数据流输出
    curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, TRUE); //将会根据服务器返回 HTTP 头中的 "Location: " 重定向
    curl_exec($curlobj); //执行 cURL 会话
    curl_close($curlobj); //关闭会话
    fclose($fp); //关闭文件,防止文件泄露
    $fp = fopen($filename,"r");
    $result = fread($fp, filesize($filename)); 
    fclose($fp);
    echo $result;
}else{
    echo "?url=[url]";
}
?>

以上主要函数参考:https://www.php.net/manual/zh/ref.curl.php
 

漏洞利用

1.访问正常文件

?url=http://www.xxx.com/robots.txt

2.使用dict://协议进行端口扫描(扫描内网的机器的端口)

?url=dict://ip:port

当访问未开放端口,脚本会显示空白或者报错
当访问开放端口时,脚本会显示banner 信息

3.利用file://协议读取系统本地文件
任意读取系统本地文件(先探测下服务器系统信息,方便找敏感文件路径)

?url=file:///etc/passwd

4.内网Web应用指纹识别
识别内网应用使用的框架,平台,模块以及cms可以为后续的渗透测试提供更多的信息
大多数web应用框架都有一些独特的文件和目录,通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。
比如可以通过访问下列文件来判断phpMyAdmin是否安装以及详细版本

?url=http://localhost/phpmyadmin/README

5.攻击内网应用
内网的安全通常都很薄弱,溢出、弱口令等一般都是存在的。
通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网应用或者本地机器,获得shell,这里的应用包括服务、Web 应用等。
(具体需要读者详细查阅相关资料,例:ssrf扩展攻击、ssrf拿shell等)
 

绕过

1.本地解析

http://127.0.0.1  >>>   http://localhost

2.利用[::]绕过localhost

http://[::]:80/  >>>  http://127.0.0.1

3.利用@

http://example.com@127.0.0.1   >>>  http://127.0.0.1

4.利用DNS解析

http://127.0.0.1.ceye.io/   >>>   http://127.0.0.1

5.利用短地址

http://dwz.cn/11SMa   >>>   http://127.0.0.1

6.Unicode滥用

http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ   >>>   http://example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

7.利用上传
修改"type=file"为"type=url"
比如:上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF

8.利用句号

http://127。0。0。1  >>>  http://127.0.0.1

9.利用进制转换
可以是十六进制,八进制等

http://115.239.210.26    >>>   http://16373751032

首先把这四段数字给分别转成16进制,结果:73 ef d2 1a
然后把 73efd21a 这十六进制一起转换成8进制

(记得访问的时候加0表示使用八进制)
 

防御

  1. 限制协议
    仅允许http和https请求
  2. 限制IP
    避免应用被用来获取内网数据,攻击内网
  3. 限制端口
    限制请求的端口为http常用的端口,比如,80,443,8080,8090…
  4. 过滤返回信息
    验证远程服务器对请求的响应是比较简单的方法
  5. 统一错误信息
    避免用户可以根据错误信息来判断远端服务器的端口状态
     
    GOT IT!

 
******************************************************
小实验小结,具体测试利用方式需根据具体实践场景~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章