作者:小刚
一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢
本实验仅用于信息防御教学,切勿用于其它用途
SSRF漏洞
SSRF
SSRF服务器端请求伪造,
全英文Service_side Request Forgery 一般人也记不住
主要利用漏洞来伪造成服务器端发起请求,比如绕过防火墙,进行内网探测,能够突破客户端获取不到的数据限制。
换个意思就是我借用你家人的身份,可以名正言顺的教育你一顿。
产生原因
能产生这漏洞的原因基本上是,各公司只防御外网的请求,对于内网的请求没有进行防御,当我们发现有个漏洞可以发送请求,便可以利用他发送内网请求,从而攻击成功。(基本也是,生活中谁会防自己人,正所谓家贼难防,防不住我们就伪造成那个家贼。)
利用方式
1.能扫描内部网络,获取端口,服务信息。
2.攻击运行在内网或本地的应用程序。
3.对内网web进行指纹识别
4.对内部主机和端口发送请求包进行攻击
5.file协议读取本地文件
小案例
<?PHP
$URL = $_GET['URL'];
$CH = CURL_INIT();
CURL_SETOPT($CH,CURLOPT_URL, $URL);
CURL_SETOPT($CH,CURLOPT_HEADER,FALSE);
CURL_SETOPT($CH,CURLOPT_RETURNTRANSFER,TRUE);
CURL_SETOPT($CH,CURLOPT_SSL_VERIFYPEER,FALSE);
CURL_SETOPT($CH,CURLOPT_FOLLOWLOCATION,TRUE);
$RES = CURL_EXEC($CH);
CURL_CLOSE($CH);
ECHO $RES;
?>
1.请求内网资源
能够发起外网请求的地方基本都有ssrf漏洞
通过接口请求受保护的内网资源
http://127.0.0.1/h/SSRF/index.php?URL=http://127.0.0.1
利用一个可以发起网络请求的服务,当做跳板来攻击其他服务器
可以利用burp等fuzz工具来枚举内网存在的主机ip,从而进一步利用。
2.端口扫描
ssrf支持很多种 协议dict:// file:// gopher:// ftp:// http:// sftp:// ldap://
dict://是php的一个伪协议,
可以用来查看端口,操作内网服务
http://127.0.0.1/h/SSRF/?URL=dict://127.0.0.1:80
http://127.0.0.1/h/SSRF/?URL=dict://127.0.0.1:3306
当端口关闭时回显一般为空白
再次利用fuzz工具,测试端口号,从而找出内网IP都开放了哪些服务。
3.读取源文件
file://协议是php的另一种伪协议。可以用来读取本地文件或者源代码
http://127.0.0.1/h/SSRF/?URL=file://c:\windows\win.ini
http://127.0.0.1/h/SSRF/?URL=file://D:\phpStudy\PHPTutorial\WWW\h\SSRF\index.php
再次利用fuzz工具,配合fuzz字典来读取配置,源码等敏感信息。
(如果报错返回绝对地址更再好不过了)
4.Gopher://协议进行扩展攻击
5.漏洞组合利用
ssrf漏洞可以配合CSRF漏洞进行请求
SSRF和redis漏洞进行webshell的写入
挖掘技巧
1.传参方面
能够对外网发起网络请求的地方,就可能存在
当看到url中有传参u,url,src,source,sourceURL,imageURL,link,target,share,wap,display,domain等可以测试一下
2.web服务方面
从远程服务器请求资源,下载图片
数据库内置功能
文件处理,
编码处理,转码服务
属性信息处理
在线翻译
未公开的api接口,能够调用URL等
3.审计方面
重点查找文件操作的函数
curl_exec()使用curl发生请求获取数据
file_get_contents 把整个文件读入一个字符串中
file_put_contents()
fopen()打开文件函数
fget()
fsockopen()函数实现获取用制定的url数据
防御措施
服务端开启鉴权信息
开启内部访问也需要身份认证
同时设置URL白名单或者限制内网IP传参
过滤返回的信息
禁用其他伪协议,但允许http,https
伪协议的利用需要php.ini文件的allow_url_fopen和allow_url_include来控制
也可以利用正则化,判断伪协议的请求信息
但只允许http(s)协议也会被@符号构造的url进行绕过
重点关照一下小伙伴
file_get_contents()
fsockopen()
curl_exec()