명령어를 삽입한다는 뜻으로, 웹 요청 메시지에 임의의 시스템 명령어를 삽입하고 전송하여 웹 서버에서 해당 명령어를 실행하도록 하는 공격이다.
어떤 웹 애플리케이션이 내부에서 시스템 명령어를 실행하는 상황에서, 만약 사용자가 입력한 값을 적절한 입력값 검증 없이 시스템 명령어의 일부분으로 전달하면 공격자는 이 값을 조작하여 임의의 시스템 명령어를 실행할 수 있다.
공격자는 ;이 리눅스에서 복수의 명령어를 실행하고자 할 때 사용하는 특수문자임을 이용하여 공격한다.
/etc/password 파일은 리눅스의 사용자 목록이 들어있는 파일로, 공격에 의해 정보가 노출될 수 있음을 보여주는 대표적인 파일이다.
우선 IP를 넣어 웹페이지를 테스트해본다.
위 소스코드를 보면 $target = $_REQUEST[ 'ip' ];에서 입력을 받고 그 값이 $cmd = shell_exec('ping -c 4 ' . $target);으로 들어가는 것을 볼 수 있다.
따라서 리눅스에서는 ; 특수문자를 이용하여 뒤에 다른 명령어를 실행할 수 있다.(&, | 등 다른 명령어도 사용할 수 있다.)
위와 같이 앞의 명령이 실패하더라도 뒤의 명령은 유효하다.
이를 이용해 cat /etc/password 명령을 주어 사용자 목록을 출력한다.
위와 같이 현재 웹 페이지는 daemon의 사용자 권한으로 실행되고 있음을 알 수 있는데, 이 권한으로는 관리자 권한이 필요한 명령은 사용할 수 없다.
어떤 시스템 운영자의 경우 실수이든 의도적이든 웹 애플리케이션을 루트 사용자 권한으로 실행하는 경우가 있는데 이는 아주 심각한 위험을 초래할 수 있다.
직접적으로 시스템 명령어를 호출하지 않는다.
소스코드 레벨에서는 exec()이나 system()과 같은 직접적으로 명령어를 실행하는 함수를 사용하지 않고, 대신 프로그래밍 언어 및 라이브러리 이름을 자체적으로 제공하는 함수를 사용하는 것을 권장한다.
시스템 명령어를 사용할 수 밖에 없는 경우에는 사용자 입력값이 명령어에서 사용될 수 없도록 확실히 점검해야 한다.
적절한 입력값 검증을 한다.(화이트리스트 검증 방식 권장)
위 글은 '화이트 해커를 위한 웹 해킹의 기술 최봉환 저'를 공부하며 작성한 글입니다.
Step6. 크로스 사이트 요청 변조(CSRF) 공격 (0) | 2021.02.26 |
---|---|
Step5. 크로스 사이트 스크립팅 공격 (0) | 2021.02.25 |
Step3. SQL인젝션 공격 (0) | 2021.02.23 |
Step2. 취약한 인증 공격 (0) | 2021.02.21 |
Step1. 정보수집 (0) | 2021.02.20 |
댓글 영역