보안개구리

[A-1 Injection]OS Command Injection 본문

웹 진단/bWAPP 실습

[A-1 Injection]OS Command Injection

보안개구리 2024. 6. 14. 11:36

 OS Command Injection이라 하면 그동안 실습해왔던 Injection 공격 중 하나이며 OS Command 즉 시스템 명령어를 사용하는 방식이다.

 먼저  commandi.php를 살펴보겠다.

 

 왼쪽 사진은 난이도에 따라 적용되는 함수를 알 수 있고 오른쪽은 현재 페이지를 나타내는 건데 만약 입력을 하지 않는다면 if 구문을 실행하여 Enter a domain name이라는 문구를 나타내고 입력값을 받는다면 else 구문을 실행한다.

 페이지 내에서 www.naver.com를  를 입력하여 나오는 값과 비박스에서 터미널 창을 연 후 nslookup을 통해 www.naver.com을  을 비교해보면 값이 같다는 것을 알 수 있다.

 따라서 페이지 DNS lookup 입력창에 값을 넣고 입력하면 명령어가 실행된다는 것을 알 수 있다.

 

[Low Level]

 먼저 www.naver.com를  를 입력해보겠다

 정상적으로 값이 나오는 것을 확인할 수 있다.

 그러면 이제 본격적으로 명령어를 삽입할텐데 www.naver.com; cat /etc/passwd 라고 입력해보겠다.

 

 아까와는 다르게 비박스 내  /etc/passwd 정보들까지 노출되는 것을 확인할 수 있다.

 지금 우리는 단순히 주소를 입력후 ; cat /etc/passwd를 입력했지만 실제로는

 이런식으로 터미널 창에서 입력한 것과  같다.

 

[Medium Level]

 Low Level에서의 실습처럼 주소 입력 후 ; cat /etc/passwd를 입력해보겠다.

 그럼 전과는 다르게 /etc/passwd 정보는 물론 nslookup조차 안 되는 것을 확인할 수 있다.

 아까 올렸던 사진중에 switch 구문을 살펴보면  medium 난이도의 경우는 copmmandi_check_1을 사용한다는 것을 알 수 있는데 해당 함수를 확인해보겠다.

function commandi_check_1($data)

    $input = str_replace("&", "", $data);
    $input = str_replace(";", "", $input);

    return $input;
}

 str_replace는 예전에 HTML Injection 실습할 때 봤던 것으로 치환해주는 함수로 &와 ; 값을 치환해버리겠다는뜻이다.

 위 commandi_check의 목적은 리눅스에서 사용되는 다중 명령어(;, &, |)들의 사용을 막기 위해서 해당 명령어들을 치환하기 위해 만들어지고 적용됐으나 check_1에서는 |가 빠져있다.

 다시 말해 기존에 ; 대신 |를 적용하면 Low Level과 동일하게 Injection을 할 수 있다.

 

[High Level]

 Medium Level처럼 | cat /etc/passwd를 입력해보았더니 실행이 되지 않는 걸 확인하였다.

 High Level 경우는 commandi_check_2가 적용되는데 해당 함수의 내용은 다음과 같다.

function commandi_check_2($data)
{
    return escapeshellcmd($data);
}

 여기서 escapeshellcmd는 특정 문자들에 대하여 앞에 backslash가 추가해주는 기능을 한다

 따라서 우리가 기존에 사용하던 다중 명령어를 사용할 수 없어서 시스템 명령어 사용이 불가능해진다.