#知识点:
1、过滤函数缺陷绕过
2、CTF考点与代码审计
#详细点:
1 ==与===
1.1 ==
1.2 ===
a是 ‘1’
2 md5
MD5函数缺陷绕过 ==弱对比 ===强类型对比
//echo MD5('QNKCDZO');
//echo MD5('240610708');
0e开头的MD5值相同
3 intval 缺陷绕过
将给定变量转换成整型变量。变量不能是array和object格式
$i='666';
$ii=$_GET['n'];
if(intval($ii==$i)){
echo $flag;
}
// 666.0 +666 都可以绕过
$i='666';
$ii=$_GET['n'];
if(intval($ii==$i,0)){
echo $flag;
}
//0x29a 使用了0 要换进制
//4、对于strpos()函数,我们可以利用换行进行绕过(%0a)
strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
string | 必需。规定被搜索的字符串。 |
find |
必需。规定要查找的字符。 |
start | 可选。规定开始搜索的位置。 |
<?php
$i='666';
$ii=$_GET['h'];
if(strpos($i,$ii){
echo $flag;
}
?>
//?num=%0a666
//5、in_array第三个参数安全
in_array() 函数搜索数组中是否存在指定的值。
参数 | 描述 |
---|---|
needle | 必需。规定要在数组搜索的值。 |
haystack | 必需。规定要搜索的数组。 |
strict | 可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。 |
$whitelist = [1,2,3];
$page=$_GET['i'];
if (in_array($page, $whitelist)) {
echo "yes";
}
//?i=1ex
//6、preg_match只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错
preg_match 函数用于执行一个正则表达式匹配。
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){ num的值不能输0-9
die("no no no!");
}
if(intval($num)){ num是数字类型才能输出flag
echo $flag;
}
}
//?num[]=1
//7、str_replace无法迭代过滤 (双写绕过)
str_replace() 函数替换字符串中的一些字符(区分大小写)。
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;
//?s=sselectelect
?>
➢ 原理-缺陷函数-使用讲解-本地
➢ 实践-CTFShow-PHP特性-89关卡
➢ 实践-代码审计-过滤缺陷-文件读取