web40 无参数rce
点击查看代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
有点坑的是这里过滤的括号是中文的不是英文的
上网查发现有好几种方法 算是脑洞大开了
array_pop()将数组的值提取出来
get_defined_vars() 是以数组的形式将所有变量展示出来
next()是取数组第二个参数
我们post传入的data=phpinfo() 刚好是第二个参数
所以成功执行
还有方法
show_source(next(array_reverse(scandir(pos(localeconv())))));
还有就是
通过传sessionid来执行
理论上感觉没啥问题 传ls参数也有回显 但是好像一旦包含了flag.php 就不行了 不过这也是一种思路