보안개구리
[A-1 Injection]OS Command Injection 본문
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가 추가해주는 기능을 한다
따라서 우리가 기존에 사용하던 다중 명령어를 사용할 수 없어서 시스템 명령어 사용이 불가능해진다.
'웹 진단 > bWAPP 실습' 카테고리의 다른 글
[A-1 Injection]PHP Code Injection (0) | 2024.06.14 |
---|---|
[A-1 Injection]OS Command Injection - Blind (1) | 2024.06.14 |
[A-1 Injection]Mail Header Injection (SMTP) - 풀이중 (0) | 2024.06.14 |
[A-1 Injection]LDAP Connection Settings - 풀이중 (0) | 2024.06.14 |
[A-1 Injection]iFrame Injection (0) | 2024.06.14 |