❓ 공격 개요
Command Injection 개요
커맨드 인젝션(Command Injection)은 명령어를 삽입한다는 뜻으로, 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 실행하도록 하는 공격이다
💻 실습
command injection 의 메인 화면이다
IP 주소를 입력하면 해당 IP 주소로 ping 명령어를 실핸한후 결과를 출력해준다
0.0.0.0을 입력하고 실행해보면 다음과 같이 ping 명령어를 실행한 결과가 출력된다.
소스코드를 확인해 어떻게 동작하는지 알아보자
입력값(웹 요쳥 메시지로부터 전달된 IP 파라미터의 값) 을 target 변수에 저장후
shell_exec() 함수를 호출하여 ping 명령을 실행한다
(리눅스의 경우 -c 옵션이 없다면 횟수 제한 없이 실행하여 응답되지 않게되어 -c 옵션을 설정하였다)
이제 command injection 공격을 해보자
이와 같이 ; 뒤에 명령어를 추가함으로써
원격 호스트를 대상으로 시스템 명령어를 자유자재로 실행할 수 있다.
실습 단계인 Low 레벨에서는 입력값에 검증이 따로 이루어지지 않기때문에
앞에 아이피를 생략하고 바로 ;ls 명령어를 입력해도 실행이 가능하다
또한
실습에서는 ; 를 사용했지만
"&", " |" ," `" 등 다양한 다중명령어를 사용할 수 있다.
❓ 다중 명령어 종류
종류 | 설명 | 작동가능OS |
세미콜론( ; ) | 하나의 명령어 라인에서 여러개의 명령어를 실행하는 것으로, 명령어의 성공여부는 중요하지 않고, 단순히 앞의 명령어 부터 순차적으로 실행을 한다. | UNIX |
앰퍼샌드( & ) | 앞의 명령어는 백그라운드로 실행하고, 즉시 뒤의 명령어를 실행하게 된다. 따라서 앞의 명령어가 백그라운드에서 실행되므로 뒤의 명령어는 앞쪽 명령어의 실행의 완료 여부에 상관없이 실행된다. | UNIX Window |
버티컬바( | ) | 앞의 명령어의 실행결과를 뒤의 명령어의 입력으로 넘기는 기능을 한다. 파이프(Pipe)라고 많이 불리며, grep명령어와 묶어서 많이 사용한다. | UNIX Window |
더블앰퍼샌드( &&) | 앞에 있는 명령어가 실패하면 뒤에 있는 명령어를 실행하지 않는다. | UNIX Window |
더블버티멀바( || ) | 앞에 있는 명령어가 성공하면 뒤에 있는 명령어를 실행하지 않는다. | UNIX Window |
줄바꿈(0x0a or \n) |
UNIX | |
` command ` | command 실행결과 출력 | UNIX |
$( command ) | command 실행결과 출력 | UNIX |
🔍 대응방안
1. 입력 값 검증
<블랙리스트 검증>
= 각종 문자열들을 차단하는 방법
> 일부공격을 간단히 막을순 있지만 우회공격은 차단불가
> 정상적인 문자열을 공격으로 판단하는 오탐( false-positive ) 의 가능성이 있음
<화이트 리스트 검증>
= 입력값이 웹 애플리케이션이 필요로 하는 데이터의 형식과 일치할 때만 허용, 그 외의 모든값은 차단하는 방법
> 오직 필요한 값만 허용하기때문에 우회공격에도 안전하다
2. 애플리케이션은 운영체제로부터 명령어를 직접적으로 호출하지 않도록 구현
- exec(), system() 과같은 직접적으로 명령어를 실행하는 함수를 사용하지않고, 프로그래밍 언어 및 라이브러리에서 자체적으로 제공하는 함수 사용
(명령어를 직접 호출하는 것이 필요한 경우에는, 데이터가 OS의 명령어 해석기에 전달되기 전에 입력 값을 검증/확인하도록 구현)
'Web Hacking > DVWA' 카테고리의 다른 글
[DVWA] - Insecure CAPTCHA (0) | 2022.11.09 |
---|---|
[DVWA] - File Upload (0) | 2022.11.08 |
[DVWA] - File Inclusion (0) | 2022.11.07 |
[DVWA] - CSRF(Cross Site Request Forgery) (1) | 2022.11.06 |
[DVWA] - Brute Force (0) | 2022.11.02 |