2021. 2. 19. 04:11ㆍ정보보안/웹 해킹
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라는것을 알 수 있었다.
여태까지의 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 보다는 크다는 사실을 알 수 있고 이를 반복해
ord(substring(pw,1,1)) = 50864 를 입력 시 Hello admin이 출력되며 50864를 chr 함수를 이용해 변환해보면 '우' 라는
한글이 나온다.
이를 다음 pw 자리도 마찬가지로 반복한다.
pw의 네번째 자리는 ord(substring(pw,4,1)) >0 을 햇을때 Hello admin이 출력되지 않는것으로 보아
pw는 세번째 자리까지밖에 없다는것을 알 수 있으며
pw의 값은 '우왕굳' 이다.
'정보보안 > 웹 해킹' 카테고리의 다른 글
LOS(The Lord of the SQLI) 21 - IRON GOLEM (0) | 2021.02.22 |
---|---|
LOS(The Lord of the SQLI) 20 - DRAGON (0) | 2021.02.20 |
정규표현식 해석 사이트 (0) | 2021.02.19 |
LOS(The Lord of the SQLI) 18 - NIGHTMARE (0) | 2021.02.19 |
LOS(The Lord of the SQLI) 17 - Zombie Assassin (0) | 2021.02.18 |