본문 바로가기

Wargame/Lord of SQL injection

Lord of SQL injection 04

4번 orc

 

여태까지와는 다르게 id는 admin으로 고정되어 있고 admin의 pw를 무조건 맞춰야 풀리는 것 같다.

 

냅다 들여봐도 모르겠어서 구글링을 했는데 Blind SQL Injection을 사용해야 한다고 한다.

Blind SQL Injection이 무엇인지에 대해서는 과제 3에서 후술할 예정이다.

 

preg match 부분이 필터링 함수라는데 prob 와 _ . , 를 필터링하고 i를 통해 대소문자를 구별하지 않는다고 한다.

 

비밀번호의 크기를 먼저 찾을 수 있으면 찾는 것이 중요한데 코드를 보면 참인 값이 주어졌을 때 Hello admin을 출력하는 것을 확인할 수 있다. 따라서 참일 때까지 비밀번호의 크기를 입력하여 찾아야한다. 

 

비밀번호의 크기를 찾기 위해서 사용할 문법은 문자열의 크기를 나타내는 length를 이용하였다.

비밀번호를 모르니 pw는 아무것이나 써주고 or 뒤에 id는 admin이면서 pw의 길이를 1부터 하나씩 대입해보았다.

ex) pw=1' or id = 'admin' and length(pw)=1%23

1, 2, 3, 4, 5, 6, 7...

8!!!

 

PW의 길이는 8인 것이다.

 

여기서 두 가지 방법이 있다는데

1. 파이썬 코드를 이용해 반복문을 만드는 것

2. pw의 한 글자마다 범위를 유추하여 pw를 찾는 것

 

먼저 일일이 하나씩 찾는 방법은 범위를 이용해서 푸는 것인데 해당 문자들이 아스키 코드 값으로 숫자의 범위를 갖는 것을 이용한다.

or id='admin' and 이후에 ascii와 substr을 이용하는 것인데 substr은 문자열 안에서 해당하는 문자를 입력한 범위만큼 불러온다. 즉 첫 번째 인수는 불러올 문자열 두 번째 인수는 시작점 세 번째 인수는 끝나는 지점이다.

substr(pw,1,1)은 pw의 첫 번째 문자를 불러오는 것이다. 즉 ascii(substr(pw,1,1))을 하면 첫 번째 문자를 아스키 코드 값으로 변환해준다. 쿼리문을 다음과 같이 구성하면...

 

?pw='||id='admin' and ascii(substr(pw, 1, 1))<48%23

?pw='||id='admin' and ascii(substr(pw, 1, 1))<49%23

 

해당 문자의 아스키코드가 '48보다 작을때는 참이 아닌데 49보다 작을 때는 참이다'라는 것을 이용하여 해당 문자의 아스키코드가 48이라는 것을 유추할 수 있다.

 

아스키코드 표에 따르면 아스키코드 48은 Chr 0과 같다.

 

?pw='||id='admin' and ascii(substr(pw, 2, 1))<58%23

?pw='||id='admin' and ascii(substr(pw, 2, 1))<57%23

 

이런 식으로 노가다를 하다 보면...

 

두번째 pw ascii 48 -> 0

두번째 pw ascii 57 -> 9

세번째 pw ascii 53 -> 5

네번째 pw ascii 97 -> a

다섯번째 pw ascii 57 -> 9

여섯번째 pw ascii 56 -> 8

일곱번째 pw ascii 53 -> 5

여덟번째 pw ascii 50 -> 2

 

 

그리고 9번 째 글자의 ascii는 아래와 같이 0으로 나오는데 ascii 코드 0을 보면 null값이다.

위에서 원래 8자라는걸 알고 있었지만, 이렇게로도 pw는 8글자라는 것을 알 수 있다.

 

정답은!

?pw=095a9852

 

'Wargame > Lord of SQL injection' 카테고리의 다른 글

Lord of SQL injection 07  (0) 2022.11.12
Lord of SQL injection 03  (0) 2022.11.12
Lord of SQL injection 01, 02  (0) 2022.11.12