※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB 연결을 위한 코드↑ --
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
-- preg_match를통한 필터링↑ --
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
-- 실행 쿼리↑ --
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
-- 해결 포인트↑ --
highlight_file(__FILE__);
?>
해결 과정
필터링 : 현재 preg_match를통해 ( ' )쿼터,( " ) 더블 쿼터, ( ` ) 백 쿼터를 필터링 하고 있다.
( 테이블 접근 방지를 위한 prob_, . , ( , ) 는 기본적으로 필터링하고 있다. )
해결 포인트 : 쿼리를통해 id에 admin을 불러오면 된다.
goblin을 해결하기 위한 방법으로 2가지 방법으로 생각해 볼 수 있다. 쿼리가 항상 참일 때 limit를 통한 접근과
쿼터나 더블쿼터를 사용하지 않고 id값에 admin을 넣어주는 것이다.
【 limit를 통한 접근 】
limit를 이용한 문제해결은 어디까지나 prob_goblin테이블- id컬럼에 guest와 admin이 존재한다는 guessing 기법을 이용
하기 때문에 해결 방법으로 확신할 수 는 없지만 충분히 시도해볼 가치가 있다.
↑ limit를 이용해 Hogwart테이블에 모든 컬럼의 첫번째 데이터를 가져왔다.
# limit 0,1 → 첫번째 값( 0 ) , 한 개만( 1 ) 가져온다는 의미
# limit를 이용할때 인덱스의 시작은 0번이다.
↑ 특정 컬럼의 값을 하나씩 불러올 수 있다.
이같은 방법을 통해 prob_goblin테이블-id컬럼을 추측해본다.( guessing ) 테이블을 구성 id나 패스워드는 각각 분리해
놓기 힘들다. 즉, 프로그래머가 데이터베이스를 구성할 때 연관된 데이터들은 같은 테이에 구성해놓기 십상이다.
이러한 점을 이용해 guest와 admin이 같은 컬럼에 존재한다고 가정하고 limit를 시도하는 것이다.
쿼리 문법상 쿼리가 항상 참 일때 컬럼의 모든 값을 가져온다는 점을 명심해야한다.
↑ limit를 이용해 id컬럼의 첫번째 값이 guest임을 알았다.
# 현재 쿼리가 항상 참이기 때문에 id테이블 내부에 모든 결과를 가져온다.
# 2번째, 3번째, 4번째, 값도 추측해보자
# 이러한 시도는 데이터베이스의 구성을 이해하고 시도하는게 좋다.
↑ 이렇게 limit를 이용해 손쉽게 정답에 접근할 수 있다.
【 쿼터를 이용하지 않고 id값 입력하기 】
↑ 쿼리가 항상 참일 때 id에 admin 입력을 시도했지만, 쿼터가 필터링 되고 있기때문에 사용할 수 없다.
# 더블쿼터( " )와 백쿼터( ` )도 현재 필터링하고 있다.
# 이때 헥스코드를 입력해서 쿼터를 사용하지 않고 값을 입력할 수 있다. ex) 0x61646d696e
↑ no값은 1이 아닌 임의 숫자를 넣어주면된다.
# id='guest' and no=1 이 참이되버려서, Hello guest가 출력된다.
los -goblin 중점
ㆍmysql에서 limit의 사용법 및 활용
ㆍ헥스코드
los : wolfman (0) | 2017.06.22 |
---|---|
los : orc (0) | 2017.06.21 |
los : cobolt (1) | 2017.06.12 |
los : gremlin (0) | 2017.06.12 |
los : Start (0) | 2017.06.12 |
좀 알려주세요 현기증 난단 말이에요..