klaus

[Lord of SQL Injection] orge 7단계 본문

모의해킹/Wargame

[Lord of SQL Injection] orge 7단계

klus! 2022. 12. 5. 18:07

1. 문제

 

 

2. 분석

[주요 코드]

if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 

필터링 : prob, _ , . , ( , ) 대소문자 필터링

if(preg_match('/or|and/i'$_GET[pw])) exit("HeHe"); 

추가로 연산자 or,and 대소문자 필터링
$query "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'"

id는 게스트로 고정되어 있고 패스워드 값을 넣어 확인

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

진짜 비밀번호를 입력해야 풀리는 문제

 

3. 문제풀이

해당 문제의 경우 4번 문제(Blind SQLi)에서 논리 연산자(or, and)를 추가로 필터링된 문자라고 할 수 있습니다.
먼저, Blind SQLi를 사용 가능한지 확인해보겠습니다.(참과 거짓 출력 확인)

 

guest의 파라미터 값을 참으로

guest를 참값으로 만들어 줄 경우 위와 같은 메시지가 출력되는 것을 확인할 수 있습니다.

그럼 이제 guest 닫고(||), admin의 패스워드를 참과 거짓을 이용하여 문제를 풀어봅시다.

 

이용할 함수는

ascii () : 아스키코드

length() : 문자열 길이 반환(패스워드 길이 파악)

substring(문자열, 시작, 길이) : 

 

?pw=0'|| length(pw)='8(?pw=0%27%20||%20length(pw)=%278)을 사용하였을 때 참값인 Hello admin이 출력됩니다.

그러므로 패스워드의 길이는 8글자입니다.

 

이번에는 파이썬 코드를 작성하여 문제를 풀어보았습니다.

작성 시 할 때 head변수를 로그인한 쿠키값으로 넣어서 작성하였고 문자열을 찾을 때에는 응답이 참인 값(hello admin)이 나올 때까지 하나씩 대입하였습니다. 

이렇게 코드를 작성해보니...

시간이 너무 오래 걸렸습니다. 다음에는 이진 탐색을 해서 작성하는 방법을 사용해봐야겠습니다.

짧은 8글자 비밀번호를 찾는데 시간이 걸리는 듯 합니다.

 

 

Comments