演示案例:
➢ WEB开发-弱类型&函数-特性安全
➢ WEB开发-数据对比-代码审计案例
这节课的内容一般ctf中比较多,代码审计可能有
1、== 和 ===
两个等号==是弱比较,使用==进行对比的时候,php解析器就会做隐式类型转换,如果两个值的类型不相等就会把两个值的类型转为同一类型进行对比。
1 | <?php |
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 | if(strcmp($_GET['pwd'], "admin123") == 0){ |
4、函数Bool类型比较缺陷
在使用 json_decode() 函数或 unserialize() 函数时,部分结构被解释成 bool 类型,也会造成缺陷,运行结果超出研发人员的预期。
json_decode()
1 | <?php |
unserialize()
1 | 序列化字符串怎么看懂? |
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开头字符串的都能登录。