CVE-2012-1823复现
CVE-2012-1823
简单复现
根据提示,可以进入index.php看看有没有什么信息
并没有存在什么信息,根据提示,当输入/index.php?-s
时会暴露后端源码
漏洞全貌大概就这样
漏洞成因
先引入一个概念和它引申的分支
什么是CGI(:confused:)
Common Gateway Interface,即通用网关接口,它是一个Web服务器主机提供信息服务的标准接口,Web服务器通过这个接口来获取客户端提交的信息,然后转交给服务端的CGI程序处理,最后再返回给客户端。
PHP-CGI
它是一个用于处理PHP脚本的可执行文件。该文件使用CGI来与WEB服务器通信,在接收HTTP请求的同时处理PHP脚本,然后再将结果返回给WEB服务器
SAPI是什么
Server Application Programming Interface,服务器应用编程接口,实际上它定义了一个统一的接口,提供了外部应用与PHP通信交互的管道,Apache的mod_php和常见的fpm(用于管理FastCGI后端的进程)都是SAPI,这里我们要说的php-cgi也是一种SAPI
进入正题
直接成因
用户请求的querystring被作为了php-cgi的参数,并导致了一些结果
:::info
querystring,即查询字符串,它是url的一部分,用于传递其他参数和数据,www.example.com/?key=value
中,querystring为?
后面的一部分
:::
深究一下
看了看其他大佬的文章,发现CGI有如下参数
1 | SERVER_SOFTWARE:运行服务器的名称和版本。 |
根据RFC3875对Command Line的描述:
Some systems support a method for supplying an array of strings to the CGI script.This is only used in the case of an 'indexed' HTTP query, which is identified by a 'GET' or 'HEAD' request with a URI query string that does not contain any unencoded "=" characters. For such a request, the server SHOULD treat the query-string as a search-string and parse it into words, using the rules
大致意思是querystring中如果不包含未编码的=
。就会把querystring作为cgi的参数传入
如何利用
CGI模式下有几个参数可以用:
-c
指定php.ini文件的位置-n
不要加载php.ini文件-d
指定配置项-b
启动fastcgi进程-s
显示文件源码-T
执行指定次该文件-h
和-?
显示帮助
由于我们是在CGI模式下复现的,因此可以直接传递参数,效果已经在前面展示过了
还有一种用法就是通过-d
来实现getshell,例如把文件包含功能打开,用文件包含漏洞
总结
实际上还是远程命令执行漏洞,攻破命令这一关之后用什么啥方法都行:laughing:
其他可以了解的
CGI的工作原理
- 根据net发送请求给服务器,服务器接收请求;
- 服务器将请求发送给CGI程序处理;
- CGI程序将处理好的结果发送给服务器;
- 服务器接收结果后将其发送给用户。
FastCGI
它是在原有的CGI上优化出来的产物。由于进程的创建和调度都需要一定的消耗,进程数量有限,因此基于CGI模式运行的网站一般不能接收大量请求,否则每个进程创造出来的子进程可能会导致服务器被挤爆或者瘫痪。FastCGI相较于原来的CGI,它更像是一种常驻型程序,减少了在进程创建和销毁方面的消耗,提高了处理Web请求的效率。
这个漏洞只出现在CGI运行模式中(如果我没记错的话:confounded:)
CVE-2012-1823复现