信息收集
过滤了0-9和小写字母,但是没过滤 |
,可以考虑用|
或运算来重组想要的命令
system:函数会直接将命令的输出打印到标准输出设备(通常是屏幕),并返回最后一行输出
这意味着echo会输出命令返回的最后一行字符串,但不影响它将命令的结果输出到屏幕。所以得到的输出应该是system结果+system结果最后一行
if(isset($_POST['c'])){$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){eval("echo($c);");}
}else{highlight_file(__FILE__);
}
解题
由于我不会写php,所以我写了一个python版本的代码:[ctfshow web入门] RCE 或(or)、异或(xor)、非(not)绕过,点击超链接跳转阅读或使用代码
代码包括三种运算,异或(xor),或(or)和非(not)的加密运算
抓包重发
如果你使用抓包重发的技巧来实现,那么执行函数print(rce_or(list_cmd))获取加密字符串,用post发生对应的加密字符。
不要使用google的hackbar,它似乎有bug,无法成功
直接使用代码里的函数发送
rce_post(url, rce_or(list_cmd))