Web

SQL-Injection 정리(1)

whh1323 2020. 3. 19. 19:01

기본적인 에러기반 SQL Injection --> ' or '1=1

 

이것을 기본으로 필터링 또는 우회해서 문제를 푼다.

ex) select id from test where id='{$_GET[id]}' and pw='{$_GET[pw]}'

현재 GET 방식으로 파라미터를 전달하고 있다. 

url이 ~~.php?id=admin&&pw=admin

이라 하면 sql 구문은 select id from test where id='admin' and pw='admin' 으로 삽입이 되어진다.

여기에 아무 필터링이 없다는 가정하에

~~.php?id=admin&&pw=admin' or '1=1 을 입력하게 되면 

select id from test where id='admin' and pw='admin' or '1=1' 으로 sql구문이 들어가게 된다.

 pw='admin' or '1=1' 에서 결과 값이 참이 되어 admin으로 로그인이 되는것이 아니라,

id='admin' and pw='admin' 구문이 거짓으로 되고 그 뒤에 or '1=1'이 들어가 (거짓or참 = 참)이 되어서 결과값이 참이 되어 admin으로 로그인이 되는것이다.

 

los.rubiya.kr 1번문제 gremlin을 보면 

<?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__);
?>

로그인 인증 부분에서 id($result['id']) solve("gremlin");

으로 result에 id값이 존재한다면 무조건 풀리게 된다.