OS command injection(또는 shell injection)는 공격자가 application을 실행 중인 서버에서 임의의 운영체제(OS)의 명령을 실행하고, 일반적으로 application과 모든 해당 데이터를 완전히 손상시키는 웹보안 취약점이다. 종종 공격자는 OS command injection 취약점을 활용하여 호스팅 인프라의 다른 부분을 손상시키고, 신뢰관계를 악용하여 공격을 조직 내의 다른 시스템으로 pivot할 수 있다.
사용자가 특정 상점에 품목의 재고가 있는지 확인할 수 있는 shop application을 생각한다. 이 정보는 다음과 같은 URL을 통해 접근한다.
https://insecure-website.com/stockStatus?productID=381&storeID=29
재고 정보를 제공하기 위해 application은 다양한 오래된 시스템을 쿼리한다. 역사적인 이유로 기능은 제품과 제품 ID를 인수로 사용하여 shell 명령을 호출해서 구현했다.
stockreport.pl 381 29
이 명령은 사용자에게 반환되는 지정된 항목의 재고 상태를 출력한다.
application은 OS command injection에 대한 방어를 구현되어 있지 않으므로 공격자는 다음 입력을 넣어서 임의의 명령을 실행할 수 있다.
& echo aiwefwlguh &
이 입력이 productID
파라미터에 제출하면 application에서 실행되는 명령은 다음과 같다.
stockreport.pl & echo aiwefwlguh & 29
echo
명령어는 문자열을 출력하며, 일부 유형의 OS command injection을 테스트하는데 유용하다. &
문자는 셀 명령 구분 기호이므로 실행되는 것은 실제로 세 개의 개별 명령이 차례로 동작한다. 결과적으로 사용자에게 반환되는 출력은 다음과 같다.
Error - productID was not provided
aiwefwlguh
29: command not found
세 출력은 다음을 보여준다.
stockreport.pl
명령은 인수 없이 실행되어서 오류 메세지를 반환한다.echo
명령이 실행되어 문자열이 출력에 같이 나왔다.29
가 명령으로 실행되어 오류가 발생했다.injection된 명령 뒤에 추가로 명령 구분 기호&
를 넣으면 일반적으로 injection된 명령을 injection 지점 뒤에 오는 항목과 구분하기 때문에 유용하다. 이렇게 하면 injection된 명령이 실행되지 않을 가능성이 줄어든다.
OS command injection 취약점을 찾은 경우 몇 가지 명령을 실행하여 손상된 시스템에 대한 정보를 얻는 것이 유용하다. 다음은 Linux와 Windows 플랫폼에서 유용한 일부 명령에 대한 정리이다.
현재 사용자의 이름
Linux
whoami
Windows
whoami
운영체제
Linux
uname -a
Windows
ver
네트워크 구성
Linux
ifconfig
Windows
ipconfig /all
네트워크 연결
Linux
netstat -an
Windows
netstat -an
실행 중인 프로세스
Linux
ps -ef
Windows
tasklist
글이 많은 도움이 되었습니다, 감사합니다.