web安全-SSRF(服务器端请求伪造)
1.漏洞函数(php)
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
接下来详细介绍其中几种函数:
- curl_exec()
curl_exec函数用于执行指定的cURL会话
1 |
|
- fsockopen()
函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限
1 |
|
- file_get_contents()
file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。
1 |
|
注:
- 一般情况下PHP不会开启fopen的gopher wrapper
file_get_contents()
的gopher协议不能URL编码file_get_contents()
关于Gopher的302跳转会出现bug,导致利用失败curl/libcurl
7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用curl_exec()
默认不跟踪跳转,file_get_contents()
支持php://input协议
2.漏洞利用
file伪协议
在有回显的情况下,利用 file 协议可以读取任意内容
dict伪协议
泄露安装软件版本信息,查看端口,操作内网redis服务等
http伪协议
探测内网主机存活或目录扫描
gopher伪协议
可以选择利用工具Gopherus快捷生成payload: https://github.com/tarunkant/Gopherus
gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。可用于反弹shell
默认端口为70,格式为gopher://<host>:<port>/<gopher-path>_后接TCP数据流
gopher伪协议不转发<gopher-path>
内第一个字符,可以使用下划线填充首位
- GET提交
需要保留数据包中的头部信息,例如:
1 | GET /name.php?name=123 |
注:其中最后需要保留一个换行符
(多出一行空行)表示消息结束
接下来将数据包内的内容复制,并将特殊字符(空格 问号 换行符)进行url编码利用gopher伪协议构造好
payload(需在网页中提交,若在bp中发包需要进行两次url编码):
gopher://172.250.250.4:80/_GET%20
/name.php%3f
name=123%20
HTTP/1.1%0d%0A
Host:%20
172.250.250.4%0d%0A
- POST提交
需要保留数据包中的头部信息,例如:
1 | POST /name.php |
注:其中的Content-Length
要与提交内容长短对应
接下来将数据包内的内容进行两次url编码(所有字符),拼接在_
后构造好gopher伪协议提交
payload:
gopher://172.250.250.4:80/_%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%65%25%36%31%25%36%64%25%36%35%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%37%25%33%32%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%32%25%33%35%25%33%30%25%32%65%25%33%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%31%25%37%30%25%37%30%25%36%63%25%36%39%25%36%33%25%36%31%25%37%34%25%36%39%25%36%66%25%36%65%25%32%66%25%37%38%25%32%64%25%37%37%25%37%37%25%37%37%25%32%64%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%37%35%25%37%32%25%36%63%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%36%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%38%25%30%64%25%30%61%25%30%64%25%30%61%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%33%31%25%33%32%25%33%33
SSRF打Redis
利用SSRF发现内网开放6379端口,则可能存在Redis服务
此时如果目标主机上的Redis由于没有设置密码认证、没有进行添加防火墙等原因存在未授权访问漏洞的话,那我们就可以利用Gopher协议远程操纵目标主机上的Redis,可以利用 Redis 自身的提供的config
命令像目标主机写WebShell、写SSH公钥、创建计划任务反弹Shell等
SSRF打MySQL
SSRF打tomcat
3.绕过方式
回环地址绕过(二进制IP)
可以用不同进制表示IP地址
302重定向绕过
DNS重绑定
利用此网站生成重绑定地址:http://lock.cmpxchg8b.com/rebinder.html
短网址绕过
利用此网站生成短网址:https://suowo.cn
点分符号替换
例如http://www。qq。com
4.漏洞防御
禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https。
设置URL白名单或者限制内网IP。
限制请求的端口为http的常用端口,或者根据业务需要开放远程调用服务的端口。
catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务。