본문 바로가기

wargame/LOS

[LOS]1번 GREMLIN

JOIN


Lord Of SQLinjection(이하 LOS) 문제를 풀어보자!

"enter the dungeon"을 클릭하면 login을 할 수 있다. join을 클릭해서 회원가입을 할 수 있다. webhacking.kr과 달리 회원가입하는데 별 어려움이 없다.

차례대로 문제를 풀어볼 수 있게 구성되었다.

GREMLIN




문제를 살펴보자.

<?php
  include "./config.php";
  login_chk();
  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 ~_~");
  // id와 pw를 대상으로 prob, _, ., ()에 필터링한다 

  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  // prob_gremlin 테이블에서 id가 $_GET[id]이고 pw가 $_GET[pw]인 record의 id 값을 select하는 쿼리 작성

  echo "<hr>query : <strong>{$query}</strong><hr><br>"; // 문제 페이지에 쿼리문 출력
  $result = @mysql_fetch_array(mysql_query($query)); // 쿼리 실행하여 배열 형태로 $result에 저장

  if($result['id']) solve("gremlin"); // $result['id']가 존재하면 문제 해결!
  highlight_file(__FILE__);
?>


조건을 만족하도록 쿼리를 삽입해보자. 코드를 보면 GET방식으로 입력받으므로 URL 뒤에 ?을 입력하고 그 후에 변수에 값을 넣는 방식이다. id와 pw에 1을 넣어보았다.


$result['id']가 존재만 하면 되므로 where 조건문을 무조건 TRUE로 만들도록 삽입하면 해결할 수 있을거 같다.
짜잔!

이 방법은 SQL에서 연산자 우선순위가 and가 or보다 높기 때문에 id나 pw가 무엇이든 '1'='1' 즉, 참이므로 id 값들을 반환받을 수 있기 때문에 가능한 방법이다.

이렇게 하면 실패한다.

union을 사용해서 문제를 풀면 필터링에 걸려 실패한다.
("id='%20union%20insert%20(a,a)%20into%20prob_gremlin%20
union
%20select%20id%20from%20prob_gremlin%20 where%20id=%27a%27%20and%20pw=%27a%27#id=1andpw=1'or1=1'")
+)19.07.10
%00을 쓰면 필터링을 피할 수 있다고 한다. 실험해 보자.

실패.

+)19.08.15
기초적인 거지만 뒤에 문제 풀다가.


'wargame > LOS' 카테고리의 다른 글

[LOS]6번 DARKELF  (0) 2019.07.21
[LOS]5번 WOLFMAN  (0) 2019.07.12
[LOS]4번 ORC  (0) 2019.07.11
[LOS]3번 GOBLIN  (0) 2019.07.09
[LOS]2번 COBOLT  (0) 2019.07.09