这是我前几年写的和Web CGI相关的各种exp的集合。
通常情况下,web的应用架构是这样分层的:
- web应用程序
- web框架
- 脚本语言解释器
- web容器(服务器)
- web前端反向代理(通常是nginx等等.)
4
&5
有可能是同一个东西,甚至有些时候3
&4
也可能是同一个东西。
可以把上面的内容想象成一个数据管道,每一个分层做一些处理和解析。请求和返回就在这么一来一回两个管道中生存和传递。每一层和下一层如何沟通通讯?相对而言比较复杂,通常会有一些标准,包括内存共享,socket通讯等等。不同语言有不同的实现。在3
和4
分层之间的通讯模式,通常这种被叫做CGI,fastcgi和python的wsgi都是常见的标准协议。
但是由于web容器和脚本语言的位置不同,因此在对通讯的使用和信任上并不完全一致。会有一些错误和误解存在。这也就给了我们很多机会,利用这里面的功能去挖掘漏洞,实现我们想要实现的功能。例如远程代码执行,端口转发等等。
-
Fastcgi
fcgi_exp.go
:当fastcgi端口对外,或者配合SSRF
漏洞时候,可以利用此exp进行远程代码执行.fcgi_jailbreak.php
:对一些基于php自身配置形成沙盒的环境,可以利用此脚本进行越狱.
-
Apache Mod_php
mod_php和其他cgi不太一致的地方在于,他是以模块形式加载在apache进程中的,因此他可以操作进程中的相关资源。而apache的工作模式又通常是fork一些worker进程,会带入主进程的一些文件句柄可供操作。利用这些可以做一些很不错的trick。具体可以参考曾经的文章:《PHP端口复用的利用》
mod_php_port_reuse.php
:复用你的当前80端口链接,生成一个交互式的shell,可以绕过一些防火墙.mod_php_port_proxy.py
与mod_php_port_reuse.php
共用,可以直接复用当前80端口链接,进行端口转发通讯.
Python 通常来说主要使用的就是wsgi模式做统一接口。但是在具体实现上有uwsgi
、gunicorn
、scgi
、mod_python
、fastcgi
等多种。但是最常见的还是uwsgi
、gunicorn
这两个。其中uwsgi
由于支持功能较多,通过协议直接传参,因此可以被利用。
- Uwsgi
uwsgi_exp.py
:利用uwsgi协议,远程执行任意命令,原理和使用场景和php fastcgi类似.具体可以参考《uWSGI 远程代码执行漏洞》