0x00 思考

1、什么是SSRF漏洞?
2、SSRF漏洞的利用方式
3、SSRF漏洞绕过
4、SSRF漏洞加固

0x01 什么是SSRF漏洞

定义:
SSRF漏洞,中文全称为服务端请求伪造漏洞,是一种由攻击者构造一定的利用代码导致服务端发起漏洞利用请求的安全漏洞。一般情况下,SSRF攻击的应用是无法通过外网访问的,所以需要借助目标服务端进行发起,目标服务器可以链接内网和外网,攻击者便可以通过目标主机攻击内网应用。

漏洞成因:
由于业务需要,服务端程序需要从其他服务器应用中获取数据,例如获取图片、数据等,但是由于服务器没有对其请求的目标地址做过滤和限制,导致黑客可以利用此缺陷请求任意服务器资源,其中就包含隐匿在内网的应用。很多企业认为服务器在内网不会受到黑客攻击,便放任漏洞不管,不做补丁修复和版本升级,弱口令遍布内网。但是在SSRF漏洞面前这些漏洞都会成为黑客的“盘中餐”。
SSRF漏洞一般为HTTP/HTTPS方式出现,但类似TCP Connect方式也可以探测内网的IP活跃状态和端口的开放情况,但此类危害较小。

SSRF漏洞出现的位置:
服务器主动发起网络请求,例如HTTP/HTTPS/Socket
分享功能,通过URL分享网页内容,微博SSRF
图片加载、下载功能
邮件系统
api远程调用
只要是服务器可以主动发起网络请求便可能出现

SSRF漏洞的危害:
1. 对目标服务器所在的内网进行IP存活性扫描和端口扫描
2. 利用扫描的指纹信息判断开放的服务,从而对内网的主机进行攻击
3. 识别内网WEB应用指纹,判断应用类型进行攻击
4. 使用特定协议攻击应用(gopher、dict、file、FTP/SFTP等)

0x02 SSRF漏洞的利用方式

产生漏洞的函数
(1)file_get_contents()
(2)fsockopen()
(3)curl_exec()

file_get_contents函数:

 1 <?php
2 if(isset($_POST['url']))
3 {
4 $content=file_get_contents($_POST['url']);
5 $filename='./images/'.rand().'.img';\
6 file_put_contents($filename,$content);
7 echo $_POST['url'];
8 $img="<img src=\"".$filename."\"/>";
9 }
10 echo $img;
11 ?>

以上代码是获取post参数url中的值地址,通过file_get_contents获取url中的图片内容,保存到image目录下,然后显示。
file_get_contents函数使用前需要将php.ini的allow_url_fopen设置为ON。
以上的漏洞代码是存在SSRF漏洞的,可以控制url参数,自定义任意的URL,包括内网的URL,例如现在验证内网192.168.0.118是否开启了6379端口,可以做以下访问

根据上图的报错信息可以看出开启了6379,接下来测试是否开启了8888端口

测试8888端口时,根据上图提示,显示错误信息,说明端口未开放。接下来测试80端口,看显示结果(因为109的80端口是开放的,所以测试下,看回显内容)

访问109的80端口并未报错,此时,查看图片内容(选中图片,点复制链接),如下图:

发现请求的80端口的数据被写入到了图片问题中,符合代码预期。除了可以探测端口,也可以做文件包含漏洞的利用,这里不再细说文件包含的知识。

fsockopen函数:

<?php
$host=$_GET['url'];
$port=$_GET['port'];
# fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host, intval($port), $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() 函数将内容写入一个打开的文件中。
fwrite($fp, $out);
# 函数检测是否已到达文件末尾 ,文件末尾(EOF)
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

以上函数是接受url和port来制定socket访问的地址和端口,由于地址和端口用户可控,所以可以用来SSRF漏洞的利用。
例如可以做以下访问可以探测104的3306端口是否开放:

curl_exec函数

1 <?php
2 $url = $_GET['url'];
3 $curlobj = curl_init($url);
4 echo curl_exec($curlobj);
5 ?>

curl_exec函数是危害最大的函数,也是需要重点讲的函数。以上代码是获取参数url的值,使用curl进行访问。
curl_exec的使用需要3个条件:
1、PHP版本>=5.3
2、开启extension=php_curl.dll
3、--wite-curlwrappers(编译PHP时用,此时不需要,可忽略)
使用dict协议探测22端口(后面会讲dict协议)

0x03 SSRF绕过方式

在SSRF漏洞利用时,经常被pass,接下来讲一下常规的绕过方法。
(1)攻击本机
  http://127.0.0.1:80
  http://localhost:22
(2)利用@绕过
  http://example.com@127.0.0.1
  # 这里的example.com可以任意替换,
(3)利用短地址绕过
  http://127.0.0.1可以变为http://suo.im/5UHEvD
  # 转换地址you很多,可以采用http://tool.chinaz.com/tools/dwz.aspx
(4)特殊域名绕过
  http://127.0.0.1.xip.io/
  http://www.margin.com.127.0.0.1.xip.io/
(5)利用Enclosed alphanumerics
  利用Enclosed alphanumerics
  ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
  List:
  ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
  ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
  ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
  ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
  Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
  ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
  ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
  ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
(6)利用句号代替点绕过
  127.0.0.1 变为127。0。0。1
(7)使用其他进制绕过,例如127.0.0.1
  1、8进制格式:0177.0.0.1
  2、16进制格式:0x7F.0.0.1
  3、10进制整数格式:2130706433(转16进制,在转10进制)
  4、16进制整数格式:0x7F000001
  5、还有一种特殊的省略模式,例如127.0.0.1这个IP可以写成127.1
(8)特殊域名绕过(DNS解析)
  http://127.0.0.1.xip.io/
  # 会解析道本地的127.0.0.1

0x04 SSRF漏洞加固

1. 禁止302跳转,或者没跳转一次都进行校验目的地址是否为内网地址或合法地址。
2. 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
3. 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
4. 设置URL白名单或者限制内网IP
5. 限制请求的端口为http的常用端口,或者根据业务需要治开放远程调用服务的端口
6. catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务

SSRF服务器端请求伪造漏洞基础的更多相关文章

  1. SSRF服务器端请求伪造

    SSRF漏洞原理 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由恶意访问者构造形成由服务端发起请求的一个安全漏洞一般情况下,SSRF访问的目标是从外网无法 ...

  2. 5.SSRF服务器端请求伪造

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

  3. SSRF(服务端请求伪造)漏洞

    目录 SSRF SSRF漏洞的挖掘 SSRF漏洞利用 SSRF漏洞防御 SSRF SSRF(Server-Side Request Forgery,服务器端请求伪造)漏洞,是一种由攻击者构造请求,由服 ...

  4. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  5. Pikachu-SSRF(服务器端请求伪造)

    SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制 导致攻击者可 ...

  6. WordPress Cart66 Lite插件跨站请求伪造漏洞

    漏洞名称: WordPress Cart66 Lite插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201310-524 发布时间: 2013-10-23 更新时间: 2013-10-23 危害 ...

  7. WordPress Ultimate Auction插件跨站请求伪造漏洞

    漏洞名称: WordPress Ultimate Auction插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201306-396 发布时间: 2013-09-11 更新时间: 2013-09- ...

  8. WordPress Event Easy Calendar插件多个跨站请求伪造漏洞

    漏洞名称: WordPress Event Easy Calendar插件多个跨站请求伪造漏洞 CNNVD编号: CNNVD-201309-083 发布时间: 2013-09-11 更新时间: 201 ...

  9. WordPress HMS Testimonials 多个跨站脚本漏洞和跨站请求伪造漏洞

    漏洞名称: WordPress HMS Testimonials 多个跨站脚本漏洞和跨站请求伪造漏洞 CNNVD编号: CNNVD-201308-199 发布时间: 2013-08-22 更新时间: ...

随机推荐

  1. Python 如何管理类的创建行为

    问题 如果我们要给类加上一个属性,只需在定义的时候加上属性就可以了: class Animal: can_fly = True 如果这样的类有很多,我们可以定义一个父类,让其它类继承他就可以了: cl ...

  2. [BUUCTF]REVERSE——[BJDCTF2020]easy

    [BJDCTF2020]easy 附件 例行检查,无壳,32位程序 32位ida载入,main函数和字符串理都没有找到有关flag的提示 根据main函数的提示,有关flag的函数应该被藏起来了,在左 ...

  3. TPT Fusion平台升级,AUTOSAR及ViL测试功能重装上线

    TPT简介 TPT是针对嵌入式系统基于模型的测试工具,特别是针对控制系统的软件功能测试.TPT支持众多业内主流的工具平台和测试环境,可以完成V模式要求所有阶段(MiL-SiL-PiL-HiL-ViL) ...

  4. CF135A Replacement 题解

    Content 有 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),试用 \(1\) ~ \(10^9\) 之间的数(除了本身)代替其中的一个数,使得这 \(n\) 个数的总和最小, ...

  5. shell判断新字符串列表是否在老字符串列表中

    for sn in `cat 12.30-new`;do if ! [[ `cat 12.30-old` =~ $sn ]];then echo $sn; fi; done

  6. Shell之awk常用用法

  7. mysql联合查询更新数据库例子

    mysql联合查询更新数据库例子,用户表,部门表,把用户表中的部门属性更新为部门表的主键UPDATE user_table AS utINNER JOIN belongdept AS bd ON bd ...

  8. std::function介绍 -转载

    类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通函数.Lambda表达式.函数指 ...

  9. windows下php安装redis扩展

    查看当前PHP版本 代码中添加 phpinfo(); 下载对应的redis扩展 下载链接:https://pecl.php.net/package/redis 因为我的PHP版本是5.6的,所以red ...

  10. git修改账号密码

    查看当前用户名和邮箱 git config user.name git config user.email 修改 git config --global user.name "新用户名&qu ...