漏洞简析
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
产生原因
由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。
可能存在的地方
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:给网址翻译对应网页的内容
图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
……
举个栗子
1 | <? |
最常见的:
- file协议读取文件
?url=file:///D:/1.txt
- 让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
- 信息收集,让服务器去访问自己的网站,查看他的ip地址。或者探测端口。
- 利用gophergopher协议访问redis反弹shell。
…
bypass
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。如
<a href="http://www.baidu.com@127.0.0.1>
http://www.baidu.com@127.0.0.1 相当于请求http://127.0.0.1 。从而绕过一些正则,在判断到.com
时,认为访问的是之前的网站。这个的注意原因是由于url的特性,浏览器支持这样的url:http://user:password@attacker.com。当访问这样的网址时,它会把@前面的部分当作身份认证。所以可以这样进行绕过。
ip进制转换为十进制如
漏洞防护
- 限制协议为HTTP、HTTPS
- 禁止30x跳转次数
- 设置URL白名单或限制内网IP
- 限制请求的端口为http常用的端口,比如 80、443、8080、8090
gopher协议
gopher协议的格式:
1 | gopher://127.0.0.1:70/_ + 数据 //中间这个_可以时任意字符代表连接格式,不会被发送。 |
gopher协议默认端口为70,所以如果不指定端口的话它会向70端口发数据,只要后面的数据构造得当,我们就可以通过gopher协议访问redis、mysql甚至可以发送GET和POST数据。
1 | <?php |
使用gopher协议发送数据包,但是要编码。
1 | curl gopher://127.0.0.1:80/_%47%45%54%20%2f%69%6e%64%65%78%2e%70%68%70%3f%74%65%73%74%3d%31%32%33%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0d%0a%55%70%67%72%61%64%65%2d%49%6e%73%65%63%75%72%65%2d%52%65%71%75%65%73%74%73%3a%20%31%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%4d%6f%7a%69%6c%6c%61%2f%35%2e%30%20%28%57%69%6e%64%6f%77%73%20%4e%54%20%31%30%2e%30%3b%20%57%69%6e%36%34%3b%20%78%36%34%29%20%41%70%70%6c%65%57%65%62%4b%69%74%2f%35%33%37%2e%33%36%20%28%4b%48%54%4d%4c%2c%20%6c%69%6b%65%20%47%65%63%6b%6f%29%20%43%68%72%6f%6d%65%2f%37%34%2e%30%2e%33%37%32%39%2e%31%36%39%20%53%61%66%61%72%69%2f%35%33%37%2e%33%36%0d%0a%41%63%63%65%70%74%3a%20%74%65%78%74%2f%68%74%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%68%74%6d%6c%2b%78%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%6d%6c%3b%71%3d%30%2e%39%2c%69%6d%61%67%65%2f%77%65%62%70%2c%69%6d%61%67%65%2f%61%70%6e%67%2c%2a%2f%2a%3b%71%3d%30%2e%38%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%69%67%6e%65%64%2d%65%78%63%68%61%6e%67%65%3b%76%3d%62%33%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%2d%4c%61%6e%67%75%61%67%65%3a%20%7a%68%2d%43%4e%2c%7a%68%3b%71%3d%30%2e%39%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%0d%0a%0d%0a -o 1.txt |
最后把文件输出到1.txt中。
POST 同理。