[DVWA 실습] Command Injection
✔ 공격 대상 :
👉 입력창은 IP 주소를 넣어 ping을 확인하는데, 이곳을 통해서 다른 시스템 명령어가 실행되도록 하면 된다.
📌 1. Low Level
우선, IP주소를 넣으면 아래와 같이 뜬다.
해당 검색창에 시스템 명령어를 넣어 보았다.
1) `ls`
👉 아무것도 뜨지 않는다.
2) `127.0.0.1; ls`
IP 주소 뒤에 `;`을 붙이고 시스템 명령어(`ls`)를 입력하였다.
👉 `ping 127.0.0.1` 결과와 함께 `ls` 결과가 나온다.(성공😀)
3) `127.0.0.1; cat /etc/passwd`
추가적으로 계정정보도 확인해 보았다.
👉 `ping 127.0.0.1` 결과와 함께 `cat /etc/passwd` 결과도 나온다. (성공😀)
✔ 소스 코드 :
👉 IP 주소를 입력하면 `ping` 명령을 실행하는데, 입력값에 대해서 검증이 없으므로 세미콜론(`;`)을 입력하고 다른 명령어를 추가로 전송할 수 있다.
📌 2. Medium Level
우선, IP주소를 넣으면 아래와 같이 뜬다.
1) `127.0.0.1; ls`
👉 Low level에서는 `ls`명령어가 실행 되었으나, medium level에서는 실행이 되지 않는다.
✔ 소스 코드 확인
👉 소스 코드를 확인해보면, `&&`와 `;`가 빈칸으로 필터링되는 것을 알 수 있다. 그렇기 때문에, 두 가지 경우를 우회하여 시스템 명령어를 실행할 수 있는 방법을 알아내야 한다.
`cmd1| cmd2` : (파이프) `|`를 사용하면 cmd1의 출력을 cmd2의 입력으로 전달합니다. cmd1이 성공하거나 실패하더라도 cmd2는 실행됩니다.
`cmd1; cmd2` : (순차실행) `;`를 사용하면 cmd1의 실행이 끝난 후, 성공여부와 상관없이 cmd2가 실행됩니다.
`cmd1|| cmd2` : (OR 논리연산) cmd1 실행이 실패할 경우에만 cmd2가 실행됩니다.
`cmd1&&cmd2` : (AND 논리연산) cmd1 실행이 성공할 경우에만 cmd2가 실행됩니다.
`$(cmd)` : (명령어 치환) cmd의 실행 결과를 캡처하여 다른 명령어의 일부로 사용합니다. 예를 들어 `echo $(whoami)` 에서 `whoami` 명령어의 출력 결과를 포함하여 `사용자이름`을 출력합니다.
`cmd` : 특정 명령어를 실행하는 데 사용됩니다.
`>(cmd)`: (프로세스 치환-출력) `>(ls)` 명령어의 출력을 임시 파일이나 스트림으로 만들어 다른 명령어로 보냅니다. 파일을 필요로 하는 명령어와 함께 사용됩니다.
`<(cmd)`: (프로세스 치환-입력) `<(ls)` 명령어의 출력을 임시 파일이나 스트림으로 만들어 다른 명령어가 입력으로 사용합니다.
2) `127.0.0.1| ls`
👉 `;`(세미콜론) 대신에 `|`(파이프)를 입력했는데 성공하였다.😀
`cmd1 | cmd2`이면, cmd1의 출력을 cmd2의 입력으로 전달한다. cmd1이 성공하거나 실패하더라도 cmd2는 실행된다.
3) `127.0.0.1 & ls`
👉 `&`은 쉘에서 명령을 백그라운드로 실행하도록 하는 명령어이다.
ping 명령어는 백그라운드에서 실행되고, 쉘은 다음 명령어를 바로 처리하도록 한다.
그래서, `ls`명령어가 먼저 실행된 다음에 백그라운드로 `ping 127.0.0.1`이 실행된다.
📌 3. High Level
역시나 IP를 입력하면, ping결과가 나온다.
1) `127.0.0.1; ls`, `127.0.0.1| ls`, `127.0.0.1 & ls`
👉 Low level, Medium level에서 가능했던 명령어가 실행되지 않음을 알 수 있다.
✔ 소스 코드 확인
더 많은 특수문자들이 필터링된 것을 알 수 있다.
코드를 자세희보면, `| `부분에 띄어쓰기가 된 것을 볼 수 있다. 개발자의 코딩 실수로 문자 blacklist 방식이 우회가 가능하게 된 것이다.
👉 띄어쓰기 없이 `|` 뒤에 명령어를 입력하면 필터링되지 않을 것이다.
2) `127.0.0.1|ls` (띄어쓰기 없이)
👉 성공! 😀
📌 4. Impossible Level
지금까지 시도했던 우회기법들 전부 사용 불가인 것을 알 수 있다.
✔ 소스 코드 확인
👉 소스 코드를 확인하면, IP 형식만 입력 가능한 것을 알 수 있다. (숫자.숫자.숫자.숫자 형식만 가능)
입력값 검증을 통해서, 필요한 정보만 입력하도록 설정하여 Command Injection 공격을 불가능하도록 만들었다.