본문 바로가기
WarGames/SQL Injection

Lord of SQL Injection : Orc[4]

by madevth 2021. 11. 13.
반응형

[Level 4. Orc] Sol → ?pw=095a9852

우선 코드를 분석해보자.

id가 admin인 사용자가 들어오면 Hello admin이 뜬다.

단계를 클리어하기 위해서는 DB에서 가져온 pw와 addslashes()를 통해 '앞에 \를 붙여준 pw가 일치해야 한다.

Blind SQLi를 사용해서 id가 admin인 사용자의 패스워드를 직접 알아내 보자.

 

Blind SQLi는 쿼리의 참과 거짓에 따라 응답이 달라지는 것을 이용해야 하므로 pw=' or 1 = 1 #과 pw=' or 1 = 2#를 넣어 응답을 살펴보자. (or로 연결한 이유는 pw = ''가 무조건 거짓이기 때문에 뒤에 오는 쿼리에 참/거짓에 따라 응답이 달라지기 때문이다.)

 

/?pw=' or 1 = 1 %23

/?pw = ' or 1 = 2 %23

참인 쿼리(1=1)와 거짓인 쿼리(1=2)에 따라 Hello admin의 echo 여부가 달라지므로, Blind SQli를 사용할 수 있다는 것을 알 수 있다.

 

이제 pw값을 한 글자씩 알아낼 것인데, preg_match에서 prob를 사용하는지 검사하므로 prob_orc 테이블에서 pw를 가져오는 방식은 사용하지 못한다. /?pw = ' or로 연결하여 앞의 쿼리를 무시하고, id = 'admin'이고 pw의 m 번째 글자가 x인 행이 있니? 의 방식으로 체크해주어야 한다. (m 번째 문자의 아스키코드 값과 숫자 x를 비교)

 

우선 패스워드의 총 길이를 알아내 보자.

/?pw=' or id = 'admin' and length(pw) > 7 %23

패스워드의 길이가 7보다는 큰데 8보다는 크지 않으므로 8 임을 알 수 있다. → 글자를 찾아내는 과정을 8번 반복해야 한다.

 

패스워드의 첫 글자부터 알아내 보자.

/?pw=' or id='admin' and ascii(substring(pw, 1, 1)) > 50 %23

/?pw=' or id='admin' and ascii(substring(pw, 1, 1)) > 25 %23

50보다는 작고, 25보다는 큰데, 이 작업을 이진 탐색에 기초해서 계속 반복하다 보면

첫 번째 글자의 아스키코드 값이 48보다는 크지 않고 47보다는 크므로 48 임을 알 수 있다. 따라서 패스워드의 첫 글자는 0이다.

 

이런 방식으로 두 번째 글자부터 마지막 글자까지 아스키코드를 알아내면,

2번째: 57 / 9

3번째: 53 / 5

4번째: 97 / a

5번째: 57 / 9

6번째: 56 / 8

7번째: 53 / 5

8번째: 50 / 2

 

 

따라서 id가 admin인 사용자의 pw는 095a9852이다.

 

Blind SQLi 자동화 코드 : [모의해킹_이론] - Python 자동화 코드 구현하기 : Blind SQL Injection

반응형

댓글