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 。 看看存不存在可控变量 。