PHP弱类型总结+绕过方式
注:是搜集总结的知识点
一.两种比较符号
==
和 ===
==
在进行比较的时候,会先将字符串类型转化成相同类型
,再进行比较。
===
在进行比较的时候,会先判断两种字符串的类型是否相等
,再进行比较。
如果一个数值和字符串进行比较的时候,会将字符串转换成数值。
看几个具体的例子:
1.
var_dump("admin"==0);//正确
将admin转化成数值,强制转化
,由于admin是字符串,转化的结果是0和0相等
2.
var_dump("admin1"==1);//错误
这里是将admin1
转化成了0
var_dump("1admin"==1);//正确
这里是将1admin
转化成了1
4.
var_dump("0e123456"==0);//正确
这里是将0e123456
转化成了0
将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
注意
当一个字符串被当作一个数值来取值,其结果和类型如下:
如果该字符串没有包含'.','e','E'
并且其数值值在整型的范围之内,该字符串被当作int
来取值,其他所有情况下都被作为float来取值
;
该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
二.MD5绕过(缺陷比较)
原理:通过利用一些MD5
加密后是0e
开头的,利用上面提到过的0e
科学计数法,转化结果还是0
;
<?php if($_GET['a'] !== $_GET['b']){ if(md5($_GET['a']) == md5($_GET['b'])){ echo "flag"; } } ?>
payload: /?a=QNKCDZO&b=240610708
搜集到的MD5神奇0e
240610708
0e462097431906509019562988736854
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
三.没有数字字母的
作用于过滤了字母数字,需要通过一些方式来绕过对字母数字参数的过滤,达到执行代码的目的。
1.取反绕过
在php位运算符中,有一种运算方式叫做取反,运算符号为^。可以利用的是UTF-8编码的某个汉字,并将其中某个字符取出来,然后取反,根据具体题目可以构造相关的payload。
2.URL编码取反绕过
对想要传入的参数,先进行URL编码再取反
比如传入构造一个phpinfo();
3.异或绕过
原理:PHP里两个字符串异或之后得到的还是一个字符串,有的时候会通过正则过滤这个字符串,不能正常的执行,换一种方式:就是通过找两个不会被正则的范围的两个字符串,进行异或,从而能够达到我们想要的字符串。
字符:? ASCII码:63 二进制: 0011 1111
字符:~ ASCII码:126 二进制: 0111 1110
异或规则:
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
1 XOR 1 = 0
上述两个字符异或得到 二进制: 0100 0001
该二进制的十进制也就是:65
对应的ASCII码是:A
重点是如何知道哪两个字符串异或是我们想要的最后的结果(这个还没有搞得清楚,后面会继续)
会继续一直整理,分模块进行归纳,下周加快学习进度。