PHP的两个特性导致waf绕过注入(有趣的知识点)

2024-06-16 03:32

本文主要是介绍PHP的两个特性导致waf绕过注入(有趣的知识点),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、HPP HTTP参数污染
HTTP参数污染指的是,在URL中提交相同键值的两个参数时,服务器端一般会进行一些处理。比如Apache就要以最后一个参数为准,比如:
user.php?id=111&id=222
如果输出$_GET数组,则id的值只会取222,即URL上提交的多余值覆盖了前一个值。

2、一个CTF题目
http://drops.wooyun.org/tips/17248

关于注入的waf绕过,注入点为:

$sql="select * from user where id=".$_REQUEST["id"].";";
可以看到了REQUEST进行传递,并且存在如下的waf代码:

functionwaf($str) {if(stripos($str,"select")!==false)die("Be a good person!");if(stripos($str,"union")!==false)die("Be a good person!");......
}  functionwafArr($arr) {foreach($arras$k=> $v) {waf($k);waf($v);}
}  wafArr($_GET);
wafArr($_POST);
wafArr($_COOKIE);
wafArr($_SESSION); functionstripStr($str) {if(get_magic_quotes_gpc())$str= stripslashes($str);returnaddslashes(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
}  $uri= explode("?",$_SERVER['REQUEST_URI']);
if(isset($uri[1])) {$parameter= explode("&",$uri[1]);foreach($parameteras$k=> $v) {$v1= explode("=",$v);if(isset($v1[1])) {$_REQUEST[$v1[0]] = stripStr($v1[1]);}}
}  functionstripArr($arr) {$new_arr= array();foreach($arras$k=> $v) {$new_arr[stripStr($k)] = stripStr($v);}return$new_arr;
}  $_GET=stripArr($_GET);
$_POST=stripArr($_POST);
$_COOKIE=stripArr($_COOKIE);
$_SESSION=stripArr($_SESSION);

这里使用了waf函数分别对GET POST SESSION COOKIE数据进行过滤,并且对这些全局数组进行转义。
值得注意的是,这里的$_REQUEST是代码中重新根据$_SERVER['REQUEST_URI']进行拼接,在拼接过程中将参数值进行转义操作。
(1)思路1  使用HPP特性
看似不太可能存在注入,但是使用HPP可以实现。
示例代码:
user.php?id=0 or 1&id%00=1
user.php?id=0 or 1&%20id=1
user.php?id=0 or 1?&id=1
测试代码:

<?php function stripArr($arr) {$new_arr = array();foreach ($arr as $k => $v) {$new_arr[stripStr($k)] = stripStr($v);}return $new_arr;
}function stripStr($str) {if (get_magic_quotes_gpc())$str = stripslashes($str);return addslashes(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
}$uri = explode("?",$_SERVER['REQUEST_URI']);
if(isset($uri[1])) {$parameter = explode("&",$uri[1]);foreach ($parameter as $k => $v) {$v1 = explode("=",$v);if (isset($v1[1])) {$_REQUEST[$v1[0]] = stripStr($v1[1]);}}
}
var_dump($_GET) ;var_dump($_REQUEST) ;?>
输出结果:

可以看到,这里的GET数组取到了最后一个值,不会触发waf,而REQUEST数据中,id则为我们的注入语句,这样
利用这两者之间的差异,我们可以绕过waf函数的检测,并且利用之前的注入点来实现注入。

(2)思路2: 利用#特性($_SERVER['REQUEST_URI'])
在浏览器中,是不会将#号之后的hash内容发送给服务器的,这里利用burp发包,可以将hash的内容发送至服务器,比如发送:
/#?id=1
这里GET数组为空,REQUEST则输出为/#?id=1,这样,就可以绕过waf函数对GET数组的判断,
并且在REQUEST(这里主要因为REQUEST数组是使用了REQUEST_URI进行了重组)中携带注入的语句,绕过了waf检测。

3、总结
这种特性导致的漏洞场景比较特殊,首先,CTF中模拟的场景是waf函数只对GET,POST,SESSION,COOKIES全局数组进行的处理,注入点为REQUEST,在场景中,代码对REQUEST数组通过$_SERVER['REQUEST_URI'],使用&分割重新组装的,这种代码处理可能是由于程序员想对REQUEST数组进行转义或者一些净化处理才加进来的。
利用:
(1)HPP特性,提交重复参数内容,PHP处理参数时会覆盖,但是程序拼接时会出现差异,
比如提交:http:// 127.0.0.1/shell.php?id=0 or 1&id%00=1
GET为id=1,REQUEST为:
  'id' =>string'0%20or%201'(length=10)'id%00' =>string'1'(length=1)
可以看到,成功将注入内容引入到REQUEST数组中。
(2)利用#符号,#后面的内容不会带入至GET数组中,但是会出现在REQUEST_URI中,所以可以利用这个特性将注入语句带入到REQUEST对象中。
总之,这种特性导致的漏洞场景比较特殊,但是确实比较有趣。

这篇关于PHP的两个特性导致waf绕过注入(有趣的知识点)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065361

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu