此文不会赘述web通用攻击手法(如sql注入、xss、ssti等),仅列举针对php平台的攻击手法

php平台常见防御手段梳理及对抗

PHP.INI中进行安全配置

这类防御手段通过配置PHP.INI的安全选项,达到防御的目的

安全模式 #推荐还是开启防止大部分PHP攻击
safe_mode = On

用户组安全模式 #推荐还是开启防止大部分PHP攻击
safe_mode_gid = On

控制PHP能够访问的目录 #推荐还是开启防止大部分渗透
open_basedir = "${doc_root}:/tmp"

关闭危险函数 #推荐还是开启防止被人利用
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,show_source,get_cfg_var,disk_total_space,disk_free_space;

关闭PHP版本信息在http头中的泄漏 #推荐还是开启防止被人利用
expose_php = On

关闭注册全局变量 #推荐还是开启防止被人利用
register_globals = Off

打开magic_quotes_gpc来防止SQL注入 #推荐还是开启防止被人利用
magicw_quotes_gpc = On

针对以上安全配置,其中有一些配置是可以被绕过的(仅列举实战中我遇到的):

phpinfo信息利用点梳理

image-20240403163125691

在实战中,我们常常能获取到phpinfo信息,下面对其中的可能存在的利用点进行梳理

  • System:操作系统版本等信息(基础信息)

    获取具体系统版本,可以用来搜索已知漏洞

  • Server API:显示当前 PHP 实例使用的服务器接口模块。如果使用的是FPM/FastCGI,可以衍生出基于FastCGI的众多攻击手法

    基于FastCGI的众多攻击手法和原理,可参考这两篇文章:

    https://xz.aliyun.com/t/9544

    https://zhuanlan.zhihu.com/p/620014838

  • DOCUMENT_ROOT:网站的绝对路径(对于写shell时很可能有很大的帮助)

  • SERVER_ADDR:真实ip,通过这个参数可以得到网站服务器的真实ip无视CDN

    全称$_SERVER['SERVER_ADDR']_SERVER['SERVER_ADDR']。也有说$_SERVER['HTTP_HOST']_SERVER['HTTP_HOST']http_x_real_ip会泄露真实ip,但我没遇到过

  • allow_url_include:该项如果开启,则支持远程文件包含,如果有存在文件包含的文件则可直接getshell,或可以使用php伪协议

  • disable_functions:查看禁用的函数

  • DOCUMENT_ROOT:Web根目录

    全称$_SERVER['DOCUMENT_ROOT']_SERVER['DOCUMENT_ROOT']

  • asp_tags:是否允许在PHP代码中使用ASP风格的标签。php标签有4种形式,如果这个选项不开启的话(一般默认不开启),使用asp的标签是不会解析的

    注意,PHP7中不再含有asp_tags项

  • short_open_tag:是否允许使用短标签形式(即<? ?>)来表示PHP代码块

    php的常识,<?=等价于<? echo

  • enable_dl:是否允许动态加载(dynamic loading)扩展模块(DLL文件)。若要利用扩展库绕过disable_functions,需要开启这个选项才能使用dl()函数

  • magic_quotes_gpc:是否开启对SQL注入进行防御

  • _FILES[“file1”]:临时文件路径。向站点的 phpinfo 页面 post 一个 webshell(自己本地写一个post表单上传页面即可),可以在_FILES [“file1”] 中看到上传的临时文件,搭配文件包含,便可以直接 getshell

    # 这里附一个post表单上传的代码,选择文件后,点击Submit提交
    <!doctype htm1>
    <html>
    <body>
        <form action="http://localhost/test/phpinfo.php" method="POST" enctype="multipart/form-data">
            <input type="file" name="file" /><br>
            <input type="submit" name="submit" value="Submit" />
        </form>
    </body>
    </html>

    打靶遇到过,实战没碰到过,利用条件太苛刻

  • DB_USERNAME/DB_PASSWORD:泄露数据库账号密码

    如果开发者把数据库信息设置到环境变量中就会显示。此外,直接搜索USERNAME、PASSWORD等关键词也是查找信息泄露的常规方法

  • allow_url_fopen:是否允许将URL(HTTP、HTTPS等)作为文件打开处理。

  • allow_url_include:是否允许includeI()和require()函数包含URL(HTTP、HTTPS)作为文件处理。

    allow_url_fopen和allow_url_include是一对,如果同时开启,可能导致远程文件包含漏洞

  • Protocols:支持的网络协议。比较引人注目的就是GOPHER协议了,如果支持GOPHER协议,就能配合SSRF漏洞利用起来

  • Configuration File (php.ini) Path或Loaded Configuration File:php.ini文件路径

  • 扩展项:安装的组件/程序也会显示在phpinfo上,比如mysql等,扩展项一般有自己独立的显示框,如下

    image-20240405162253326

    能够获取组件/程序的版本,可以尝试查找历史漏洞,下面列举一些值得关注的组件/程序(爆出过历史漏洞的)

    • imagick
    • libxml
    • memcache
    • redis
    • xdebug
    • imap
    • mysql
    • opcache

最后这里放一个github项目,可以提取phpinfo中的信息,不过年代久远,可以在此基础上进行二开

proudwind/phpinfo_scanner: 一个抓取phpinfo重要信息的小工具 (github.com)

Comments

2024-04-02

⬆︎TOP