加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

无字母数字Webshell之进步篇

发布时间:2018-10-18 11:59:39 所属栏目:业界 来源:phithon
导读:前几天有同窗提出了一个题目,或许代码如下: ?php if(isset($_GET['code'])){ $code=$_GET['code']; if(strlen($code)35){ die(Long.); } if(preg_match(/[A-Za-z0-9_$]+/,$code)){ die(NO.); } eval($code); }else{ highlight_file(__FILE__); } 这个代
副问题[/!--empirenews.page--]

前几天有同窗提出了一个题目,或许代码如下:

  1. <?php 
  2. if(isset($_GET['code'])){ 
  3.     $code = $_GET['code']; 
  4.     if(strlen($code)>35){ 
  5.         die("Long."); 
  6.     } 
  7.     if(preg_match("/[A-Za-z0-9_$]+/",$code)){ 
  8.         die("NO."); 
  9.     } 
  10.     eval($code); 
  11. }else{ 
  12.     highlight_file(__FILE__); 

这个代码假如要getshell,奈何操作?

这题也许来自是我曾写过的一篇文章,内里先容了怎样结构无字母数字的webshell。个中有两个首要的思绪:

  • 操作位运算
  • 操作自增运算符

虽然,这道题多了两个限定:

  • webshell长度不高出35位
  • 除了不包括字母数字,还不能包括$和_

难点呼之欲出了,我前面文章中给出的全部要领,都用到了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 :

无字母数字Webshell之进步篇

PHP7前是不应承用($a)();这样的要领来执动作态函数的,但PHP7中增进了对此的支持。以是,我们可以通过(‘phpinfo’)();来执行函数,第一个括号中可所以恣意PHP表达式。

以是很简朴了,结构一个可以天生phpinfo这个字符串的PHP表达式即可。payload如下(不行见字符用url编码暗示):

  1. (~%8F%97%8F%96%91%99%90)(); 

无字母数字Webshell之进步篇

PHP5的思索

我们行使docker run –rm -p 9090:80 -v pwd:/var/www/html php:5.6-apach来运行一个php5.6的web情形。

此时,我们实行用PHP7的payload,将会获得一个错误:

无字母数字Webshell之进步篇

缘故起因就是php5并不支持这种表达方法。

在我在常识星球里发出帖子的时辰,着实还没想到怎样用PHP5办理题目,但我有自信办理它,以是先发了这个小挑衅。其后关上电脑细心想想,发明当思绪扣留在一个点的时辰,你将会钻进牛角尖;当你用大局观来对待题目,题目就迎刃而解。

虽然,我认为我的要领应该不是独一的,不外一向没人出来发布谜底,我就先抛钻引玉了。

大部门说话都不会是纯真的逻辑说话,一门全成果的说话肯定必要和操纵体系举办交互。操纵体系里包括的最重要的两个成果就是“shell(体系呼吁)”和“文件体系”,许多木马与远控着实壹贝俚现了这两个成果。

PHP天然也可以或许和操纵体系举办交互,“反引号”就是PHP中最简朴的执行shell的要领。那么,在行使PHP无法办理题目的环境下,为何不思量用“反引号”+“shell”的方法来getshell呢?

PHP5+shell冲破扣留

由于反引号不属于“字母”、“数字”,以是我们可以执行体系呼吁,但题目来了:怎样操作无字母、数字、$的体系呼吁来getshell?

仿佛题目又回到了原点:无字母、数字、$,在shell中如故是一个困难。

此时我想到了两个风趣的Linux shell常识点:

  • shell下可以操作.来执行恣意剧本
  • Linux文件名支持用glob通配符取代

第一点曾在在我之前的文章暴露过一角,但我没细讲。.可能叫period,它的浸染和source一样,就是用当前的shell执行一个文件中的呼吁。好比,当前运行的shell是bash,则. file的意思就是用bash执行file文件中的呼吁。

用. file执行文件,是不必要file有x权限的。那么,假如方针处事器上有一个我们可控的文件,那不就可以操作.来执行它了吗?

这个文件也很好获得,我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件生涯在姑且文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的巨细写字母。

第二个困难接踵而至,执行. /tmp/phpXXXXXX,也是有字母的。此时就可以用到Linux下的glob通配符:

  • *可以取代0个及以上恣意字符
  • ?可以代表1个恣意字符

那么,/tmp/phpXXXXXX就可以暗示为/*/?????????或/???/?????????。

但我们实行执行. /???/?????????,却获得如下错误:

无字母数字Webshell之进步篇

这是由于,可以或许匹配上/???/?????????这个通配符的文件有许多,我们可以列出来:

无字母数字Webshell之进步篇

可见,我们要执行的/tmp/phpcjggLC排在倒数第二位。然而,在执行第一个匹配上的文件(即/bin/run-parts)的时辰就已经呈现了错误,导致整个流程遏制,基础不会执行到我们上传的文件。

思绪又陷入了僵局,固然偏向没错。

深入领略glob通配符

大部门同窗对付通配符,也许知道的都只有*和?。但现实上,阅读Linux的文档( http://man7.org/linux/man-pages/man7/glob.7.html ),可以学到更多风趣的常识点。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读