(Lord of SQLInjection) phantom 문제입니다.
먼저 제공되는 소스코드를 살펴보면
<?php
include "./config.php";
login_chk();
$db = dbconnect("phantom");
if($_GET['joinmail']){
if(preg_match('/duplicate/i', $_GET['joinmail'])) exit("nice try");
$query = "insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}')";
mysqli_query($db,$query);
echo "<hr>query : <strong>{$query}</strong><hr>";
}
$rows = mysqli_query($db,"select no,ip,email from prob_phantom where no=1 or ip='{$_SERVER[REMOTE_ADDR]}'");
echo "<table border=1><tr><th>ip</th><th>email</th></tr>";
while(($result = mysqli_fetch_array($rows))){
if($result['no'] == 1) $result['email'] = "**************";
echo "<tr><td>{$result[ip]}</td><td>".htmlentities($result[email])."</td></tr>";
}
echo "</table>";
$_GET[email] = addslashes($_GET[email]);
$query = "select email from prob_phantom where no=1 and email='{$_GET[email]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['email']) && ($result['email'] === $_GET['email'])){ mysqli_query($db,"delete from prob_phantom where no != 1"); solve("phantom"); }
highlight_file(__FILE__);
?>
코드를 총 3개로 분류 할 수 있습니다.
위 중간 아래 로 분류한다면 위 코드는 GET으로 joinemail을 받고 있습니다.
중간 코드는 DB에 있는 값을 테이블로 구성해 ip와 email을 출력해주고 있으며 no=1이라면 email을 *로 가리고 있습니다.
아래 코드는 GET으로 email을 받으며 저장되어있는 email가 입력한 email이 일치한다면 문제가 해결된다고 합니다.
aaa를 예시로 입력해보니
현재 본인의 ip와 입력한 aaa값이 email로 입력되고 있습니다.
values를 (), () 구조로 해결해야 할것같아 시도해보니
values의 첫번째()를 탈출해 원하는 대로 입력가능한 두번째 ()를 작성하는데는 성공했습니다.
다만 여러가지를 시도해보니 no=1이면 작성이 안되고 ip또한 일치해야만 작성이 가능했습니다.
방법이 안보여서 values에 대해 찾아보니
values내부에 select문의 입력이 가능하다는 것을 알게되었습니다.
이를 활용해 아래와 같은 구조를 입력한다면 ***로 암호화된 no=1의 email을 찾는 것이 가능합니다.
select email from 테이블 where no=1
문제사이트에서 시도해보면
어째서인지 값이 출력되지를 않았습니다.
해서 values 내부에 select를 활용하는 구문을 더 찾아보니 내부에 사용할때 테이블을 조회하는데
자기자신을 참조하는 코드는 작성이 안된다고 합니다.
이를 해결하기 위한 방법으로 as 를 활용한 별칭을 지정하는 방법을 찾아 아래와 같이
코드를 구성했습니다.
select email from 테이블 as t where no=1
as로 별칭을 주어 테이블이름을 다르게 한다면 참조가 가능해 진다고 합니다.
(어째서인지는 MySQL에 대한 공부가 더필요해 추후 정리하도록 하겠습니다.)
구성한 코드를 문제사이트에 전달해보면
테이블에 암호화됬던 email의 값을 찾았습니다.
찾은 email 값을 세번째 코드인 GET email로 값을 전달해주면
문제가 해결되었습니다!
'Wargame(Web) > Lord of SQLInjection' 카테고리의 다른 글
(Lord of SQLInjection) zombie 문제 (0) | 2022.11.25 |
---|---|
(Lord of SQLInjection) ouroboros 문제 (0) | 2022.11.21 |
(Lord of SQLInjection) frankenstein 문제 (0) | 2022.11.17 |
(Lord of SQLInjection) blue_dragon 문제 (0) | 2022.11.17 |
(Lord of SQLInjection) red_dragon 문제 (0) | 2022.11.13 |