비트(bit)주세요

Command Injection 본문

정보보안/웹보안

Command Injection

yglee730 2021. 5. 6. 22:20
728x90

Command Injection 은 웹 애플리케이션에서 시스템 명령을 사용할 때, 

세미콜론 혹은 &, && 를 사용하여 하나의 Command를 Injection 하여

두 개의 명령어가 실행되게 하는 공격 입니다.

 

어떤 웹 어플리케이션 공격이 내부에서 실행된다고 했을 때 

사용자가 입력한 값이 적절한 검증 절차가 존재하지 않으면

입력했던 시스템 명령어가 그대로 전달되어 공격자는 이 값을 조작해

시스템 명령어 삽입 시도 공격을 할 수 있게 됩니다.

 

DVWA Low 단계에서 실습을 진행해 보겠습니다.

 

먼저 소스코드부터 보겠습니다.

Low단계 소스코드

특수문자 같은 것도 필터링을 하지 않고, 받은 값 그대로 출력하는 코드입니다.

여기서 shell_exec()함수는 시스템 명령을 내리는 역할을 합니다.

받은 값 앞에 ping -c 4가 붙어서 시스템 명령이 실행됩니다.

ping -c 4는 ping 결과값을 4번만 받겠다는 뜻입니다.

원래 이 페이지는 오로지 ping 테스트를 위한 페이지인가 봅니다.

 

이번에는 취약점을 이용해 전송값을 조작하여 ping 명령어 이외에 

다른 명령어를 실행시켜 보도록 하겠습니다.

 

한 줄에서 여러 명령어를 사용할 수 있는 특수문자를 사용했습니다.

그리고 서버의 존재하는 모든 계정의 정보가 들어있는 /etc/passwd 파일을 출력해보겠습니다.

 

계정의 정보가 들어있는 파일을 출력하는 것이 성공했습니다.

서버는 ;cat /etc/passwd를 받고 최종적으로는 ping -c 4; cat /etc/passwd로 인식이 됩니다.

이 명령어가 ping의 결과는 출력하지 않고(전달한 ip주소가 없음) 

/etc/passwd 파일만 출력하게 했습니다.

 

medium레벨은 Low레벨과 비교했을때 뭐가 다른지 알아보겠습니다.

medium레벨의 소스코드를 보겠습니다.

medium레벨 소스코드

medium레벨은 전송값에 && 또는 ; 가 있으면 공백으로 교체하는 방식으로 필터링을 합니다.

 ;을 쓰면 어떻게 되는지 볼까요?

 

아무일도 일어나지 않습니다. 필터링이 적용되어 ping -c 4 cat /etc/passwd로 인식을 해서

그런 것 같습니다.

 

하지만 특수문자는 &&, ; 이 두개만 있는 게 아닙니다.

| 도 쓸 수 있습니다. | 를 사용해서 필터링을 우회해보겠습니다.

 

필터링이 있었지만 다른 특수문자를 사용해 필터링을 우회했습니다.

그 결과 사용자계정의 파일을 출력하는 데 성공했습니다.

 

High 레벨의 소스코드를 보겠습니다

필터링하는 문자들이 더욱 많아졌습니다.

 

그러면 impossable의 소스코드는 어떻게 되어있는지 보겠습니다.

전송값을 점(.) 단위로 분해 한 다음에 각각의 값 형태가 숫자인지 확인하는 과정을 거치네요.

 

command injection의 대응책은 위 처럼 전송값을 검증하는 과정을 거치는 것 입니다.

값의 형태를 검증하든, 허가되지 않은 문자가 들어오면 다른 문자로 대체하든,

인젝션을 방어하는 기법들의 공통점은 전송값을 확인하는 과정을 거친다는 것입니다.

'정보보안 > 웹보안' 카테고리의 다른 글

netcat과 포트포워딩  (0) 2021.05.23
방화벽  (0) 2021.05.22
Brute Force Attack(전수공격)  (0) 2021.04.24
인증기술과 접근통제  (0) 2021.04.23
HTTP  (0) 2021.04.04