无字母数字Webshell之进步篇
副问题[/!--empirenews.page--]
前几天有同窗提出了一个题目,或许代码如下:
这个代码假如要getshell,奈何操作? 这题也许来自是我曾写过的一篇文章,内里先容了怎样结构无字母数字的webshell。个中有两个首要的思绪:
虽然,这道题多了两个限定:
难点呼之欲出了,我前面文章中给出的全部要领,都用到了PHP中的变量,必要对变量举办变形、异或、取反等操纵,最后动态执行函数。但此刻,由于$不能行使了,以是我们无法结构PHP中的变量。 以是,怎样办理这个题目? PHP7 下简朴办理题目 我们将上述代码放在index.php中,然后执行docker run –rm -p 9090:80 -v pwd:/var/www/html php:7.2-apache,启动一个php 7.2的处事器。 php7中修改了表达式执行的次序:http://php.net/manual/zh/migration70.incompatible.php : PHP7前是不应承用($a)();这样的要领来执动作态函数的,但PHP7中增进了对此的支持。以是,我们可以通过(‘phpinfo’)();来执行函数,第一个括号中可所以恣意PHP表达式。 以是很简朴了,结构一个可以天生phpinfo这个字符串的PHP表达式即可。payload如下(不行见字符用url编码暗示):
PHP5的思索 我们行使docker run –rm -p 9090:80 -v pwd:/var/www/html php:5.6-apach来运行一个php5.6的web情形。 此时,我们实行用PHP7的payload,将会获得一个错误: 缘故起因就是php5并不支持这种表达方法。 在我在常识星球里发出帖子的时辰,着实还没想到怎样用PHP5办理题目,但我有自信办理它,以是先发了这个小挑衅。其后关上电脑细心想想,发明当思绪扣留在一个点的时辰,你将会钻进牛角尖;当你用大局观来对待题目,题目就迎刃而解。 虽然,我认为我的要领应该不是独一的,不外一向没人出来发布谜底,我就先抛钻引玉了。 大部门说话都不会是纯真的逻辑说话,一门全成果的说话肯定必要和操纵体系举办交互。操纵体系里包括的最重要的两个成果就是“shell(体系呼吁)”和“文件体系”,许多木马与远控着实壹贝俚现了这两个成果。 PHP天然也可以或许和操纵体系举办交互,“反引号”就是PHP中最简朴的执行shell的要领。那么,在行使PHP无法办理题目的环境下,为何不思量用“反引号”+“shell”的方法来getshell呢? PHP5+shell冲破扣留 由于反引号不属于“字母”、“数字”,以是我们可以执行体系呼吁,但题目来了:怎样操作无字母、数字、$的体系呼吁来getshell? 仿佛题目又回到了原点:无字母、数字、$,在shell中如故是一个困难。 此时我想到了两个风趣的Linux shell常识点:
第一点曾在在我之前的文章暴露过一角,但我没细讲。.可能叫period,它的浸染和source一样,就是用当前的shell执行一个文件中的呼吁。好比,当前运行的shell是bash,则. file的意思就是用bash执行file文件中的呼吁。 用. file执行文件,是不必要file有x权限的。那么,假如方针处事器上有一个我们可控的文件,那不就可以操作.来执行它了吗? 这个文件也很好获得,我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件生涯在姑且文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的巨细写字母。 第二个困难接踵而至,执行. /tmp/phpXXXXXX,也是有字母的。此时就可以用到Linux下的glob通配符:
那么,/tmp/phpXXXXXX就可以暗示为/*/?????????或/???/?????????。 但我们实行执行. /???/?????????,却获得如下错误: 这是由于,可以或许匹配上/???/?????????这个通配符的文件有许多,我们可以列出来: 可见,我们要执行的/tmp/phpcjggLC排在倒数第二位。然而,在执行第一个匹配上的文件(即/bin/run-parts)的时辰就已经呈现了错误,导致整个流程遏制,基础不会执行到我们上传的文件。 思绪又陷入了僵局,固然偏向没错。 深入领略glob通配符 大部门同窗对付通配符,也许知道的都只有*和?。但现实上,阅读Linux的文档( http://man7.org/linux/man-pages/man7/glob.7.html ),可以学到更多风趣的常识点。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |