利用 Apache Mod CGI
使用条件:
Linux 操作系统 Apache + PHP (apache 使用 apache_mod_php) Apache 开启了
cgi
、rewrite
Web 目录给了
AllowOverride
权限当前目录可写
原理简述
早期的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一个进程,效率提高了。
Apache在配置开启CGI后可以用ScriptAlias指令指定一个目录,指定的目录下面便可以存放可执行的CGI程序。若是想临时允许一个目录可以执行CGI程序并且使得服务器将自定义的后缀解析为CGI程序执行,则可以在目的目录下使用htaccess文件进行配置,如下:
Options +ExecCGIAddHandler cgi-script .xxx
这样便会将当前目录下的所有的.xxx文件当做CGI程序执行了。
由于CGI程序可以执行命令,那我们可以利用CGI来执行系统命令绕过disable_functions。
利用ctfhub复现
一个是GetFlag
点进去看
另外一个是清空backdoor目录
backdoor目录下的index.php自带了shell
我们蚁剑连上去
查看根目录
有个/readflag
查看phpinfo
被禁掉一大堆函数
这里可以使用蚁剑的插件来绕过
也可以自己写.htaccess
Options +ExecCGI
AddHandler cgi-script .ant
上传到网站上
再写个shell.ant上传上去
#!/bin/sh
echo&&id
直接访问是不行的要赋予可执行权限
?ant=chmod('shell.ant',0777);
不知道为什么这里执行不了啊
始终无法访问啊😭
可插件却可以执行