LOS 21단계 시작!
"Hello admin" 과 같은 문장이 출력되지 않기 때문에 기존의 방법으로 패스워드를 알아낼 수 없다.
이번 문제는 Error Based SQL Injection 을 통해 에러 메시지를 이용해야 할 것 같다.
에러 메시지를 출력하여 패스워드를 알아내보자!
에러 메시지를 출력하기 위해 서브쿼리를 이용할 수 있다.
[select 문] union [select 문] 에서 두 select 문의 field 개수는 같아야 한다.
예를 들어, select 1 union select 2 와 같이 두 select 문의 필드 개수가 다르게 되면 에러 메시지를 출력하게 된다.
이를 이용하면, select 1 union select [조건] 에서 조건이 거짓이라면 0을 반환하여 select 1 union select 0 이 되어
에러 메시지를 출력하게 된다.
마찬가지로, select 0 union select [조건] 에서 조건이 참이라면 1을 반환하여 select 0 union select 1이 되어
에러 메시지를 출력하게 된다.
이 문제에서 ?pw=' or (select 0 union select 1) %23 과 같은 쿼리를 입력하게 되면
다음과 같은 에러 메시지가 출력된다.
이전 문제들의 "Hello admin" 과 같이 이번 문제에는 이 문자열이 출력되는 것을 이용하여 문제를 풀 수 있다.
이제 패스워드의 길이와 패스워드 값을 알아내보자!
앞서 말했던 Error Based SQL Injection 을 이용하여 Python 코드를 작성하였다.
19단계와 마찬가지로 hex 단위의 패스워드를 출력하도록 코딩하였다.
결과는 다음과 같았다.
패스워드가 19단계와 같은 hex값이 아니었다.
패스워드의 각 자리값의 크기를 알기 위해 다음과 같이 입력했다.
?pw=' or (select 0 union select length(substr(pw,1,1))=1) %23
결과는 앞서 말한 에러 메시지가 출력되었고 그 의미는 패스워드 한자리는 1byte라는 의미이다.
19단계는 한 자리가 4byte 였지만 이번 문제는 1byte 이기 때문에 패스워드는 32자리인것을 알 수 있다.
패스워드가 너무 길기 때문에 코딩을 통해 문자로 변환하였다.
아래와 같이 문자열로 잘 출력되었다.
성공!
'WarGame > LOS (Lord Of SQLInjection)' 카테고리의 다른 글
23단계 : hell_fire (0) | 2020.01.21 |
---|---|
22단계 : dark_eyes (0) | 2020.01.21 |
20단계 : dragon (0) | 2020.01.20 |
19단계 : xavis (0) | 2020.01.14 |
18단계 : nightmare (0) | 2020.01.09 |