千家信息网

如何深入理解$_REQUESTS数组

发表于:2024-11-21 作者:千家信息网编辑
千家信息网最后更新 2024年11月21日,这篇文章主要为大家分析了如何深入理解$_REQUESTS数组的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习"如何深入理
千家信息网最后更新 2024年11月21日如何深入理解$_REQUESTS数组

这篇文章主要为大家分析了如何深入理解$_REQUESTS数组的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习"如何深入理解$_REQUESTS数组"的知识吧。

Day 16 - Poem

题目叫做诗,代码如下:

漏洞解析

这道题目包含了两个漏洞,利用这两个漏洞,我们可以往FTP连接资源中注入恶意数据,执行FTP命令。首先看到 第7行 代码,可以发现程序使用 cleanInput 方法过滤 GETPOSTCOOKIE 数据,将他们强制转成整型数据。然而在 第8行 处,却传入了一个从 REQUEST 方式获取的 mode 变量。我们都知道超全局数组 $_REQUEST 中的数据,是 $_GET$_POST$_COOKIE 的合集,而且数据是复制过去的,并不是引用。我们先来看一个例子,来验证这一观点:

可以发现 REQUEST 数据丝毫不受过滤函数的影响。回到本例题,例题中的程序过滤函数只对 GETPOSTCOOKIE 数据进行操作,最后拿来用的却是 REQUEST 数据,这显然会存在安全隐患。想了解更多 $_REQUEST 信息,大家自己上官网学习。第二个漏洞的话,在代码 第21行 ,这里用了 == 弱比较。关于这个问题,我们在前面的文章中讲的也很细致了,大家可以参考:[红日安全]PHP-Audit-Labs题解之Day1-4 (Day4)。

至于本次案例的攻击payload,可以使用: ?mode=1%0a%0dDELETE%20test.file ,这个即可达到删除FTP服务器文件的效果。

实例分析

本次实例分析,我们分析的是 WordPress 的 All In One WP Security & Firewall 插件。该插件在 4.1.4 - 4.1.9 版本中存在反射型XSS漏洞,漏洞原因和本次案例中的漏洞成因一致,官方也在 4.2.0 版本中修复了该漏洞。本次,我们将以 4.1.4 版本插件作为案例讲解。

将下载下来的插件zip包,通过后台插件管理上传压缩包安装即可。本次发生问题的文件在于 wp-content\plugins\all-in-one-wp-security-and-firewall\admin\wp-security-dashboard-menu.php ,为了方便大家理解,我将问题代码抽取出来,简化如下:

我们可以很清晰的看到,问题就出在 第25行render_tab3 方法中,这里直接将 REQUEST 方式获取的 tab 变量拼接并输出。而实际上,在 第20行 已经获取了经过过滤处理的 $tab 变量。我们来看一下 get_current_tab 方法:

过滤函数的调用链如下图 第1行 ,接着 $tab 变量就会经过 wp_check_invalid_utf8 方法的检测。

漏洞利用

下面我们来看看攻击 payload (向 http://website/wp-admin/admin.php?page=aiowpsec&tab=tab3 POST数据 tab="> ):

可以看到成功引发XSS攻击。我们最后再根据 payload 对代码的调用过程进行分析。首先,我们的 payload 会传入 wp-admin/admin.php 文件中,最后进入 第14行do_action('toplevel_page_aiowpsec'); 代码。

wp-includes/plugin.php 文件中,程序又调用了 WP_Hook 类的 do_action 方法,该方法调用了自身的 apply_filters 方法。

然后 apply_filters 方法调用了 wp-content\plugins\all-in-one-wp-security-and-firewall\admin\wp-security-admin-init.php 文件的 handle_dashboard_menu_rendering 方法,并实例化了一个 AIOWPSecurity_Dashboard_Menu 对象。

接下来就是开头文章分析的部分,也就是下面这张图片:

整个漏洞的攻击链就如下图所示:

这里还有一个小知识点要提醒大家的是,案例中 $_REQUEST["tab"] 最后取到的是 $_POST["tab"] 的值,而不是 $_GET["tab"] 变量的值。这其实和 php.ini 中的 request_order 对应的值有关。例如在我的环境中, request_order 配置如下:

这里的 "GP" 表示的是 GETPOST ,且顺序从左往右。例如我们同时以 GETPOST 方式传输 tab 变量,那么最终用 $_REQUEST['tab'] 获取到的就是 $_POST['tab'] 的值。更详细的介绍可以看如下PHP手册的定义:

request_order stringThis directive describes the order in which PHP registers GET, POST and Cookie variables into the _REQUEST array. Registration is done from left to right, newer values override older values.If this directive is not set, variables_order is used for $_REQUEST contents.Note that the default distribution php.ini files does not contain the 'C' for cookies, due to security concerns.

修复建议

对于这个漏洞的修复方案,我们只要使用过滤后的 $tab 变量即可,且变量最好经过HTML实体编码后再输出,例如使用 htmlentities 函数等。

结语

看完了上述分析,不知道大家是否对 $_REQUEST 数组有了更加深入的理解,文中用到的 CMS 可以从这里( All In One WP Security & Firewall )下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到 hongrisec@gmail.com 联系我们。Day16 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:

// index.php>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16 || ip2long('0.0.0.0')>>24 == $int_ip>>24;}function safe_request_url($url){    if (check_inner_ip($url)){        echo $url.' is inner ip';    }    else{        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_HEADER, 0);        $output = curl_exec($ch);        $result_info = curl_getinfo($ch);        if ($result_info['redirect_url']){            safe_request_url($result_info['redirect_url']);        }        curl_close($ch);        var_dump($output);    }}$url = $_POST['url'];if(!empty($url)){    safe_request_url($url);}else{    highlight_file(__file__);}//flag in flag.php ?>
// flag.php

关于"如何深入理解$_REQUESTS数组"就介绍到这了,更多相关内容可以搜索以前的文章,希望能够帮助大家答疑解惑,请多多支持网站!

漏洞 数据 方法 变量 分析 代码 数组 插件 文件 函数 文章 案例 问题 题目 攻击 实例 方式 版本 知识 程序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 大话西游手游服务器等级 手机热点输入网络安全密钥 怎么在传奇服务器上添加游戏列表 学计算机网络技术好学吗 网络安全督查资料 校园物资管理系统数据库分析 博图v15升级无法连接到服务器 dat文件写入数据库 滨江区苹果软件开发 标准数据库的密钥怎么删除 戴尔服务器带外默认管理地址 从数据库查出总的条数 php数据库删除学生信息 应用服务器开发语言 数据库订阅价 当今主流的数据库技术是什么 成都科云网络技术有限公司 第五人格如何维修服务器 数据库技术将来能干嘛 软件开发项目管理总结报告 数据库 修改字符串的长度 浙江寻宝网络技术有限公司 报税提示数据库连接失败 2018年4月网络安全自考 青岛数据分析软件开发 涉疫单位网络安全执法监督检查 打造一个智能数据库 天津惠普服务器维修云主机 猫鼠服务器 像素工厂如何创建远程服务器
0