이번 포스트에서는 OS Command Injection 기법에 대해서 다루겠다.
OS Command Injection
OS Command Injection의 정의 :
웹 응용 프로그램의 개발에 사용하는 언어의 대부분은 셸을 통해 OS 명령어를 실행할 수 있다. 셸을 통해 OS 명령을 실행하거나 개발에 사용된 기능이 내부적으로 셸을 사용해 구현된 경우 의도하지 않은 OS 명령이 실행될 수 있다. 이 취약점을 OS 명령어 인젝션이라고 한다.
OS Command Injection의 발생 원인 :
셸에서 2개 이상의 명령어를 한 줄에 실행할 수 있기 때문에 원래의 명령 이외에 다른 명령을 실행할 수 있다.
OS Command Injection이 왜 위험한가?
OS 명령어 인젝션이 발생한 경우 웹 서비스 상의 모든 페이지가 영향을 받는다. 또한 공격자는 해당 취약점을 활용하여 기밀 정보 유출 및 데이터를 변조하거나 삭제할 수 있으며, 시스템을 정지시킬 수도 있다.
OS Command Injection 방어법 :
OS 명령어 인젝션 공격을 대비할 수 있는 방안은 다음과 같다.
- 셸 호출 기능이 있는 함수의 사용을 피한다.
- 셸 호출 기능이 있는 함수에는 외부로부터 매개변수를 전달할 수 없게 한다.
- OS 명령어에 전달할 매개변수를 안전한 함수를 통해 이스케이프한다.
간단한 OS Injection 공격 예시
아래 그림과 같이 문의사항을 제출할 수 있는 페이지가 있다. 그리고 이 페이지는 메일 주소와 문의내용을 입력받고 있다.
정상적인 문의사항을 입력해보겠다.
이어서 발송 버튼을 클릭해보겠다.
문의가 정상적으로 접수됐다는 문구가 나온다.
그럼 이어서 OS 명령어 인젝션 공격을 실행해보겠다.
## 공격 코드 : jyosun@hack.com;cat /etc/passwd
## 실행 결과 :
OS 명령어가 성공적으로 삽입됐다는 것을 확인할 수 있다.
페이지의 메일 주소를 처리하는 소스 코드만 발췌하여 살펴보면 다음과 같다.
<?php
$mail = filter_INPUT(INPUT_POST, 'mail');
system("/usr/sbin/sendmail -i <template.txt $mail");
?>
<body>
문의가 접수됐습니다.
</body>
시스템이 sendmail 명령어를 호출하여 우리가 입력한 이메일 주소로 메일을 보낸다. (메일 문구는template.txt에 저장된 내용으로 고정하고 있다)
여기서 보면 $mail 변수에 대한 아무런 이스케이프 처리도 취하고 있지 않는 상태이며 셸 호출 기능이 있는 함수를 그대로 사용하고 있다.
즉 우리가 입력한 메일 주소는 시스템 상에서 아래와 같이 해석하게 된다.
system("/usr/sbin/sendmail -i <template.txt jyosun@hack.com; cat /etc/passwd");
셸은 2개 이상의 명령어를 실행할 수 있기 때문에 뒤에 나오는 "cat /etc/passwd"도 함께 실행된 것이다.
'WebHacking' 카테고리의 다른 글
DNS 파밍 공격 (0) | 2022.07.28 |
---|---|
SQL Injection (SQL 인젝션) (0) | 2022.04.02 |