0%

第29天-PHP应用&弱类型脆弱&Hash加密&Bool类型&Array数组&函数转换比较

演示案例:

➢ WEB开发-弱类型&函数-特性安全

➢ WEB开发-数据对比-代码审计案例

这节课的内容一般ctf中比较多,代码审计可能有

1、== 和 ===

两个等号==是弱比较,使用==进行对比的时候,php解析器就会做隐式类型转换,如果两个值的类型不相等就会把两个值的类型转为同一类型进行对比。

1
2
3
4
5
6
7
8
<?php
$type==$GET['a'];
if($type='pay'){
echo 'ok';
}else{
echo 'no';
}
如果$type是0那会输出ok,一个数字和字符串进行比较会把字符串转换成数字类型,pay也没有数字那就是0

2、MD5对比缺陷

进行hash加密出来的字符串如存在0e开头进行弱比较的话会直接判定为true,只有 0e 开头、后面全部是数字的两个字符串,用==弱比较,才会都被转成数字 0,结果为 true

QNKCDZO

0e830400451993494058024219903391

240610708

0e462097431906509019562988736854

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

s214587387a

0e848240448830537924465865611904

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s1885207154a

0e509367213418206700842008763514

3 函数strcmp类型比较缺陷

低版本的strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。

1
2
3
4
if(strcmp($_GET['pwd'], "admin123") == 0){
echo "登录成功";
}
传入数组来绕过,?pwd[]=1,数字不行get传入转换为字符串了

4、函数Bool类型比较缺陷

在使用 json_decode() 函数或 unserialize() 函数时,部分结构被解释成 bool 类型,也会造成缺陷,运行结果超出研发人员的预期。

json_decode()

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$real_pwd = "admin123";
$data = json_decode($_GET['json'], true);
if ($data['pass'] == $real_pwd) {
echo "登录成功";
} else {
echo "密码错误";
}
?>

login_json.php?json={"pass":true}输入这个也是登录成功,和login_json.php?json={"pass":admin1
23}效果一样

unserialize()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
序列化字符串怎么看懂?
类型标记:长度:值;
数组是 a:个数:{里面一堆成员}
标记对照表(审计最常用)
a → array 数组
s → string 字符串
i → int 整数
b → bool 布尔(b:1;=true,b:0;=false)
d → float 浮点数
N → null,直接 N;

<?php
$real_pwd = "mima123";
$data = unserialize($_GET['u']);
if($data['pwd'] == $real_pwd){
echo "登录成功";
}else{
echo "密码错误";
}
?>
xxx.php?u=a:1:{s:3:"pwd";b:1;}输入这个也是登录成功,和xxx.php?u=a:1:{s:3:"pwd";s:7:"mima123"
;}

5、函数switch 类型比较缺陷

当在switch中使用case判断数字时,switch会将参数转换为int类型计算

6、函数in_array数组比较缺陷

当使用in_array()或array_search()函数时,如果第三个参数没有设置为true,则in_array()或array_search()将使用松散比较来判断,松散比较就是弱对比和上面没区别,不写案例了

<font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">in_array(要找的值, 数组, [是否强比较])</font>``<font style="color:rgb(0, 0, 0);background-color:rgba(0, 0, 0, 0);">array_search(要找的值, 数组, [是否强比较])</font>

7、===数组比较缺陷

注意此时遇到的是 “===” ,不过也不是代表无从下手。在md5()函数传入数组时会报错返回NULL,当变量都导致报错返回NULL时就能使使得条件成立。

8、案例

CTF题目:

https://ctf.bugku.com/challenges/detail/id/72.html

这个也是弱比较,用1abs这种字符串即可绕过

https://ctf.bugku.com/challenges/detail/id/94.html

这个还是md5对比缺陷一样

代码审CMS:

https://mp.weixin.qq.com/s/k1hRg7cmRwwJJyyX04Ipmg

这个不讲了和上面MD5对比缺陷一样,就是注册的时候密码设置为加密后能为0e开头的密码,然后登录的时候只要能通过md5加密成0e开头字符串的都能登录。