ssrf访问内网及url地址过滤绕过

<?php
/*//设置open_basedir
ini_set("open_basedir", "/home/shawn/www/index/");
 */

if (isset($_GET['file'])) {
	$file = trim($_GET['file']);
} else {
	$file = "main.html";
}

// disallow ip
if (preg_match('/^(http:\/\/)+([^\/]+)/i', $file, $domain)) {
	$domain = $domain[2];
	if (stripos($domain, ".") !== false) {
		die("Hacker");
	}
}

if( @file_get_contents($file)!=''){
echo file_get_contents($file);

}else{

$str=<<<EOF

 如上引用了XDCTF的一道题目的源码,此题需要get提交file变量,并且正则匹配file变量中的ip地址,点号被过滤。

第一种绕过方式:

file=php://filter/resource=http://127.0.0.1/(这是针对这道题的正则匹配来绕过,观察正则表达式,是从file变量开始匹配,如此构造payload匹配不到ip地址巧妙绕过)

第二种绕过方式:
转ip地址为整型或者十六进制
第三种绕过方式:
因为https://i.cnblogs.com@127.0.0.1与http://127.0.0.1的请求是一样的。那么便可构造payload绕过。
这道题读取/etc/hosts 或者 /proc/net/arp 
然后在内网的一台服务器主页可以找到flag 比较坑的是页面内容是404 但是响应码是200 长度又和别的ip的404页面一模一样。
 
更多关于ssrf可以到http://bobao.360.cn/learning/detail/240.html学习。
posted @ 2017-10-07 21:05  ur10ser  阅读(3627)  评论(0编辑  收藏  举报