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
针对以上安全配置,其中有一些配置是可以被绕过的(仅列举实战中我遇到的):
-
open_basedir
- 从0学习bypass open_basedir姿势 - 先知社区 (aliyun.com)
- https://blog.csdn.net/snowlyzz/article/details/126310439
以上都是手动绕过原理,实战中一般直接使用插件/工具绕过(蚁剑插件、哥斯拉插件等)
-
disable_functions:一般直接使用插件/工具绕过(蚁剑插件、哥斯拉插件等)
phpinfo信息利用点梳理
在实战中,我们常常能获取到phpinfo信息,下面对其中的可能存在的利用点进行梳理
-
System:操作系统版本等信息(基础信息)
获取具体系统版本,可以用来搜索已知漏洞
-
Server API:显示当前 PHP 实例使用的服务器接口模块。如果使用的是
FPM/FastCGI
,可以衍生出基于FastCGI的众多攻击手法基于FastCGI的众多攻击手法和原理,可参考这两篇文章:
-
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等,扩展项一般有自己独立的显示框,如下
能够获取组件/程序的版本,可以尝试查找历史漏洞,下面列举一些值得关注的组件/程序(爆出过历史漏洞的)
- imagick
- libxml
- memcache
- redis
- xdebug
- imap
- mysql
- opcache
最后这里放一个github项目,可以提取phpinfo中的信息,不过年代久远,可以在此基础上进行二开