PHP|代码审计思路之PHP代码审计( 六 )


一般就这几个函数和关键词
extract
parse_str
import_request_variables
mb_parse_str
$$

不过还有个特殊的配置 , 也可能造成变量覆盖
register_globals全局变量覆盖
php.ini中有一项为register_globals , 即注册全局变量 , 当register_globals=On时 , 传递过来的值会被直接的注册为全局变量直接使用 , 而register_globals=Off时 , 我们需要到特定的数组里去得到它 。

注意:register_globals已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除 。
当register_globals=On , 变量未被初始化且能够用户所控制时 , 就会存在变量覆盖漏洞:
<?php
echo “Register_globals: “ . (int)ini_get(“register_globals”) . “<br/>“;

if ($a) {
echo “Hacked!”;

?>

通过GET和POST方式输入变量a的值:

当然 , 也可以从COOKIE中输入:

6.2.9. 代码执行漏洞审计要素

  • php.ini文件中的disable_function是否有禁用函数 。
  • 是否存在代码执行的敏感函数 。
  • 是否输入变量可控 。
全局搜索下面的关键词 , 回溯参数可不可控 。
eval
asser
preg_replace
create_function
array_map
call_user_func
call_user_func_array
array_filter
usort
uasort
$a($b)(动态函数)

6.2.10. 命令执行漏洞审计要素
  • 参数是否用户可控
  • 是否配置了全局过滤器 , 过滤规则是否符合安全规范
  • 是否所有的命令执行参数都经过了过滤器 , 或受白名单限制
全局搜索下面的关键词 , 回溯参数可不可控 。
exec
passthru
proc_open
shell_exec
system
pcntl_exec
popen

“(被反引号包裹的变量也可以执行)
6.2.11. 任意文件下载/下载漏洞审计审计要素
  • 是否存在…/、.、…\\等特殊字符过滤 。
  • 参数是否用户可控
  • 是否配置了相对路径或者绝对路径 。
查询这些关键词 , 查看变量是否可控 , 是否有过滤
fgets
fgetss
file_get_contents
readfile
parse_ini_file
highlight_file
file
fopen
readfile
fread

**Tip:**前两天遇到个 , 过滤了config/database.php这样的正则匹配 , 还过滤了… , 目的是防止目录穿越 , 读取服务器其他目录的文件 , 可是没过滤一个.
这样我使用config/./database.php绕过了正则 , 照样把敏感文件读取出来了 。。。
6.2.12. 任意文件删除和上面的下载一样
搜索的关键词变了
rmdir
unlink

6.2.13. 任意文件写入还是一样 , 关键词为
copy
file_put_contents
fwrite

6.2.14. 会话认证漏洞会话认证漏洞实际上涉及的方面比较广 , 如cookie、session、sso、oauth等 , 当然这个漏洞比较常见是在cookie上 , 服务端直接取用cookie中的数据而没有校验 , 其次是cookie加密数据在可预测的情况下 。
审计要素
  • 是否cookie中的加密数据可预测 。
  • 是否cookie中的数据可预测 。
  • 服务端是否只依赖cookie来判断用户身份 。
全局去寻找cookie生成的逻辑 , 判断是否可预测 , 判断用户身份是否只依赖cookie , 而不是随机的 , 比如
鉴权是只通过cookie中的userid来判断 , 如果我遍历userid , 可以达到登录绕过或越权的目地 。
6.2.15. 反序列化漏洞一般实际审计的时候 , 项目中见的比较少 , 框架中见的比较多 。
全局搜索serialize 。 看看存不存在可控变量 。