※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
-- preg_match를 통한 필터링 ↑--
$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__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
- 실행 쿼리
ㆍSELECT id FROM prob_skeleton WHERE id='guest' and pw='{$_GET[pw]}' and 1=0;
ㆍ조건 id는 'guest'로 픽스 되어있고, pw를 GET메서드로 넘겨받고 있다.
ㆍand 연산자를 이용해 query가 항상 거짓이게 만들고 있다.
- 해결 포인트
ㆍ if($result['id'] == 'admin') solve("skeleton");
ㆍid에 admin값을 불러올 수 있으면 된다.
현재 쿼리를 보면 and연사자를 이용해 쿼리가 항상 거짓이게 만들고 있다. 이는 이전 난이도에서 많이 접했던
SQL Injection을 이용한 문제임을 알 수 있다. 별다른 필터링이 없기 때문에 우리가 필요한 쿼리만 얻고 나머지
쿼리는 주석처리를 통해 무효화 시킬 수 있다.
↑ 현재 skeleton과 마찬가지로, 조건 연산자 and 때문에 쿼리가 완성되지 않는다.
# and 연산자는 앞뒤가 모두 참일 때 참이다.
# 주석( # ) 처리를 통해 and 1=2 연산을 무효화 시킬 수 있다.
↑ 학생 harry를 조회할 때 no를 알지 못해도, or 연산을 통해 참인 결과를 완성할 수 있다.
# 주석( # )을 통해 and 1=2 연산을 무효화 시켜준다.
↑ 같은 방법으로 이번 난이도를 해결할 수 있다.
skeleton 중요 포인트
ㆍquery가 데이터 베이스에서 어떻게 동작 하는지 파악하고 주석을 활용해 이를 조정할 수 있다.
los : darkknight (0) | 2017.06.24 |
---|---|
los : golem (0) | 2017.06.23 |
los : vampire (0) | 2017.06.23 |
los : troll (0) | 2017.06.22 |
los : orge (0) | 2017.06.22 |
좀 알려주세요 현기증 난단 말이에요..