20210425SSRF漏洞复习梳理基础(基础篇转自知乎)

SSRF服务器端请求伪造漏洞基础

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

0x01 什么是SSRF漏洞

定义
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漏洞的利用方式

产生漏洞的函数

  • file_get_contents()
  • fsockopen()
  • curl_exec()

file_get_contents函数

<?php
if(isset($_POST['url']))
{
    $content=file_get_contents($_POST['url']);
    $filename='./images/'.rand().'.img';\
    file_put_contents($filename,$content);
    echo $_POST['url'];
    $img="<img src=\"".$filename."\"/>";
}
echo $img;
?>

以上代码是获取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端口,可以做以下访问

SSRF漏洞探测端口


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

SSRF漏洞探测端口


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

SSRF漏洞探测端口


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

SSRF漏洞探测端口


发现请求的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漏洞的利用。
例如可以做以下访问可以探测119的3306端口是否开放:


做以下访问可以探测109的3306是否开放:


未出现错误信息说明端口开放

curl_exec函数

<?php
$url = $_GET['url'];
$curlobj = curl_init($url);
echo curl_exec($curlobj);
?>

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


使用dict协议探测6379端口


可以根据回显的banner信息判断目标端口运行的服务为ssh和redis服务,dict协议还可以做到执行命令的功能,本文不再讲解。

0x03 SSRF绕过方式

在SSRF漏洞利用时,经常被pass,接下来讲一下常规的绕过方法。

  • 攻击本机
http://127.0.0.1:80
http://localhost:22
  • 利用@绕过
http://example.com@127.0.0.1
# 这里的example.com可以任意替换,
  • 利用短地址绕过
http://127.0.0.1可以变为http://suo.im/5UHEvD
# 转换地址you很多,可以采用http://tool.chinaz.com/tools/dwz.aspx
  • 特殊域名绕过
http://127.0.0.1.xip.io/
http://www.margin.com.127.0.0.1.xip.io/
  • 利用Enclosed alphanumerics
利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
  • 利用句号代替点绕过
127.0.0.1 变为127。0。0。1
  • 使用其他进制绕过,例如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
  • 特殊域名绕过(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错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值