LOS(The Lord of the SQLI) 19 - XAVIS

2021. 2. 19. 04:11정보보안/웹 해킹

19번 문제 XAVIS

19번 문제인 XAVIS이다.

 

문제 해결을 위한 마지막의 if 문을 확인해보면

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis"); 로

Blind SQL Injection 문제라는것을 알 수 있다.

 

이 문제에서 필터링하고 있는것은

첫번째 preg_match 함수는 prob, _ , . , ()를 필터링하며

두번째 preg_match 함수는 regex와 like를 필터링하고 있다.

 

일반적으로 연태까지 해결해왔던 방식으로 pw의 길이를 찾고

ascii 함수와 substr 함수를 이용해 pw 값을 찾으려고 했으나, 한두시간 삽질 한 결과

여태까지와 문제가 다르다는 것을 알 수 있었다.

 

 

 

처음에는 1=1 일때는 where 절이 참이되므로 Hello admin이 출력되고

1=2 일때는 where절이 거짓이 되므로 아무것도 출력되지 않으므로

 

where절을 참으로 만들어 pw의 길이를 알아내고 pw의 값을 알아내면 되겠구나 ! 생각을 했는데

계속해서 문제가 풀리지 않자 아 아스키코드값이 무언가 잘못됬구나 싶었다.

 

계속 시도를 해본 결과

 

length(substring(pw,1,1))=4를 넣었을때 Hello admin이 출력되는걸로 보아

pw 값의 한자리 길이가 4라는것을 알 수 있었다.

 

 

 

4번 문제 orc 쿼리문

여태까지의 Blind SQL Injection 문제에서는 pw 값의 한자리 length는 1이었는데

xavis 문제에서는 한자리 length가 4이기 때문에 여기에서

'아 ! pw의 값이 알파벳과 숫자가 아니구나' 라고 생각할 수 있었다.

 

그렇다면 이 pw의 값을 어떻게 구해야 할까 계속 고민을 하다가,

지인에게 ord 함수를 이용해보라고 힌트를 받았다.

 

 

ord 함수는 아스키 코드 변환 함수로

ord('a') 는 a의 아스키코드값인 97을 반환한다.

 

여기에서 쿼리에

 ord(substring(pw,1,1)) 를 통해 pw의 첫번째 값을 추측할 수 있다.

 

 

 ord(substring(pw,1,1)) > 30000 입력 시 Hello admin이 출력되며 30000 보다는 크다는 사실을 알 수 있고 이를 반복해

 

 

 

pw 첫번째 자리

 

 

 ord(substring(pw,1,1)) = 50864 를 입력 시 Hello admin이 출력되며 50864를 chr 함수를 이용해 변환해보면 '우' 라는

한글이 나온다.

 

 

chr(50864)

 

 

 

 

 

 

이를 다음 pw 자리도 마찬가지로 반복한다.

 

 

pw 두번째 자리

 

 

chr(50773)

 

 

 

 

 

 

 

pw 세번째 자리

 

 

 

chr(44403)

 

 

 

 

pw 네번째 자리

 

 

pw의 네번째 자리는 ord(substring(pw,4,1)) >0 을 햇을때 Hello admin이 출력되지 않는것으로 보아

pw는 세번째 자리까지밖에 없다는것을 알 수 있으며

pw의 값은 '우왕굳' 이다.

 

 

19번 문제 XAVIS Clear!