1、md5绕过(Hash绕过)
PHP在处理哈希字符串时,会利用“!=”或“==”来对哈希值进行比较,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0
<?php
if($_GET['username'] == 'admin' && md5($_GET['password']) == '0e456789' ){
echo '正确';
}
2、in_array函数缺陷
in_array(search,array,type)**:**函数搜索数组中是否存在指定的值,存在返回True,否则返回False
search | 必需。规定要在数组搜索的值。 |
---|---|
array | 必需。规定要搜索的数组。 |
type | 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同 |
# in_array 第三个参数默认是False
<?php
$id = $_GET['id'];
if(in_array($id,array(1,2,3))){
echo "id值:$id <br/>";
$sql = "select * from test where id= $id";
echo $sql;
}else{
echo "不存在注入";
}
3、array_search函数缺陷
array_search(**value,array,strict**): 函数在数组中搜索某个键值,并返回对应的键名,否则返回False
value | 必需。规定需要搜素的键值。 |
---|---|
array | 必需。规定被搜索的数组。 |
strict | 可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素。可能的值: - true - false - 默认 |
如果设置为 true,则在数组中检查给定值的类型 |
# in_array 第三个参数默认是False
<?php
$array = array(1,2,3);
$a = "1a";
$b = "2a";
$c = "c";
var_dump(array_search($a,$array)); // 返回int(0)
var_dump(array_search($b,$array)); // 返回int(1)
var_dump(array_search($c,$array)); // 返回bool(false)
4、操作符比较
“==” 在进行比较的时候,会先将字符串类型转化成相同,再比较
“===” 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
<?php
var_dump("name" == 0); // true
var_dump("1name" == 1); // true
var_dump("name1" == 1); // false
var_dump("name1" == 0); // true
var_dump("0e123456" == "0e4456789"); // true
5、Switch绕过
<?php
$i = "1aaa";
switch($i){
case 0:
case 1:
echo "正确";
break;
}
6、St**rcmp函数缺陷
strcmp ( string $str1 , string $str2 ):**如果str1小于str2 返回 < 0;如果 str1大于str2返回 > 0;如果两者相等,其他返回 0
<?php
$password = $_GET['password'];
$pass = "123456";
if(isset($password)){
if(!strcmp($password,$pass)){
echo "密码正确";
}else{
echo "密码错误";
}
}else{
echo "请输入密码";
}
传入数组作比较返回null(某种意义相当于0)
strcmp与PHP版本有关
PHP5.2.1版本中使用strcmp比较数组和字符串时候会返回 int(1)
PHP5.3版本中使用strcmp比较数组和字符串时候会返回 null **