※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
$_GET[id] = str_replace("admin","",$_GET[id]);
-- preg_match, str_replace 를 통한 필터링 ↑--
$query = "select id from prob_vampire where id='{$_GET[id]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
-- 실행 쿼리 ↑--
$result = @mysql_fetch_array(mysql_query($query));
if($result['id'] == 'admin') solve("vampire");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>"
해결 과정
- 필터링
ㆍ ' ( 싱글 쿼터 ) → SQL Injection query를 완성할 수 없도록 싱글쿼터를 필터링
ㆍ str_replace를통해 admin이라는 문자를 ""( 공백 )으로 치환하고 있다.
- 실행 쿼리
ㆍSELECT id FROM prob_vampire WHERE id='{$_GET[pw]}';
ㆍid를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍif($result['id'] == 'admin') solve("troll");
ㆍid에 admin을 가져오면 troll을 해결할 수 있다.
troll과 비슷한 문제로 보인다. preg_match를 쓰지않고 str_replace를 쓰는 이유는 str_replace에 키 포인트가 있다고
생각할 수 있어야 한다.
# str_replace 함수 정의
ㆍstr_replace( $search, $replace, $subject );
- 발견한 모든 검색 문자열을 치환 문자열로 교체한다.
( 만약 subject가 배열이면, 검색 및 치환을 subject의 모든 원소에서 수행하고, 배열을 반환한다. )
- str_replace( 찾을 문자열, 치환할 문자열, 대상 문자열 );
- 대소문자를 구분한다.
즉,$_GET[id] = str_replace("admin","",$_GET[id]); GET 메서드로 받아온 id에 대하여 admin이라는 문자열을 찾아 공백으로
치환해준다. id='admin'으로 GET값을 보낼 때 id=' ' ( null 값 )로 치환 된다.
대소문자를 구분하기 때문에 troll과 마찬가지로 대소문자를 통해 우회할 수 있고, admin이 삭제된다는 점을 이용해서
영리하게 우회 할 수 있다. ex) adadminmin → admin이 삭제 되면서 admin이 완성된다.
↑ 어떻게 admin을 id값으로 보낼 수 있는지 생각해보자
vampire 중요 포인트
ㆍstr_replace 함수의 취약점
ㆍ정규 표현식의 취약점을 이용해 우회하는 방법
los : golem (0) | 2017.06.23 |
---|---|
los : skeleton (0) | 2017.06.23 |
los : troll (0) | 2017.06.22 |
los : orge (0) | 2017.06.22 |
los : darkelf (0) | 2017.06.22 |
좀 알려주세요 현기증 난단 말이에요..