本文最后更新于:2024年4月20日 晚上
PHP弱类型
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
==是不严格的等号
1 2 3 4 5 6 7 8
| 123abc 会转成: 123(后面的就都舍弃了)
123a1231231321 会转成: 123
abc 会转成: 0
|
1 2 3 4 5 6 7
| <?php var_dump("admin" == 0); var_dump("1admin" == 1); var_dump("admin1" == 1) var_dump("admin1" == 0) var_dump("0e123456" == "0e4456789"); ?>
|
哈希(md5)绕过问题
MD5 值就是一串 128 bit 的数据。
MD5 的核心是通过算法把任意长度的原始数据映射成128 bit 的数据
MD5 的特点:
不可逆性 --- 根据 MD5 值计算不出原始数据
唯一性 --- 不同原始数据会有不同的 MD5 值 (不完全可靠,后面说)
一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串(字母大小写均可)
第一关 登录的哈希验证
1 2 3
| $a != $b Md5($a) == md5($b) '0e545993274517709034328855841020' == '0e342768416822451524974117254469'
|
1 2 3 4 5 6 7
| 常用的 MD5 碰撞有: 原值 MD5 QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020
|
第二关 登录的哈希验证 v2
1 2 3 4 5 6 7 8 9
| $a != $b Md5($a) === md5($b)
null === null md5(array) -> null
XXXXX.com/?a[]=1&b[]=2
|
第三关 登录的哈希验证 v3
1 2 3 4
| (string)$a != (string)$b md5($a) === md5($b)
md5碰撞 两个不同的东西拥有相同的md5:
|
MD5碰撞的一些例子 -
简书 (jianshu.com)
一些拓展:
1 2
| $md5 == md5($md5) 可以看成$a == md5($a) 需要一个md5 和 md5(md5)都是θe开头
|
1 2
| $a == md5(md5($a)) a = 0e1138100474
|
1 2
| $numPositive = intval($num) $numReverse = intrval(strrev($num))
|
如果我们要求一个数字满足
①numPositive 等于 num,要求是一个整数(但是这样的话就不能满足②
②numPositive 等于 numReverse 并且 num
不是回文序列:这里可以100.0010
所以我们可以用浮点精度来绕过,
1 2 3 4 5
| <?php var_dump(1.000000000000001 == 1); var_dump(1.0000000000000001 == 1); var_dump(1.0000000000000001 === 1); ?>
|
num = 10000000000000000000.000000000000000000010
变量覆盖
1 2 3 4
| 用传参的值替换掉原有变量的值 Extract() Parse_str() Import_requests_variables()
|
随机数问题
1 2 3
| Mt_rand()种子 mt_rand()函数用于生成随机数 mt_srand(seed)给随机数发生器播种
|
爆破——死板,100题遇不到1题
[GWCTF 2019]枯燥的抽奖 |
NSSCTF
无需爆破:
无需暴破还原mt_rand()种子-安全客
- 安全资讯平台 (anquanke.com)
遇到种子有时间限制的时候
参考:
CTF-WEB:PHP
弱类型 - 乌漆WhiteMoon - 博客园 (cnblogs.com)