취약점 개념 설명
Command Injection 취약점은 취약한 애플리케이션을 실행 중인 서버에서 임의의 운영체제 명령을 실행할 수 있는 취약점을 의미한다.
이 취약점이 존재할 경우 애플리케이션을 구동하고 있는 시스템 계정의 쉘 권한을 획득한 것과 같기 때문에 위험도가 높은 취약점 중 하나이다.
위 사진의 경우 Command Injection 공격 방식을 그림으로 표현한 것이다.
공격자가 애플리케이션에 접근 후 기본적으로 사용되는 명령어 뒤에 ;(세미콜론)을 삽입한 후 명령어를 추가로 입력하여 서버로 전송한다. 서버는 입력된 명령어를 필터링하지 않아 서버에서 2 가지 명령어가 실행되고 실행된 명령의 출력이 공격자에게 전송되어 민감한 정보가 노출되는 결과가 나오게 되는 것을 그림으로 설명한 것이다.
DVWA (Medium) 환경 실습
우선 Command Injection 실습을 위해 해당 페이지로 들어온 모습이다.
텍스트 입력란에 IP를 입력할 경우 입력한 IP를 대상으로 웹 서버에서 Ping 명령을 사용하여 출력해 주는 기능이 있는 것을 위 사진과 같이 확인할 수 있다.
위 사진은 먼저 Low 레벨에서 Command Injection 공격을 수행한 모습이다.
기본적인 기능인 Ping 명령을 정상적으로 출력하기 위해 일반적인 IP를 먼저 입력한 후 다중 명령을 사용할 수 있또록 해주는 특수문자인 ;(세미콜론) 또는 &&(더블 엠퍼센트)를 입력하고 cat /etc/passwd 명령어를 입력하여 Command Injection 공격을 수행한 결과 Ping 명령을 수행한 후 시스템 정보를 아래 출력해주는 모습을 확인할 수 있다.
위 사진은 Low 레벨에서 공격에 성공했던 방법으로 Medium 레벨에서 공격을 시도한 모습이다.
Low 레벨에서 공격에 성공했던 것과는 다르게 Medium 레벨에서는 공격에 실패하는 모습을 확인할 수 있다.
명령어 | 설명 |
; (세미콜론) | 하나의 라인에 입력된 명령어들을 성공, 실패와 관계 없이 모두 실행한다. |
& (엠퍼센트) | 엠퍼센트로 명령어를 구분하여 앞의 명령어는 백그라운드로 실행하고, 즉시 뒤의 명령어를 실행한다. 앞 명령어의 성공 여부와 관계 없이 뒤 명령어는 실행된다. |
&& (더블 엠퍼센트) | 앞에 입력된 명령어가 실패하면 뒤에 있는 명령어를 실행하지 않는다. |
| (버티컬 바) | 앞에 입력된 명령어의 실행 결과를 뒤 명령어의 입력으로 넘겨준다. |
|| (더블 버티컬 바) | 앞에 입력된 명령어가 성공하면 뒤에 있는 명령어는 실행되지 않는다. |
다중 명령어를 입력할 수 있는 특수문자
이전에 ;(세미콜론)과 &&(더블 엠퍼센트)를 입력하여 Command Injection 공격을 수행하였을 때는 Medium 레벨에서 실패하였기 때문에 다른 다중 명령어를 입력할 수 있는 특수문자를 사용하여 Command Injection 공격을 추가로 시도한 모습이다.
다른 다중 명령 입력 특수문자(&,|)를 입력하여 Command Injection 공격을 수행하였을 때는 공격에 성공해 시스템 정보가 출력되는 모습을 확인할 수 있었다.
공격이 성공한 원인을 살펴보기 위해 Medium 레벨 기능이 구현된 소스코드를 살펴본 것이다.
위 사진에 표시된 곳을 확인할 경우 &&(더블 엠퍼센트) 또는 ;(세미콜론)이 입력될 경우 공백으로 치환되도록 하는 코드가 구현된 것을 확인할 수 있다.
하지만 위 표(다중 명령어를 입력할 수 있는 특수문자)에 설명도니 다른 특수문자들은 공백으로 치환하는 코드가 포함되어 있지 않아 공격에 성공하였다는 것을 확인할 수 있었다.
Command Injection 대응방안
Command Injection의 경우 일반적으로 취약한 함수를 사용함으로써 취약한 환경이 만들어지기 때문에 위 사진에 보이는 함수들은 특별한 사유가 없다면 사용을 지양해야 한다.
부득이하게 취약한 함수를 개발에 사용해야 할 경우에는 사용자가 입력한 값을 검증할 수 있는 로직을 구현하는 것이 중요하다.
예시로 이전 실습에서 본 Ping 명령을 수행하는 기능의 경우 특정 IP를 대상으로 기능을 수행하는데 IPv4의 경우 OOO.OOO.OOO.OOO과 같이 8비트씩 .(Dot)을 기준으로 4번 사용하여 총 32비트로 구성되게 된다. 이것을 이용해 8비트씩 .(Dot)을 기준으로 4번만 입력되도록 로직을 위 사진과 같이 구현할 수 있다.
대부분의 Injection 취약점들이 특수문자를 입력함으로써 문제가 발생되기 때문에 불필요한 특수문자 입력을 제한할 수 있는 로직을 구현한다.
'CERT > 웹 모의해킹 실습' 카테고리의 다른 글
[웹 해킹] CSRF(Cross-Site Request Forgery)공격 실습 / DVWA(Medium) 환경 실습 / 대응방안 (0) | 2023.08.28 |
---|---|
[웹해킹] Brute Force 공격 실습 / DVWA(Medium) 환경 실습 / 대응 방안 (0) | 2023.07.20 |
[웹 해킹] Stored XSS / DVWA 환경 실습 / 대응 방안 (0) | 2023.07.01 |
[웹 해킹] Reflected XSS / DVWA 환경 실습 / 대응 방안 (0) | 2023.07.01 |
[웹 해킹] DOM Based XSS / DVWA 환경 실습 / 대응 방안 (0) | 2023.06.21 |