天网管理系统
关于php的弱类型漏洞:在php中,定义变量之前没有像其他语言一样要求我们先说明该变量的类型。在他这里,无论你是字符,数字,数组都是直接$+变量名,那么怎么判断两个变量是否相等呢?在php中的==运算符下,会把类数值型数据(如含有数字的字符串)转换成数字处理。比方说在数字与字符串作比较时:
3=="3aasda"
结果竟然是true,也解释说他会把字符串的第一个非数字字符前的数字当作字符的值来与数字进行比较。当然,要是向绝对判断,就要用到===,三个等于号,最厉害的判断,类型不同直接就false。
所以在本题中,我们输入的username的值经过md5加密后要==’0’,这里就用到的我们上面说的php类数值型数据的数字处理,只要我们传入的值加密后的字符串能被看作数字0来判断,就达到效果了。
这些字符串加密后都为0exxxx,可以看作是数字型,与’0’判断相等。
把符合要求的username值输入后,会出现一个地址,复制到地址栏访问后,会出现
unserializestr= u n s e r i a l i z e s t r = _POST[‘password’]; dataunserialize=unserialize( d a t a u n s e r i a l i z e = u n s e r i a l i z e ( unserialize_str); if(data_unserialize['user'] == '???' && data_unserialize['user'] == '???' && data_unserialize[‘pass’]==’???’) { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年
审计代码可知,就是让我们造一个数组存在 dataunserialize里面,使他的"user"=???并且"pass"=???,但是这里的???是什么呢,这里最厉害的一点就要来了<u>bool类型的true跟任意字符串可以弱类型相等</u>,只要是他的值为true,不管???是什么字符串,都在==情况下判断相等,这就是==的危害呀!所以我们只要使得我创建的一个数组,符合上面的要求,并把它反序列话一下传到 d a t a u n s e r i a l i z e 里 面 , 使 他 的 " u s e r "= ? ? ? 并 且 " p a s s "= ? ? ? , 但 是 这 里 的 ? ? ? 是 什 么 呢 , 这 里 最 厉 害 的 一 点 就 要 来 了 < u > b o o l 类 型 的 t r u e 跟 任 意 字 符 串 可 以 弱 类 型 相 等 < / u > , 只 要 是 他 的 值 为 t r u e , 不 管 ? ? ? 是 什 么 字 符 串 , 都 在 == 情 况 下 判 断 相 等 , 这 就 是 == 的 危 害 呀 ! 所 以 我 们 只 要 使 得 我 创 建 的 一 个 数 组 , 符 合 上 面 的 要 求 , 并 把 它 反 序 列 话 一 下 传 到 _POST[“password”]里面,一切就完事了。
<?php header('content-type:text/html;charset=utf-8'); $arr=array('user'=>true,'pass'=>true); $arr2=serialize($arr); echo $arr2; ?>
输出的结果为 a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}
把这一串放到password里面,登陆一下,flag就出来了。