目录
记录学习记录成长
SSRF (Server-Side Request Forgery,服务器端请求伪造)
与CSRF所不同的是SSRF主攻的是内网的探测,
准确地说是,对后端服务器同一个网络的其他服务器进行相关的扫描、探测,获取更多的资源,然后更进一步的进行攻击。
通常发生在攻击者可能受限于防火墙不能直接攻击到目标服务器,便伪造一个服务端请求,借由此为跳板攻击目标服务器。比如从指定 URL 地址获取网页文本内容,加载指定地址的图片,下载等等。
图示:
直接上案例
1、pikachu靶场curl函数使用不当(没有给参数添加过滤)
从url这个参数可知向服务器请求了资源
我们判断有没有ssrf漏洞,就用参数 http://baidu.com/robots.txt 来测试
说明确实是存在
接着我们可以把url中的内容改成内网的其他服务器上地址和端口,探测内网信息,比如端口开放情况
结合bp对端口进行爆破查询,直接查出到底有哪些端口开放
很快就发现80等一系列端口长度不一样
如果是一般云服务器那么查看etc/password的话就很有可能有重大发现
SSRF成因
很多网站提供了从其他的服务器上获取数据的功能。通过指定的URL,网站可以从其他地方获取图片、下载文件、读取文件内容等。SSRF的实质就是利用存在缺陷的Web站点作为代理攻击远程和本地的服务器。
SSRF漏洞形成的原因大都是由于服务端提供了从其他服务器获取数据的功能但没有对目标地址做过滤与限制。
危险函数
file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。
readfile():输出一个文件的内容。
fsockopen():打开一个网络连接或者一个Unix 套接字连接。
curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。
fopen():打开一个文件文件或者 URL。
危险协议
file协议
主要用于读取服务器本地文件,访问本地的静态资源
数据格式:file://文件绝对路径名
dict协议
常用来探测内网主机以及端口开放情况,既然能够探测端口,那么可以探测不同端口对应的服务的指纹信息。
数据格式:ditc://ip:port
gopher协议
gopher协议支持发出GET、POST请求
gopher协议在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务。
数据格式:gopher://ip:port/_TCP/IP数据流
问题是这一串编码是怎么形成的呢
关键点就是:
1、问号(?)需要转码为URL编码,也就是%3f
2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a
3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)
当探测内网或执行命令时需要发送 POST 请求,gopher协议可就帮了大忙了
与get不同的是,post还需要保留Content-Type和Content-Length,length对应的就是参数的总长度
绕过
1、@绕过
URL跳转如果限制了只能xxx.com进行访问,
http://www.baidu.com@10.10.10.10
与http://10.10.10.10的请求是相同的
2、ip地址格式转换
127.0.0.1
0177.0.0.1 //八进制
0x7f.0.0.1 //十六进制
2130706433 //十进制
3、点用句号代替
www.baidu.com=www。baidu。com
4、利用短网址
网上有很多短网址转换工具
防护
1、禁止跳转
2、禁用除http和https外的协议,如:file://
、gopher://
、dict://
等。
3、限制请求的端口为http常用的端口,如 80、443、8080。
4、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。
5、对请求地址设置白名单或者限制内网IP,以防止对内网进行攻击。
6、URL特征参数进行检测和过滤
学到这只是了解,搞懂还是需要大量的练习
之后也会分享很多小记录
喜欢请关注1