随笔-PHP危险函数
- PHP审计工具
- PhpStorm jetbrains家的PHP编程语言开发的集成环境
- Windows: phpstudy + xdebug +Chrome插件 xdebughelper
- MAC: MAMP PRO + xdebug +Chrome插件 xdebughelper 配备了各种php的环境
- Fotify、seay、Kunyun-M 静态源代码审计工具
- 弱类型
- ==弱类型比较
- === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较。
- == 在进行比较的时候,会先将字符串类型转化成相同,再比较。
- 字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值则为0
- var_dump(“admin”==0); //true
- var_dump(“1admin”== 1); //true
- var_dump(“admin1″==0) //true
- 在进行弱类型比较时,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等
- var_dump(“0e123456″==”0e99999”); //true
- 当字符串当作数值来取值时,如果字符串中包含.、e、E或者数值超过整型范围内时,被当作float来取值,如果没有包含上述字符且在整形范围内,则该字符串会当作 int 来取值
- $test=1 + “10.5”; // $test=11.5(float)
- $test=1+”-1.3e3″; //$test=-1299(float)
- $test=1+”bob-1.3e3″;//$test=1(int)
- $test=1+”2admin”;//$test=3(int)
- $test=1+”admin2″;//$test=1(int)
- ture 和任意字符串弱类型相等,和非 0 数字若类型相等
- var_dump(“admin”== true); //true
- var_dump(“0admin”== true);//true
- var_dump(0==true);//false
- var_dump(-7==true);//true
- bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) 在 $haystack 中搜索 $needle ,如果第三个参数 $strict 的值为 TRUE ,则 in_array() 函数会进行强检查,检查 $needle 的类型是否和 $haystack 中的相同。如果找到 $haystack ,则返回 TRUE,否则返回 FALSE。
- 随机数安全缺陷
- PHP中生成随机数的函数有rand()和mtrand(),它们分别对应srand()和mtstrand()两个用于播种随机数种子的函数。
- 当随机数种子相同时,不管是rand()还是mtrand()产生的随机数序列都是相同的,如果seed泄露则会导致随机数序列的泄露。
- seed值较小,直接遍历爆破
- mt_srand(mt_rand(0,1000));
- 破解时要注意服务器时间可能存在偏差,需要设定一个较小的范围
- preg_系列安全缺陷
- preg_match () 函数用于执行一个正则表达式匹配
- preg_replace () 执行一个正则表达式的搜索和替换
- /i 修饰符大小写不敏感,如果没有使用 /i 的话,很容易使用大小写绕过。
- /m 多行匹配,但是当出现换行符 %0a的时候,会被当做两行处理,而此时只可以匹配第 1 行,后面的行就会被忽略。
- 变量覆盖
- 变量覆盖即通过外部输入将某个变量的值给覆盖掉。通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。
- register_globals 当register_globals=On,变量未被初始化且能够用户所控制时,就会存在变量覆盖漏洞。register_globals已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
- extract()函数
- 第二个参数指定函数将变量导入符号表时的行为,最常见的两个值是EXTR_OVERWRITE和EXTR_SKIP。当值为EXTR_OVERWRITE时,在将变量导入符号表的过程中,如果变量名发生冲突,则覆盖所有变量;值为EXTR_SKIP则表示跳过不覆盖。若第二个参数未指定,则在默认情况下使用EXTR_OVERWRITE。当extract()函数从用户可以控制的数组中导出变量且第二个参数未设置或设置为EXTR_OVERWRITE时,就存在变量覆盖漏洞
- parse_str()函数通常用于解析URL中的querystring,把查询字符串解析到变量中,如果没有array参数,则由该函数设置的变量将覆盖已存在的同名变量。
- mb_parse_str()函数用于解析GET/POST/COOKIE数据并设置全局变量,和parse_str()类似
- import_request_variables()函数将GET、POST、Cookies中的变量导入到全局。支持版本:PHP 4 >= 4.1.0, PHP 5 < 5.4.0
- 文件包含函数
- 当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。