函数:
in_array()(判断一个值是否在某一个数组列表里面)
is_numeric()(判断一个变量是否是数字)
==(双等于==与三等于===的区别在于双等于在判断前会做变量转换,而三等于不会)
0×01 in_array()函数
<?php $family = array(“xy”, “wjw”); if (in_array($_GET[‘id’], $family)) { echo “匹配已找到”; } else { echo “匹配未找到”; } ?>
如果请求/test.php?id=xy则结果如下:
匹配已找到
将id改为1,结果则是匹配未找到,将上面的代码改一下进行此函数的漏洞测试
<?php $family = array(1,2,3,4); if (in_array($_GET[‘id’], $family)) { echo “匹配已找到”; } else {
echo “匹配未找到”;
}
?>
如果我们请求/test.php?id=1’ union
select…最终输出竟然也是“匹配已找到”,因此可以看到,虽然我们输入的不是数组里面的值,但是还是可以绕过这个检测并且注入成功,因为in_array函数存在一个问题,就是比较之前会自动做类型转换,而这种漏洞的形成是因为我们没有设置第三个参数,用于严格的执行漏洞检查。
0×02is_numeric()函数
<?php echo is_numeric(1234); # 1 echo is_numeric(‘1234’); # 1 echo is_numeric(0x1234); # 1 ?>
可以发现当传入的参数为hex的时候则通过并返回ture,而mysql是可以直接使用hex编码代替字符串明文的,所以这块虽然不能直接注入SQL语句,但是存在二次注入的隐患,将‘or
1=1’hex编码之后为‘0x276f7220313d3127’,就可能导致注入漏洞
0×03双等于和三等于
<?php
echo($_GET[‘var’]==99);
?>
当我们请求为’/test.php?var=1’的时候,页面无输出,说明两个值不相等,当我们请求为’/test.php?var=99’的时候,页面输出1,说明此时两个量值相等,当我们请求为’/test,php?var=99qwqacwef’的时候,此时页面也输出的是1,也就是在此处判断之前完成了变量类型转换
账户体系中的越权漏洞
类型:
水平越权
垂直越权