SSRF学习

SSRF

什么SSRF( 服务器端请求伪造——SSRF:Server-Side Request Forgery ), 攻击者诱导服务器将 HTTP 请求发送到攻击者选择的一个目标上。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

 

成因:

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

容易出现SSRF的地方

1、转码服务 2、在线翻译

3、分享 通过url 地址分享文章,例如如下地址: http://share.xxx.com/index.php?url=http://127.0.0.1 通过url参数的获取来实现点击链接的时候跳到指定的分享文章。如果在此功能中没有对目标地址的范围做过滤与限制则就存在着SSRF漏洞。

4、图片加载与下载(通过URL地址加载或下载图片) 通过URL地址加载或下载图片,例如如下地址: http://image.xxx.com/image.php?image=http://127.0.0.1 图片加载存在于很多的编辑器中,编辑器上传图片处,有的是加载远程图片到服务器内。还有一些采用了加载远程图片的形式,本地文章加载了设定好的远程图片服务器上的图片地址,如果没对加载的参数做限制可能造成SSRF。

5、图片、文章收藏功能 http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de 例如title参数是文章的标题地址,代表了一个文章的地址链接,请求后返回文章是否保存,收藏的返回信息。如果保存,收藏功能采用了此种形式保存文章,则在没有限制参数的形式下可能存在SSRF。

6、网站采集、网页抓取的地方

7、头像的地方。(远程加载头像)

8、一切要你输入网址的地方和可以输入ip的地方。

9、从URL关键字中寻找:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain………

 

攻击

可以利用SSRF漏洞进行以下攻击: (1)通过服务器获取内网主机、端口和banner信息。 (2)对内网的应用程序进行攻击,例如Redis、JBoss等。 (3)利用file: //伪协议读取文件。 (4)可以攻击内网程序,造成缓冲区溢出。

 

1.端口探测

url参数没有经过严格过滤,因此攻击者可以构造任意的url以利用SSRF如我们可以通过http://127.0.0.1:3306来探测此服务器是否开启3306端口。若返回了数据库版本信息就是开启了3306端口,如果没有返回而且延迟大,则没有开启这个端口

2.内网的攻击

信息探测:利用SSRF漏洞可以进行端口信息探测的方法,通过内网扫描发现内网的一台主机开启了JBoss的服务(.....?url=http://file:///etc/passwd)

尝试访问jmx控制台的语句(........?url=http://192.168.91.108:8080/jim-console/)

3.部署木马

通过jboss.deployment接口部署Web木马应用,通过本地搭建的测试环境抓包,构造playload,然后通过SSRF发送playload攻击内网应用

4.获得Webshell

利用SSRF漏洞发起playload攻击

5.执行命令

利用上传木马文件可以正常执行命令

 

 

 1 function get($url)
 2 {
 3     $ch = curl_init();
 4  5     curl_setopt($ch, CURLOPT_URL, $url);
 6     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 7     $output = curl_exec($ch);
 8     $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 9     if($httpCode == 404) {
10         return 404;
11     }
12     curl_close($ch);
13 14     return $output;
15 }

 

这段函数存在SSRF漏洞

 

解题方法:

  file://协议

  http://协议

 

函数:

parse_url:  这个函数是用来创建一个数组用来存放url的。

  比如说:Array['scheme']表示协议头是什么

 

CTFSHOWweb351

解法1:

  直接POST payload:url=127.0.0.1/flag.php

  如果直接在地址栏后面加个flag.php就会出现因为不是本地用户所以无法访问。

 

解法2:

  payload:

  url=file:///var/www/html/flag.php

 

CTFSHOWweb352

 解法:

  payload:url=127.0.1

  或者127.1都可以,自动会补全0

  也可以采用八进制或者16进制去绕过

  

 

posted @ 2022-04-24 19:25  FPointmaple  阅读(197)  评论(0编辑  收藏  举报