还是挺重要的
PHP函数记录
1)php函数md5
ps.
sha1,由于此函数依赖的算法已不足够复杂,不推荐使用此函数对明文密码加密。目前大多用md5但是和md5一样,sha1函数无法处理数组,遇到数组会返回NULL
做题时,了解到了一个新的函数md5
php md5函数介绍为:
md5( string , raw )
string : 规定需要计算的字符串
raw : 规定十六进制或二进制输出格式。
true:16字符二进制格式
false(默认): 32字符十六进制数
比较常用的
数字型:129581926211651571912466741651878684928
字符型:ffifdyop
发现都有’or
‘的形式,可以构造必真的结果
MD5函数有一个漏洞,当输入的为数组时,会返回为NULL
所以当遇到md5(p1)===md5(p2),把p1和p2进行强比较时,又要求p1和p2不相等
由于两个不同的字符MD5值很难一致,于是输入p1[]和p2[]两个名字一致的字符,随便赋值,
p1[]=1&p2[]=2
返回为空,使得强比较成立
为什么会这样呢
我想起之前的遇到一个题,也有数组,问了一下大佬大佬说,因为没有对数组中的元素数量声明,函数不知道数组元素第几个的值是1(或2)
导致函数到处扫,最后返回NULL【因为这个元素位置我们根本就没定】下面举几个例子,以我个人理解
如果是
p1[0]=1&p2[0]=2
是可以的,因为只定义了0号位的数据,而且不相等,其他位置数据没定义,所以比较也不可能出现相等p1[0]=1&p2[1]=1
是可以的,因为这里p1[]定义了0号位为1,而p2定义的是1号位为1,比较是按顺序比较的,两个数值虽然一样,但是位置不一样,所以比较还是不相等
1 | 下列的字符串的MD5值都是0e开头的: |
2)php函数ereg,null截断
此函数在 PHP 5.3.0中已弃用,并在PHP 7.0.0中删除。
[所以遇到无法执行时,可能是出题人没有注意部署题目环境]
1 | ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。 |
所以现在一般不再使用ereg
,只是做为preg_match
替代函数使用
3)php函数sleep
当遇到这种需要我们输入参数,但是让参数值必须很大,
而且最后又以这个参数执行sleep函数,就会让我们等很久
1 | sleep((int)$time) |
sleep()
要延缓其程序执行的时间。
但是我们又不能等太久,可以构造php中的科学计数法绕过,就构造一个
time=0.3e7 (等价于0.3乘10的7次方)
这样它的值达到了判断的标准。
而且当它强制转化为整数型(int
)的时候就会因为开头为0.3
是小数变成零,这样可以满足条件。
4)php函数is_numeric()
当遇到类似
0e..;1e;..2e..;...
函数会把其当作科学计数法
这样当遇到
1 | if ($num == 0) { |
这种
第一个要弱类型为
0
第二个要不为
0
才能执行真的判断第三个要求其为数字
就可以用类似0e2
,绕过这三个
5)eval()函数和system()函数的比较
记录一次在打靶机时,因为平常习惯用 eval()函数,但是靶机执行nc等命令时,eval()函数没有反应,就是因为其是代码执行,而非命令执行,所以把两者本质的用法搞懂还是很必要的
eval类型函数是代码执行而不是命令执行(一句话木马)
system类型函数是命令执行而不是代码执行
eval函数里必须是一个符合php语法的语句,如果语句结尾没有分号会报错:eval()’d code
6)PHPのmb系列函数返回值
https://github.com/php/php-src/issues/9008
它会导致奇怪的结果。
1
2
3
4
5
6
7
8
9
10
11
$string = "PHP";
mb_detect_order(["ASCII","UTF-8","BASE64"]);
var_dump(
mb_detect_encoding($string, null, true),
mb_detect_encoding($string, mb_detect_order(), true),
mb_convert_encoding($string, "UTF-8", "BASE64"),
mb_strtolower($string, "BASE64"),
?>得到的结果发现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Output for 8.2.0
string(5) "ASCII"
string(5) "ASCII"
string(2) "<s"
string(4) "PHM="
Output for 8.0.1 - 8.0.26, 8.1.10 - 8.1.13
string(5) "ASCII"
string(5) "ASCII"
string(2) "<s"
string(4) "PHM="
Output for 8.1.0 - 8.1.9
string(6) "BASE64"
string(5) "ASCII"
string(2) "<s"
string(4) "PHM="
mb_detect_encoding($string, null, true)
返回值只有在
PHP
版本在8.1.0 - 8.1.9
时会返回base64
,而在其他版本都是默认识别为ASCII
mb_detect_encoding()
这类的函数对内容进行编码的识别,就是匹配内容中的一些符合编码的字符,匹配成功对应编码加分
,最后从头到尾匹配完成后,打分最高的编码就被认为是该内容的编码
7)preg_match(‘/^$/‘)
可以用%0a
绕过,
比如,
1 | preg_match('/^123$/',$a) |
一般情况只有$a
为123
时才可以通过,但是用换行符号%0a
就可以绕过