- 代码审计
```php <?php errorreporting(0); highlightfile(__FILE); $url=$_POST[‘url’]; $x=parse_url($url); if($x[‘scheme’]===’http’||$x[‘scheme’]===’https’){ //gethostbyname返回域名对应的IPv4地址 $ip = gethostbyname($x[‘host’]); echo ‘
‘.$ip.’
‘; //利用php过滤器把值作为 IP 地址来验证,过滤私有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’); } ?> scheme
2. 这里可以用web355的两种办法,绕过私有地址的检测
```shell
1.DNS-Rebinding攻击绕过
2.利用vps搭建页面,重定向进行跳转
<?php
header("Location:http://127.0.0.1/flag.php");
?>
- 这里详细讲一下
DNS-Rebinding
进行绕过,首先在ceye.io平台进行注册账户,然后在个人资料profile
页面添加两个127.0.0.1
和随便写个公网
地址 然后找到
ceye.io
个人的域名(identifier)在前面添加r#POST提交
url=http://r.xxxx.ceye.io/flag.php
利用工具进行提交,当第一次提交时,域名会被解析成
127.0.0.1
,在过滤器会被检测到内网地址,会输出ip!
,因为重绑定的原因,每过几秒就会刷新域名绑定ip信息,重新提交后,域名会被解析成1.1.1.120
绕过过滤器检测,在file_get_contents
又会重新解析为127.0.0.1
,获取到flag.php,达到ssrf的攻击效果。DNS-Rebinding
原理参考文档:https://www.freebuf.com/column/194861.html