본문 바로가기

Penetration/WEB

[주요정보통신기반시설] 4. 운영체제 명령 실행 - 이론편

이번에 공부할 취약점은 운영체제 명령 실행입니다.

이 부분에 대해서는 예전에 비박스에서 해봤던 기억이 있었지만, 실제로는 잘 보지 못했습니다. 이번 계기에 정확히 공부해서 점검에 도움이 되어야 겠다고 생각하였습니다.

 

 

해당 취약점은 웹에서 시스템 명령어를 삽입하였을 때 명령어가 실행되는지 여부로 점검할 수 있습니다.

입력폼, url 파라미터, 쿠키, HTTP 헤더 등에서 명령어를 삽입하여 실행여부를 확인할 수 있습니다.

주로 웹 어플리케이션에서 system()함수나 exec()함수같은 시스템 명령어를 실행시킬 수 있는 함수를 제공할때 해당 취약점이 발생합니다. 

 

예전 실습에 따르면 서버에 IP주소의 응답을 확인하기 위한 입력폼에 리눅스 다중명령어를 포함해서 점검해보는 방식을 사용하였습니다.

 

리눅스 다중명령어

명령; 명령 명령어를 순차적으로 실행할때 사용합니다.
명령 && 명령 명령어를 순차적으로 실행하지만, 명령어 실행에 실패할 경우 뒤에 붙는 명령어는 실행하지 않습니다.
명령 || 명령 명령어는 순차적으로 실행하지만, 명령어 실행에 성공할 경우 뒤에 붙는 명령어는 실행하지 않습니다.
명령 | 명령 처음 명령어 수행 결과를 뒤에 명령어의 표준 입력으로 전달합니다.

예를 들면 입력폼이나 입력할 수 있는 부분에 ping x.x.x.x와 같이 입력했을 때 ping 명령어가 작동이 확인된다면

ping x.x.x.x ; ls 와같이 입력하여 해당 명령어가 실행되는지 확인해봅니다.

해당 서버가 linux의 경우  ls와 cat 같은 리눅스 명령어를 확인해보고

해당 서버가 windows의 경우 dir과 같은 윈도우스 명령어를 넣어서 확인해봅니다.

 

추가) php 명령어 실행함수

shell_exec(cmd) 실행된 명령어의 전체 결과를 반환
passthru(cmd) 실행된 명령어 전체를 바이너리 데이터로 반환
exec(cmd) 실행된 명령어의 마지막 줄만 반환
system(cmd) 실행된 명령어 전체 결과 문자열로 반환

 

보안 대책)

 

1. 서버 내부로 시스템 명령어를 전달시키지 않도록 필터링을 구현합니다.
2. 외부에서 전달되는 값을 검증 없이 시스템 내부 명령어로 사용하지 않거나 악용될 수 있는 특수문자나 구문 등을 필터링할 수 있는 규칙을 적용("|", "&", ";", "`" 등)

-> `(백틱)의 경우 result=`ls -l`과 같이 사용하였을 때 명령을 실행하고 그 결과를 result에 저장하는 방식으로 사용할 때 사용됩니다.
3. 외부 명령어 필요한 경우, 미리 지정해두고 외부 입력에 따라 선택적 사용(화이트 리스트 방식으로 구현)

 

일단 기본적인 이론에 대해서 알아보고 추후에 DVWA와 Bee-box에 대해서 실습하고 추가할 예정입니다.

 

이상입니다~