※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
-- preg_match를 통한 필터링 ↑--
$query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
-- 실행 쿼리 ↑--
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
ㆍ or , and → or과 and 문자를 필터링, SQL Injectrion query 완성을 막고 있다.
- 실행 쿼리
ㆍSELECT id FROM prob_orge WHERE id='guest' and pw='{$_GET[pw]}';
ㆍ조건 id는 'guest'로 픽스 되어있고, pw를 GET메서드로 넘겨받고 있다.
ㆍ쿼리가 제대로 실행되면 if( $result['id']) 실행
- 해결 포인트
ㆍ if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
ㆍ해결 포인트는orc와 유사하다. admin의 비밀번호를 입력하면 해결할 수 있다.
orc와 비슷하게 Blind SQl Injection을 시도하는 문제이다. 다만 or,and 연산을 사용할 수 없기 때문에 이를 우회하는
문자를 사용하면서 Blind SQL Injection을 시도 해야한다.
↑ 현재 orge와 같은 환경을 구성해 보았다.
# 알고 싶은 학생이 harry지만 현재 조건은 student='potter' 로 고정 되어있다. 이때 or( | | )연산자를 이용해서 쿼리가 항상 참이게
만들어 student 컬럼의 모든 값을 조회할 수 있다.
# orge문제에서는 결과가 존재하면 Hello Guest 혹은 Hello admin을 통해 참,거짓을 판단해 볼 수 있다.
↑ and( && ) 연산자를 이용해 student를 지정해 줄 수 있다.
# and( && )를 사용하지 않아도, harry라는 학생이 존재한다면 쿼리를 참이게 만들 수 있다.
↑ harry의 no를 알고 싶다면 and ( && ) 연산자와 ascii, substr 함수를 이용해서 알아낼 수 있다.
# substr( no, 1, 1 ) 여기서 no는 문자열이 아닌 컬럼을 의미한다. 즉, student의 no를 의미한다.
# 2를 아스키 변환하면 49가 되기때문에 harry의 no 1번째 글자는 2라는것을 알 수 있다.
↑ 같은 방식으로 admin의 pw를 알아낼 수 있다.
# 결과 참이기 때문에 Hello admin이라는 문구가 나온다.
# Blind SQL Injection을 통해 admin의 pw가 6으로 시작하고 있음을 알 수 있다.
↑ 현재 테이블 prob_orge이 위와 같이 구성되어있음을 추측해 볼 수 있다.
# guest와 admin의 순서가 다를 수 있다.
# 데이터 베이스의 구성을 머리속으로 생각하면서 인젝션을 시도해야 한다.
↑ Blind SQL Injection을 시도 함으로서 orge를 해결할 수 있다.
orge 중요 포인트
ㆍand, or 연산자를 우회할 수 있는 문자
ㆍBlind SQL Injection을 시도할 때 데이터 베이스의 구성을 추측해 볼 수 있어야 한다.
los : vampire (0) | 2017.06.23 |
---|---|
los : troll (0) | 2017.06.22 |
los : darkelf (0) | 2017.06.22 |
los : wolfman (0) | 2017.06.22 |
los : orc (0) | 2017.06.21 |
좀 알려주세요 현기증 난단 말이에요..