PHP代码审计学习-PHP-Audit-Labs-day2
filter_var()函数
filter_var() 函数通过指定的过滤器过滤一个变量。如果成功,则返回被过滤的数据。如果失败,则返回 FALSE。
filter_var(variable, filter, options)
过滤器种类很多
这个函数按理来说没有什么问题,但是在使用FILTER_VALIDATE_URL时会把伪协议当做URL处理,从而就造成了绕过。
题目解答
先看源码
<?php
$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
$site_info = parse_url($url);
if(preg_match('/sec-redclub.com$/',$site_info['host'])){
exec('curl "'.$site_info['host'].'"', $result);
echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
<center><textarea rows='20' cols='90'>";
echo implode(' ', $result);
}
else{
die("<center><h1>Error: Host not allowed</h1></center>");
}
}
else{
echo "<center><h1>Just curl sec-redclub.com!</h1></center><br>
<center><h3>For example:?url=http://sec-redclub.com</h3></center>";
}
?>
代码很简单,接收一个url参数,使用filter_var函数过滤后,使用parse_url处理正则匹配后传入exec。
URI中的保留字符
“,”,“;”, “/”, “?”, “:”, “@”, “=” 和 “&”
函数filter_var()可以解析许多类型的URL schema,拒绝HTTP请求中附带的某些字符。简单看下效果
现在已经绕过了filter_var,同时也绕过了arse_url。需要做的就是命令执行构造了。在windwos环境下。
首先闭合双引号,后面的sec-redclub.com也要注释掉。命令连接符可以使用&(%26),windows下空格可以使用“;”号来代替。
最后构造出payload如下url=0://"%26type;1.txt;%23,sec-redclub.com/
相关链接
博文中如存在错误请及时指出,不胜感激!