先把原文链接贴上:
https://www.freebuf.com/column/182132.html
<?php
highlight_file('index.php');
function waf($a){
foreach($a as $key => $value){
if(preg_match('/flag/i',$key)){//遍历所有键,不能出现flag字样
exit('are you a hacker');
}
}
}
foreach(array('_POST', '_GET', '_COOKIE') as $__R) {//遍历所有以post,get,cookie方式提交的数据,
if($$__R) { //例如$flag=a,$$flag-->$a,一个新变量
foreach($$__R as $__k => $__v) {
if(isset($$__k) && $$__k == $__v) unset($$__k); //若之前有这个变量并且键和值相等,就删除这个变量
}
}
}
if($_POST) { waf($_POST);}
if($_GET) { waf($_GET); }
if($_COOKIE) { waf($_COOKIE);}
if($_POST) extract($_POST, EXTR_SKIP);//将键名变成变量名,如果传入flag,应该是设置了_GET['flag']这个变量
if($_GET) extract($_GET, EXTR_SKIP);
if(isset($_GET['flag'])){//必须设置以get方式传参的flag..这个可以用
if($_GET['flag'] === $_GET['hongri']){
exit('error');
}
if(md5($_GET['flag'] ) == md5($_GET['hongri'])){//数组或碰撞
echo "success!";
$url = $_GET['url'];
$urlInfo = parse_url($url);
if(!("http" === strtolower($urlInfo["scheme"]) || "https"===strtolower($urlInfo["scheme"]))){
die( "scheme error!");
}
$url = escapeshellarg($url);
$url = escapeshellcmd($url);//特殊字符逃逸
system("curl ".$url);
}
}
?>
这题,暂没看懂,先发出来,我慢慢分析