由php中字符offset特征造成的绕过漏洞详解_php技巧

时间:2019-11-26 15:58来源:澳洲幸运10资讯
php中的字符offset本性 php中的字符串存在叁个那叁个有趣的特色,php中的字符串也能够像数组同样实行取值。 $test = "hello world";echo $test[0]; 只是上述的这种特点有的时候会有不测的效率,看

php中的字符offset本性

php中的字符串存在叁个那叁个有趣的特色,php中的字符串也能够像数组同样实行取值。

$test = "hello world";echo $test[0];

只是上述的这种特点有的时候会有不测的效率,看下边这段代码

$mystr = "hello world";echo $mystr["pass"];

上述的代码的输出结果是h.那是干什么呢?其实很简短,和数不完别样的语言相似,字符串在php中也像数组同样可以采用下标取值。$mystr["pass"]中pass会被实行隐性类型转换为0,那样$mystr[0]的出口结果便是首字母h.相仿地,假如尝试如下的代码:

$mystr = "hello world";echo $mystr["1pass"];

输出结果正是e.因为1pass会被隐性类型转变为1,$mystr[1]的输出结果正是第三个字母e.

字符天性变成的尾巴

下边这段代码是在在phpspy二〇〇七中用来决断登入时所运用的代码。

$admin['check'] = "1";$admin['pass'] = "angel";......if($admin['check'] == "1") {....}

这么的辨证逻辑假如利用上述的风味就超级轻巧地就足以被绕过。$admin未有被初步定义为数组类型,那么当我们用字符串提交时phpsyp.php?admin=1abc时,php会取字符串1xxx的第一位,成功绕过if的准则判定。

上边这段代码是三个代码片段,接下去的这段代码是生机勃勃段完整的逻辑代码,来自于php4fun中第5题,相比有意思。

 8,# 'name' => 'jimbo18714',# 'pass' => 'MAYBECHANGED',# 'level' => 1# );require 'db.inc.php';function mres{ return mysql_real_escape_string;}$userInfo = @unserialize;$query = 'SELECT * FROM users WHERE id = '' . mres . '' AND pass = '' . mres . '';';$result = mysql_query;if (!$result || mysql_num_rows { die;}$row = mysql_fetch_assoc;foreach ($row as $key => $value) { $userInfo[$key] = $value;}$oldPass = @$_GET['oldPass'];$newPass = @$_GET['newPass'];if ($oldPass == $userInfo['pass']) { $userInfo['pass'] = $newPass; $query = 'UPDATE users SET pass = '' . mres . '' WHERE id = '' . mres . '';'; mysql_query; echo 'Password Changed.';} else { echo 'Invalid old password entered.';}

那道标题互连网也仅仅只是给了叁个末段的答案,个中的原理都未有说或然未有说得很详细。其实原理正是地点讲到的php的字符性格。

标题须求很简短就是更正admin的密码,admin的id为1。大家供给构思以下多少个难题:

怎么着在更新的时候将id纠正为1 $userInfo['pass'] = $newPass;那行代码有哪些效果,为何会在if判别语句中留存这种的代码

想通了那四个难点,那么最后的解除方式也可以有了。将id为8的客户的密码修正为8,然后传入一个userInfo的字符串‘8',突破查询防护,最终动用$userInfo['pass'] = $newPass将id修改为1。

最终的payload就是;

首先次提交, index.php?userInfo=a:2:{s:2:"id";i:8;s:4:"pass";s:12:"MAYBECHANGED";}&oldPass=MAYBECHANGED&newPass=8,目标是将id为8的客商的密码修改为8

其次次提交,index.php?userInfo=s:1:"8";&oldPass=8&newPass=1,这样系列化$userInfo得到的便是字符串‘8',即$userInfo = ‘8',那样数据库查询证实就可以透过。之后的if验证也足以由此,通过这行代码$userInfo['pass'] = $newPass;,由于$newpass的值为1,那么上述代码变为了$userInfo['pass'] = 1; ,$userInfo鉴于八个字符串类型,最终获得的是$userInfo='1',最终就能够立异id为1的客户的密码了。

修补情势

这种漏洞的修复格局也比较轻巧,事先定义好数据类型同临时间在使用时最好检查一下所接收的数据类型是还是不是和预期的少年老成致。不然就能够并发上述的绕过的主题材料。同一时间要调控好输入,对输入的多少要拓宽检讨不要恣意地运用。

参考

总结

如上就是那篇作品的全体内容了,希望本文的从头到尾的经过对大家的上学只怕职业能拉动一定的支持,要是有疑难大家能够留言沟通,谢谢大家对台本之家的支持。

编辑:澳洲幸运10资讯 本文来源:由php中字符offset特征造成的绕过漏洞详解_php技巧

关键词: