※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~");
if(strlen($_GET[pw])>6) exit("No Hack ~_~");
-- preg_match를 통한 필터링 ↑--
$query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
-- 실행 쿼리 ↑--
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve("nightmare");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
() → 붙은 괄호만 필터링 하고 있다. ( ) 안에 공백이나 문자가 있다면 우회가능
ㆍ ' ( 싱글쿼터 ) → 싱글 쿼터를 이용한 SQL Injection query를 완성하지 못하게 필터링
- 실행 쿼리
ㆍ$query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
ㆍ조건 id와 pw를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍ if($result['id']) solve("succubus");
ㆍid값이 존재하기만 하면 문제를 해결할 수 있다.
succubus문제를 풀 때 만약 싱글쿼터( ' )를 필터링 하지 않는다면 무난하게 qeury가 항상 참일 수 있게 만들어 문제를
해결할 수 있을 것이다. 하지만 현재 preg_match를 통해 싱글쿼터( ' )를 필터링하고 있기 때문에 접근하기가 매우
어려울 수 있다. 더블 쿼터( " )를 사용해도 더블쿼터마저 문자열로 취급해 버리기 때문에 효과가 없다.
이 문제를 해결할때 쿼리를 단편적으로 보기보다는 전체적으로 봐야하는데 이는 현재까지 싱글쿼터( ' )로 묶였을 때
우회하기란 불가능하다는 점에서 매우 중요하다. ( 더블쿼터의 사용은 싱글쿼터의 우회라고 볼 수 없다. )
los : zombie_assassin (0) | 2018.12.05 |
---|---|
los : succubus (1) | 2017.10.06 |
los : giant (0) | 2017.06.27 |
los : bugbear (0) | 2017.06.27 |
los : darkknight (0) | 2017.06.24 |
좀 알려주세요 현기증 난단 말이에요..