Command injection
: 어플리케이션에 운영체제 명령어 (=쉘 명령어)를 실행하는 기능이 존재 하는 경우, 외부 입력 값을 검증, 제한 하지 않고 운영체제 명령어 또는 운영체제 명령어 일부를 사용하는 경우 발생
시스템 제어권을 탈취하여 해당 시스템을 공격자 마음대로 제어하게 됨
ex. SELECT * FROM USERS WHERE ID='hyun'
: ID의 컬럼 값이 입력값(hyun)과 일치하는 사용자 조회
- 항상 참이되는 값 입력
i) hyun' or 'a'='a
ii) hyun' or '1'='1
-> SELECT * FROM USERS WHERE ID='hyun' or 'a'='a
'
-> 모든 사용자 조회
- 오류를 유발하는 입력 (=시스템 내부 정보를 수집)
a'
-> SELECT * FROM USERS WHERE ID='a'
'
-> 구문 오류 발생 (ex. syntax error)
-> 홑따옴표가 두개 연속으로 나오면 이스케이프가 발생해서 홑따옴표라는 문자를 뜻해서 한개 부족하다고 인식
- UNION 구문 이용 (= 권한 밖 데이터 접근 가능)
조작 쿼리) hyun' UNION select 1,2,3 --
-> SELECT * FROM USERS WHERE NAME ='hyun' UNIOM select 1,2,3 --
- Stored Procedure (= 서버 제어권 탈취)
hyun'; exec xp_cmshell 'cmd.exe /c ipconfig' --
-> SELECT * FROM USERS WHERE NAME ='hyun'; exec xp_cmshell 'cmd.exe /c ipconfig' --
'
hyun 까지 실행이 되고 다음 쿼리문이 실행되며 DB shell에 접근하려는 목적인 명령문이다
- Blind SQL Injection
: 쿼리가 참인 조건과 거짓에 조건에 따라 출력문이 다르게 나오는 것을 이용
'hyun' -> SELECT FROM USERS WHERE NAME = 'hyun' -> 일치하는 이름의 사용자가 존재합니다.
'!@#$/' -> SELECT FROM USERS WHERE NAME = '!@#$/' -> 일치하는 이름의 사용자가 존재하지 않습니다
- 실행
SELECT * FROM USERS WHERE NAME = 'hyun' and (select ...) --
- 결과
존재합니다 -> 공격자가 생성한 쿼리의 일치하는 데이터가 존재
존재하지 않습니다 -> 공격자가 생성한 쿼리의 일치하는 데이터가 없음