WARGAME/Lord of sql injection

LORD OF SQL INJECTION SKELETON 풀이

msh1307 2022. 5. 17. 21:08

소스 코드


1
2
3
4
5
6
7
8
9
10
11
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'== 'admin') solve("skeleton"); 
  highlight_file(__FILE__); 
?>
 
cs

풀이


pw를 파라미터로 받아와서 필터링을 해준다.

어차피 다른 데이터베이스를 공격하지 못하게 prob나 _같은 것들을 간단하게 필터링해주는 것이라 신경 쓸 필요 없다.

select id from prob_skeleton where id='guest' and pw='' and 1=0라는 쿼리문을 볼 수 있다.

여기서 pw에 ' or id='admin'--%20을 넣어주면 

select id from prob_skeleton where id='guest' and pw='' or id='admin'-- 이 된다.

-- 주석처리는 뒤에 공백이 필요하기 때문에 따로 %20을 넣어 공백을 표현했다.

쿼리문이 저렇게 되면, result['id']에는 admin이 담길 것이고, 문제가 풀릴 것이다.