PHP 主要适用于Web开发领域
用户输入经过操作,进入危险函数,执行危险操作
用户输入指GPCSF、数据库、文件等输入点,危险函数包括include、system等。
用户输入的危险操作要是被转义或者过滤就不能被执行成功(这也是我们写代码时要注意的,代码中得有过滤和转义部分,以防留下非常简单的漏洞)
人工审计
(1) 跟踪用户可控的输入,比如GET参数,看它到哪一步,是否进入危险函数中;
(2) 找到危险函数,看进入这个函数的参数是否可控,找来源,判断输入点。
分析时,最好首先看看是否有框架、MVC,是否有通用过滤等,便于审计。
源码结构:
一般库文件都是在include文件夹里
注重点有:
函数集文件:命名中包含functions,common等关键字;
配置文件:命名中包含config关键字;
安全过滤文件:filter,safe,check;
index文件:程序的入口文件。
PHP代码可能存在的漏洞:
基本的包括 反射型 和 存储型 ,关键在于寻找没有过滤就被输出的参数
常用的输出函数有:
echo,print,print_r ,printf,sprintf,die,var_dump,var_export
用户输入没有经过过滤函数,同时在函数执行时也没有相应的过滤和转义,直接输出到html代码中造成xss漏洞,找到这些输出函数来挖掘XSS漏洞。
若 Head头可控,并没有过滤任何xss字符,可以伪造IP,构造payload.
用户的输入最终可以直接当作代码执行,没有任何转义和过滤。
危险函数mysql_query
GetIP()函数,ip可以伪造,构造一个Payload。
addslashes()函数:在每个预定义字符前加反斜杠
预定义字符:单引号、双引号、反斜杠、NULL。
默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。
对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
可用于文件包含的函数有
include(),include_once(),require(),require_once()。
审计时注意以上函数
文件操作类漏洞,寻找跟文件操作有关的函数:
file_get_contents(),highlight_file(),fopen(),readfile(),fread(),fgetss(),fgets(),parse_ini_file(),show_source(),file().
文件删除漏洞常用函数unlink(),老版本下session_destroy()函数也可以用于删除文件。
可以执行命令的函数有
system(),exec(),shell_exec(),passthru(),pcntl_exec(),popeb(),proc_open(),
反引号(`)也可以调用shell_exec()函数进行命令执行
可以用自定义的参数值替换原有的变量值,常见函数:
extract(),parse_str(),
<?php
$b=1;
$a=array('b'=>'2');
extract($a);
print_r($b);
?>
这样b就被覆盖为2
<?php
$b=1;
parse_str('b=2');
print_r($b);
?>
这样b也被覆盖为2
还有一种利用$$的方式注册变量没验证已有变量导致变量覆盖的情况也有发生