漏洞解析 : 这一关其实是考察变量覆盖漏洞,⽽导致这⼀漏洞的发⽣则是不安全的使⽤ parse_str 函数。 由于 第21行 中的 parse_str() 调用,其行为非常类似于注册全局变量。...我们来看看PHP官方对 parse_str 函数的定义: parse_str 功能 :parse_str的作用就是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉当前作用域中原有的变量...这个问题的解决就利用到了 $REQUEST 内容与 parse_str 函数内容的差异特性。...而通过上面代码的遍历进入 parse_str 函数的内容则是 [a=1&b=2&c=3] ,因为 parse_str 函数会针对传入进来的数据进行解码,所以解析后的内容就变成了[a=1,b=2,c=3]...结语 看完了上述分析,不知道大家是否对 parse_str() 函数有了更加深入的理解,文中用到的CMS可以从 这里 下载,当然文中若有不当之处,还望各位斧正。
下面是 第7篇 代码审计文章: Day 7 - Bell 题目叫做钟,代码如下: 漏洞解析 : 这一关其实是考察变量覆盖漏洞,⽽导致这⼀漏洞的发⽣则是不安全的使⽤ parse_str 函数。...我们来看看PHP官方对 parse_str 函数的定义: parse_str 功能 :parse_str的作用就是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉当前作用域中原有的变量...这个问题的解决就利用到了 $REQUEST 内容与 parse_str 函数内容的差异特性。...而通过上面代码的遍历进入 parse_str 函数的内容则是 [a=1&b=2&c=3] ,因为 parse_str 函数会针对传入进来的数据进行解码,所以解析后的内容就变成了[a=1,b=2,c=3]...使用 parse_str 函数之前先自行通过代码判断变量是否存在。 这里提供一个demo漏洞样例代码,以及demo的修复方法。
注释:如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量。 注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。...如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。 语法 parse_str(string,array) 参数 描述 string 必需。
$arr2="first=value1&second=value2&third[]=value3&third[]=value4"; parse_str($arr2,$param); echo ""; print_r($param); echo ""; 说明 void parse_str ( string $encoded_string [, array &$result ] )
其实,大多数变量覆盖漏洞是函数使用不当导致的。比如extract()函数和parse_str()。...还有一个函数是import_request_variables(),它是在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP5.4之后,这个函数被取消了。...extract()函数使用不当导致变量覆盖 函数结构: int extract( array & 原来b=2,经过extract()函数对a处理后, parse_str()函数使用不当导致变量覆盖 parse_str()函数的作用是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在...函数说明如下: void parse_str( string str[, array & <?php $b=2; parse_str($b=321); print_r($b); ?
但是我们有的时候不得不被逼使用$_PUT方法获取数据 当然,php中是没有$_PUT的,但是我们可以使用 $_SERVER[‘REQUEST_METHOD’]来判断,因为我们这个服务器变量会是PUT 这样我们十一哦那个parse_str...就可以分割开put的变量 put.php页面代码 $_PUT = array(); if (‘PUT’ == $_SERVER[‘REQUEST_METHOD’]) { parse_str(file_get_contents...(‘php://input’), $_PUT); } print_r($_PUT); 其中:parse_str() 函数把查询字符串解析到变量中。
extract() 函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值。...,但是PHP由上至下执行,所以在后面被覆盖后值就被改变了parse_str()介绍parse_str(string,array)string 必需。规定要解析的字符串。array 可选。...>输出g1ts18利用如果该函数写法为parse_str($_GET);,那么就可以通过传入参数来改变代码里面原有的参数值函数就很有用。该函数在最新版本的 PHP 中已经不支持。...>输出图片利用利用思路和parse_str函数差不太多深信服EDR RCE:https://www.yuque.com/tianxiadamutou/xqp4q6/bv4t2u
经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。...extract()函数导致的变量覆盖问题 extract() 该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。...最终PAYLOAD: POST DATA:pass=&thepassword_123= parse_str函数导致的变量覆盖问题 parse_str() 函数用于把查询字符串解析到变量中,如果没有array...参数,则由该函数设置的变量将覆盖已存在的同名变量。...parse_str() 用法参考:http://php.net/parse_str CTF中parse_str()导致的变量覆盖问题的例题1: 题目源码: 1.<?
最近我们发现dedecms漏洞,存在高危的parse_str函数sql注入漏洞。...关于该织梦漏洞的详情,我们一步一步来剖析: 首先来介绍下parse_str函数的机制与作用是什么,简单通俗来讲就是解析网站传过来的字符串,将字符串的值转变成一个固有的变量值,这个函数在传入进来,进行转变的时候并不会验证网站当前变量的值是否含有...在dedecms最新版里的buy_action.php代码里,存在网站漏洞,dedecms针对于该文件之前更新并修复过网站漏洞,代码里增加了许多函数的安全过滤,但是在过滤的同时编码函数进行解码的时候没有严格的过滤掉传入进来的值...我们对该代码进行人工的安全检测发现,在第4,第6行里调用了一个mchStrCode函数机制,这个函数我来简单跟大家讲解一下原理是什么,该函数是将前端网站用户提交过来的数据进行解码,然后通过parse_str...dedecms网站漏洞修复建议: 关于这次的dedecms parse_str函数SQL注入漏洞,需要修复的就是变量的覆盖修复,在对前端输入过来的值进行安全判断,确认变量值是否存在,如果存在将不会覆盖,
get=1&flag=1) ③ parse_str使用不当导致覆盖漏洞 image.png parse_str会将一个变量重新注册,parse_str里面的值,将会覆盖掉原有的值,就像上面那样,原本a是...abcde,经过parse_str注册后,变成了12345 题目考察也是传入一个"传新"的变量,和比较值相等就好了 image.png 传入:/?...a=flag=123;(123可以是任意值) 审计题目代码的时候,多关注一些危险函数,通过危险函数快速定位考察的内容 然后对症下药,一下子把题目给收了 注:部分图片源自于网络,如有侵权,请联系删除!!!
如果有下面的几个函数出现,就可能存在变量覆盖: $$ extract()函数 parse_str()函数 import_request_variables()函数 用法 1.$$ $$就是将之前定义的变量的值重新定义新的变量...4.………… 3.parse_str() 定义 parse_str()函数的作用是把传入的字符串放入变量数组中去。 语法 parse_str(string,array) string 必需。...如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。 addslashes()函数 在(",',/)前添加反斜杠,如果是闭合符,则不加。 <?...php parse_str("name=Peter&age=43",$Array); print_r($Array); ?> ?...该函数在最新版本的 PHP 中已经不支持。
相关函数: extract、import_request_variables、parse_str、$$ ?...1、extract函数 extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] ) : int...此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flags 和 prefix 参数的影响。 EXTR_OVERWRITE,如果有冲突,覆盖已有的变量。...2、import_request_variables函数(PHP<5.4) ? ? ? 3、parse_str函数 ? ? ? 4、$$ ? 变量a可被传入的参数覆盖。 ? ?
`__get() ` 读取一个对象的属性时, 若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。...__set() 设置一个对象的属性时, 若属性存在,则直接赋值; 若不存在,则会调用__set函数。 __toString() 打印或者输出一个对象的时被调用。...$i++; $$key = $value; } else{break;} } if($first==="doller") { @parse_str...{ $i++; $$key = $value; } else{break;} } 第二处 @parse_str...($_GET['a']) 所以payload first=doller&a=var=give%26bbb=me%26ccc=flag 注意%26是传给parse_str的参数& 第二步 主要内容就是反序列化的时候调用
extract()函数使用不当导致的变量覆盖 该函数可以将变量从数组中导入当前的符号表 我们看一下在w3school中函数的定义 ?...我们成功通过注入GLOBALS[yml]来改变$yml的值 parse_str()函数使用不当导致的覆盖 该函数可以把查询的字符串解析到变量中,我们来看一下w3school中对该函数的定义 ?...$yml; echo ""; $a = $_GET['a']; parse_str($a); echo "out1:".$yml; ?...> 在这里我们没有设置parse_str()函数的第二个参数,现在我们来尝试构造同名变量 ?...对于第三种情况,强烈推荐将registerglobals设置为Off 对于第四种情况,我们应该在使用parse_str()时养成指定第二个参数的习惯,这样才能避免变量被覆盖 对于最后一种情况,我们同样要指定第二个函数参数来设置要注册的变量前缀
我之前不会编写函数,都是用的别人做的。后来慢慢学会就逐步添加想要的功能,但是问题出现了。...我修改的函数(用于curl抓取页面)的相关设置太多,导致函数的形参多的冒泡,使用起来很麻烦 function curl_get($url, $re=0,$ua=0,$ip=1,$post=0,$followLocation...//每次调用的时候很蛋疼 最近难以忍受调用这种形式的函数,遂修改下 function curl_get($url, $array=array('re'=>0,'ua'=>0,'ip'=>1,'post'....)){} 刚开始没发现使用上有问题,但是后来真闯到鬼了,明明默认的形参是ip=1,但是打死都没反应 curl_get(url, array=array('post'=>0))后来知道是怎么回事:调用函数时的...'; parse_str($str_deaful,$arr); parse_str($str,$arr2); $array = array_merge($arr,$arr2); //do...... }
ereg()函数:字符串正则匹配。 strpos()函数:查找字符串在另一字符串中第一次出现的位置,对大小写敏感。 这2个函数都是用来处理字符串的,但是在传入数组参数后都将返回NULL。...所有这里将password参数指定为数组,利用函数漏洞拿到flag: 拓展总结 除了strcmp()函数外,ereg()和strpos()函数在处理数组的时候也会异常,返回NULL。...==FALSE,满足条件,拿到flag: 六、parse_str函数变量覆盖缺陷 理论 parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量...void parse_str ( string $str [, array &$arr ] ) str 输入的字符串。...实践 测试代码: 考察点 parse_str变量覆盖缺陷 write-up 找到核心代码: 因为这里用到了parse_str函数来传递b,if的语句的条件是拿$a[0]来比较的,有因为这里的变量a的值已经三是固定的了
扩展我们的字典 5.1 变量本身的key 5.2 变量覆盖 5.2.1 遍历初始化变量 5.2.2 parse_str()变量覆盖漏洞 5.2.3...5.4.2 变量函数与双引号 5.5 PHP自身函数漏洞及缺陷 5.5.1 PHP函数的溢出漏洞 5.5.2 PHP函数的其他漏洞...var=new $var = "init"; parse_str($_SERVER["QUERY_STRING"]); print $var; -----------------------------...+++++++++++++++++++++++++ 漏洞审计策略(parse_str) ------------------------- PHP版本要求:无 系统要求:无 审计策略:查找字符parse_str...还有很多函数有类似的作用 如:addslashes()、mysql_escape_string()、 mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc
call_user_func() 函数把第一个参数作为回调函数调用,通过这个函数可以将编码为16进制的V2重新变为一句话木马,v3通过伪协议写入1.php文件中内容,v1通过Post传参传入hex2bin...echo $flag; } } 我们这里需要使用数组绕过也可以使用,强碰撞 aaroZmOk与aaK1STfY或aaO8zKZF与aa3OFF9m Web107 这个真是涨知识了,parse_str...()函数这个我真不知道。...if(isset($_POST['v1'])){ $v1 = $_POST['v1']; $v3 = $_GET['v3']; parse_str($v1,$v2);...if($v2['flag']==md5($v3)){ echo $flag; } } 在官方文档中 parse_str — 将字符串解析成多个变量 parse_str
pass] => password [path] => /path [query] => arg=value [fragment] => anchor ) */ 2> void parse_str...( string $str [, array &$arr ] ) 从字符串中解析出多个变量,可以和 parse_url 函数结合使用 $arr, 如果设置了第二个变量 arr,会将解析出来的变量存入数组...act=login&id=111"; $query = parse_url($url, PHP_URL_QUERY); parse_str($query); echo $act;//输出: login...str_ireplace函数忽略大小写 $search, 要被替换的字符或字符串 $replace, 替换的心字符或字符串 $subject, 替换的对象,即总字符串 $count, 替换发生的次数...strcasecmp函数忽略大小写 如果 str1 小于 str2 返回 0;如果两者相等,返回 0。
prefix ) $array 关联的数组,受第二个和第三个参数的影响 extract_rules 对待非法/ 数字和冲突的键名的方法将根据取出标记 prefix 仅在第二个参数特殊时需要,添加前缀 危险函数...parse_str()变量覆盖 void parse_str ( string $encoded_string [, array &$result] ) $encoded_string 输入的字符串 &