SSRF简介
SSRF,Server-Side Request Forgery,服务端请求伪造,是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。
漏洞形成的原因大多是因为服务端提供了从其他服务器应用获取数据的功能且没有对目标地址作过滤和限制。(也就是当前网页对其他服务器的资源进行请求,并未检测目标服务器的地址,可以随意篡改)
攻击者可以利用 SSRF 实现的攻击:
1. 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的 banner 信息
2. 对内网 WEB 应用进行指纹识别,通过访问默认文件实现
3. 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击
4. 利用 file 协议读取本地文件等
SSRF漏洞出现场景
能够对外发起网络请求的地方,就可能存在 SSRF
漏洞从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)
数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
Webmail 收取其他邮箱邮件(POP3、IMAP、SMTP)
文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)
常见后端代码实现
<?php
if (isset($_POST['url'])) { //存在url则进入代码块
$content = file_get_contents($_POST['url']); //获得url的内容,保存为字符串
$filename ='./images/'.rand().';img1.jpg'; //文件名
file_put_contents($filename, $content); //把字符串写入文件
echo $_POST['url'];
$img = "<img src=\"".$filename."\"/>";
}
echo $img;
?>
上述代码从指定url获取图片,取随机名字储存,回显给用户
可能遇到的限制
- 限制请求的端口为 http 常用的端口,比如,80,443,8080等。
- 禁用不需要的协议。仅仅允许 http 和 https 请求。
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
协议的利用
Dict 协议
dict://fuzz.wuyun.org:8080/helo:dict
Gopher 协议
gopher://fuzz.wuyun.org:8080/gopher
File 协议
file:///etc/passwd
绕过姿势
- 对ip转码:转换为8进制或16进制等
- 存在url解析问题:
例如
加@符号
http://www.baidu.com@192.168.0.1/与http://192.168.0.1请求的都是192.168.0.1的内容 - 使用句号:127。0。0。1等价127.0.0.1
实际场景
上图imgurl处,修改url可以正常请求。
箭头所指image处
测试方法
可以使用ceye平台
具体怎么用自行百度或者google