※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
if(@ereg("admin",$_GET[id])) exit("HeHe");
-- preg_match, ereg를 통한 필터링 ↑--
$query = "select id from prob_troll where id='{$_GET[id]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
-- 실행 쿼리 ↑--
$result = @mysql_fetch_array(mysql_query($query));
if($result['id'] == 'admin') solve("troll");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ ' ( 싱글 쿼터 ) → SQL Injection query를 완성할 수 없도록 싱글쿼터를 필터링
ㆍ ereg 를 통해 문자 'admin'를 필터링 하고 있다.
- 실행 쿼리
ㆍSELECT id FROM prob_troll WHERE id='{$_GET[pw]}';
ㆍid를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍif($result['id'] == 'admin') solve("troll");
ㆍid에 admin을 가져오면 troll을 해결할 수 있다.
이전 SQL Injection문제와 동일해 보이지만, ereg을 통해 'admin'을 필터링하고 있다. 'admin'을 가져와야 하는 상황에서
'admin'을 필터링하고 있다면 말이되지 않는다. 하지만, 중요 포인트는 필터링에서 preg_match가 아닌 ereg를 통해서
'admin'을 필터링 하고 있다는 점이다.
왜 굳이 preg_match가 아닌 ereg를 통해서 필터링을 할까? 라는 의문을 품어야 한다.
- ereg() 함수 정의
ㆍint eregi(string pattern, string string, array[regs]);
검색 대상 문자열(string)에서 정규 표현식으로 나타낸 패턴(pattern)과 일치하는 문자열이 발견될 경우에 true 를,
발견되지 않을 경우에는 false를 반환한다. 이때 대소문자는 구분한다.
즉, if(@ereg("admin",$_GET[id])) exit("HeHe"); 이는 Admin, aDmin, ADMIN,... ereg가 대소문자를 구분한다는 점을 이용해서
우회 할 수 있다.
↑ egre의 취약점을 이용해 우회 할 수 있다.
troll 중요 포인트
ㆍereg 함수의 취약점
ㆍ정규 표현식의 취약점을 이용해 우회하는 방법
los : skeleton (0) | 2017.06.23 |
---|---|
los : vampire (0) | 2017.06.23 |
los : orge (0) | 2017.06.22 |
los : darkelf (0) | 2017.06.22 |
los : wolfman (0) | 2017.06.22 |
좀 알려주세요 현기증 난단 말이에요..