Almon Dev

[Lord of SQL Injection] goblin 풀이 본문

모의해킹/Lord of SQLi

[Lord of SQL Injection] goblin 풀이

Almon 2025. 1. 6. 17:07

LOS 풀이

 

goblin

 

 

풀이

1. 코드 분석

GET 메서드로 no 파라미터에 값이 쿼리에 삽입되고 쿼리의 결과중 id가 admin인 경우 문제가 풀립니다.

$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");

 

prob _ . () 뿐만 아니라 ' " ` 까지 필터링이 됩니다.

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

 

no의 의미를 예상해보자면 숫자이기 때문에 idx같은 것이 아닐까 생각됩니다.

쿼리의 결과가 있을경우 id를 화면에 출력해 주기 때문에 no에 값을 입력해서 guest의 no 번호를 알아내 봅니다.

if($result['id']) echo "<h2>Hello {$result[id]}</h2>";

 

no가 1인 경우 Hello guest가 출력됩니다.

그렇다면 admin의 no를 찾는다면 admin을 쿼리의 결과로 만들 수 있습니다.

 

2. 쿼리 삽입

and 연산이 or보다 먼저 되기 때문에

( id='guest' and no=0 ) or no=2 가 됩니다.

guest의 no는 1이었기 때문에 false or no=2가 되어서 no가 2인 admin이 출력됩니다.

select id from prob_goblin where id='guest' and no=0 or no=2