红日代码审计day5 ctf

先把原文链接贴上:

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);
    }
}
?>

这题,暂没看懂,先发出来,我慢慢分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值