command injection
명령어를 삽입한다는 뜻으로,
시스템 명령어를 쿼리문에 주입하여 취약한 변수를 통해 서버 운영체제에 접근하는 공격이다.
웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 실행하도록 한다.
예를 들어
해커가 공격할 서버에 ping을 보낼 때 뒤에 cat /etc/passwd와 같이 커맨드를 붙여 보냈을 때,
공격받는 서버에서 ping요청을 대충(?) 보고 응답해버리면 해커가 보낸 커맨드도 같이 실행 된다.
리눅스에서는 세미콜론(;)을 붙이면 ;양 옆의 명령을 모두 실행하므로
ping IP;cat /etc/passwd 을 보내면 ping과 cat을 같이 실행시키게 된다.
실습
※ "화이트 해커를 위한 웹 해킹의 기술" 강의 및 책에 수록된 실습이다.
※ 허가 받지 않은 웹사이트에 해킹을 시도 하는 것은 불법.
※ dvwa 등 테스트 가능하게 만들어진 곳에서만 모의해킹을 해야한다.
dvwa의 low 난이도부터 실습해보자. command injection 창에서 소스코드를 확인해보았다.

php에서 shell_exec 함수는 외부 프로그램을 실행하고 그 결과를 문자열로 반환하는 함수로, 여기서는 ip값을 타겟으로 받아 ping -c 4를 실행시킨다.
즉, ip 주소를 입력하면 ping을 4번 보내준다.
;과 같이 명령어를 동시에 실행시킬 수 있는 것들을 차단하는 코드가 없기 때문에,
;을 써서 다른 명령어를 실행해도 될 것이다.
; cat /etc/passwd 를 입력해보았다. (/etc/passwd 는 사용자 계정정보를 알 수 있는 디렉토리이다)

엌 진짜 다 뜨네.. 너무 쉽네..
다만 ; id 를 입력했을 때, daemon 계정이 뜨는 것을 볼 수 있는데

여기서 daemon권한으로 웹 어플리케이션을 실행하고 있기 때문이다.
만약 root 권한으로 웹 어플리케이션을 실행하고 있다면, 커맨드 인젝션 공격이 가능할 때 root권한으로 명령어를 실행할 수 있게 된다.
이번엔 medium 단계에서 소스코드를 살펴보았다.

;과 &&(윈도우에서 ;과 같은 역할을 함. 명령어 동시 실행시켜주는 구분자)을 공백으로 처리하고 있다.
그러면? 비슷한 다른 것들을 쓰면 된다. 내가 그나마 잘 아는 거... 파이프!
| id 를 입력했더니

잘 실행된다.
또는 & (백그라운드로 명령실행할 때 사용하는 특수문자)도 사용가능할 것이다.
& cat /etc/passwd 를 입력했을 때 잘 출력되는 것을 아래에서 확인 할 수 있다.

이제 high 단계의 소스코드를 살펴보았다.

블랙리스트에 해당하는 특수문자들이 많아졌다..
그런데 | 뒤에 공백이 들어가서 ' | '를 공백으로 바꾸고 있다. 따라서 |와 명령어를 붙여서 사용하면 될 것이다. 개발자는 이런 실수가 발생하지 않도록 조심해야 한다.
실제로 |id를 입력했을 때 결과가 잘 출력된다.


대응
커맨드 인젝션의 가장 좋은 대응 방법은, 사용자의 입력값이 원래 의도에 맞는지 검사해보는 것이다.
impossible 단계의 소스코드를 보자.

$octet = explode( ".", $target ); << IP 주소를 네 개의 옥텟으로 분할
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3]
) ) && ( sizeof( $octet ) == 4 ) ) {
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
<< 각 옥텟이 정수인지 확인하고, 옥텟이 모두 정수이고 4개인 경우에만 IP 주소를 다시 조합한다.
이와 같이 커맨드인젝션 공격을 대응하기 위해서는 입력값을 검증해주어야 한다.
입력값에 문자열을 허용해줘야 할 때는 high단계의 블랙리스트처럼, 불필요한 특수문자를 제한해두어야 한다.
'Web hacking > 기법' 카테고리의 다른 글
SQL injection_(1) 공격 개요 (0) | 2023.04.18 |
---|---|
파일 인클루전 (0) | 2023.04.03 |
CSRF(2) (0) | 2023.03.23 |
CSRF(1) (0) | 2023.03.23 |
브루트 포스(Brute Force) (0) | 2023.02.17 |