Write-up/dreamhack

🚩Dreamhack - error based sql injection

ㅇㅅㅇ.. 2024. 8. 12. 19:51
📂Error & Time based SQL Injection

 

 


1. 정보수집

폼을 제출하면 단순히 uid 파라미터로 받은 문자열을 그대로 출력하고 있다.

 

 


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)#';

새로운 페이지에 다음과 같은 오류 메세지가 출력되었고 Error based SQLi 취약점이 존재하는 것을 알 수 있다.


2-1 Python script

처음으론 저번 Blind SQLi 문제처럼 파이썬 스크립트를 이용해 보았다.

파이썬 스크립트에서 비밀번호의 길이를 알아내는 반복문을 for i in range(0, 100)으로 하여 실행하는데 아무리 돌려봐도 99를 리턴하고 종료되었다. 99가 리턴되는 이유를 생각해 보면

 

  1.  비밀번호의 길이가 0~99 범위 안에 없거나
  2.  break가 포함된 조건문의 조건이 잘못되었거나  

 

인데 1번은 아닐 것 같고.. 실제로  웹 사이트에서 if(length(upw)<99, 9e307*2, 0) 형태로 폼을 작성해도 비밀번호의 길이는 99보다 작다. 두 번째 조건문의 조건이 잘못된 것 같은데 response 결과를 찍어보니

 

 

위와 같은 오류 메세지를 기대한 것과 다르게
다른 오류 메세지가 출력되고 있었다. 도대체 똑같은 파라미터 값을 전송하는데 왜!! 웹 사이트에서는 DOUBLE value 에러가 나고 파이썬 스크립트 결과론 SQL syntax 에러가 나는지 한참을 헤맸는데 이유는 요청과정에서 url 인코딩이 잘못되어 발생하는 문제였다.
인코딩이 적절하게 되도록 quote()함수를 query문에 감싸서 실행하였더니
원하는 결과가 나왔다.

 

근데 여기서 궁금한 점.. 저번 blinde sqli 문제에선 이 함수를 사용하지 않았는데??

다시 보니 주석의 문제였던 것 같다. 저번 쿼리에서는 주석으로 '--'를 사용했는데 이번에는 '#'을 사용했다.

주석을 #에서 --1 로 바꾸고 실행하니 이번 스크립트도 quote() 함수 없이 잘 돌아갔다.

 

출력은 되었지만 너무 너무 너무 오래 걸린다


2-2 Python script - bit

저번 스크립트를 그대로 가져와서 실행하였는데 2-1 보다 비트 연산이 훨씬 빠르긴 하다.

 


2-3 extractvalue

에러를 발생하면 새로운 페이지에 오류 메시지를 출력하는데 extractvalue 함수와 서브쿼리를 이용하여 upw를 한 번에 화면에 출력하도록 하였다.

 

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

근데 FLAG가 끝까지 출력되지 않는다.

 

Content 길이를 64로 제한하고 있다.

 

 

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

substr 함수로 대충 20번째 부터 출력 되도록 하면 FLAG의 뒷부분이 알 수 있다.


 

댓글수0