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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SERVER_SOFTWARE:运行服务器的名称和版本。
SERVER_NAME:服务器的主机名、域名或IP地址。
GATEWAY_INTERFACE:CGI规范的版本。
SERVER_PROTOCOL:请求使用的协议名称和版本,例如HTTP/1.1。
SERVER_PORT:服务器接收请求的端口号。
REQUEST_METHOD:请求使用的方法,例如GET、POST。
PATH_INFO:脚本后的额外路径信息,用于传递给脚本。
PATH_TRANSLATED:根据PATH_INFO转换后的实际路径。
SCRIPT_NAME:脚本的虚拟路径。
QUERY_STRING:URL中问号(?)后面的查询字符串。
REMOTE_HOST:发出请求的客户端主机名。
REMOTE_ADDR:发出请求的客户端IP地址。
REMOTE_USER:服务器进行认证后,认定的用户名称。
REMOTE_IDENT:用户的HTTP身份信息,如果HTTP服务器支持RFC 1413。
CONTENT_TYPE:对于POST请求,数据的内容类型。
CONTENT_LENGTH:对于POST请求,数据的长度。
HTTP_ACCEPT:客户端接受的MIME类型。
HTTP_USER_AGENT:发出请求的客户端浏览器的标识字符串。
HTTP_COOKIE:客户端发送的Cookie。

根据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的工作原理

  1. 根据net发送请求给服务器,服务器接收请求;
  2. 服务器将请求发送给CGI程序处理;
  3. CGI程序将处理好的结果发送给服务器;
  4. 服务器接收结果后将其发送给用户。

FastCGI

它是在原有的CGI上优化出来的产物。由于进程的创建和调度都需要一定的消耗,进程数量有限,因此基于CGI模式运行的网站一般不能接收大量请求,否则每个进程创造出来的子进程可能会导致服务器被挤爆或者瘫痪。FastCGI相较于原来的CGI,它更像是一种常驻型程序,减少了在进程创建和销毁方面的消耗,提高了处理Web请求的效率。

这个漏洞只出现在CGI运行模式中(如果我没记错的话:confounded:)

作者

Ins0mn1a

发布于

2024-03-19

更新于

2024-07-31

许可协议

# 相关文章
  1.81backdoor

:D 一言句子获取中...