HTTP请求的生命周期
一次请求的流向
一次HTTP请求实际上是经过了客户端->web容器->脚本解释器->数据库服务来进行处理的. 流程图大致如下:
逻辑上整个服务器是分为多层处理请求的, 分层大致如下表:
层 | 组件 |
---|---|
静态层 | JS, css, html, … |
脚本层 | PHP, asp.net, jsp, python, … |
数据层 | Access, SQL Server, Oracle, MySql, Mongodb, SQLite, … |
服务层 | Nginx, Apache, IIS, … |
系统层 | Linux, Windows, … |
web组件架构
一个常见的架构如下
文件上传
当我们访问一个后缀不能被web容器解析的文件时, web容器会返回那个文件本身而不会交给脚本层进行处理.
如果waf对文件后缀的过滤不完全, 例如虽然过滤了所有可以被web服务解析的文件后缀(.php, .aspx等), 但是没有过滤容器的配置文件. 我们就可以通过上传容器配置文件来让容器可以解析任意的文件后缀, 把任意文件当作脚本文件传递给脚本层来执行. 从而绕过waf来执行恶意代码.