※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");
-- preg_match를 통한 필터링 ↑--
$query = "select id from prob_wolfman 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>";
if($result['id'] == 'admin') solve("wolfman");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
ㆍ / / → 공백을 필터링하고 있다. 공백을 필터링 함으로서 SQL injection 쿼리를 완성하지 못하게 하고 있다.
- 실행 쿼리
ㆍSELECT id FROM prob_wolfman WHERE id='guest' and pw='{$_GET[pw]}';
ㆍ조건 id는 'guest'로 픽스 되어있고, pw를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍ if($result['id'] == 'admin') solve("wolfman");
ㆍ해결 포인트는 goblin과 유사하다. 현재는 id가 guest로 고정 되어있지만, id값에 admin을 가져오면 해결 된다.
공백이 필터링 되고 있기 때문에 SQL injectrion query를 넣을 수가 없다고 생각할 수 있지만, 공백을 우회 할 수 있는
우회 문제가 여러가지 존재한다. SQL Injetcion의 정수는 필터링 되고 있는 많은 SQL함수를 우회 할 수 있는 다른 함수를
얼마나 알고 있는 지가 중요하다.
↑ 일반적으로 URL상에서 공백은 %20으로 변환되어 사용된다.
# 현재 공백이 필터링 되고있기 때문에 %20은 사용할 수 없다.
현재 공백이 필터링 되고 있기 때문에 공백을 우회할 수 있는 문자들을 알아야 한다.
- 공백 필터링을 우회 할 수 있는 문자
ㆍ/**/ ( 주석 ) : 주석을 통해 공백을 대체할 수 있다. ex). pw='/**/or/**/1=1/**/%23
ㆍ+ ( %2B ) : 문자 + 를 통해 공백을 대체할 수 있다. ex) pw='+or+1=1+%23
ㆍ( ) : 괄호를 통해 공백을 대체할 수 있다. ex) pw='(or)1=(1)%23
ㆍ%09, %0B, %0C, %0D, %0A 등등
공백 대신 위와같은 특수 문자를 이용해 공백을 우회할 수 있다.
↑ 공백을 우회해서 SQL Injectrion query를 완성할 수 있다.
# 인젝션 쿼리는 결과가 항상 참이게 만들고, 모든 결과가 조회 되었을때, id값에 admin을 넣어준다.
wolfman 중요 포인트
ㆍInjection에서 공백을 우회 할 수 있는 문자
los : orge (0) | 2017.06.22 |
---|---|
los : darkelf (0) | 2017.06.22 |
los : orc (0) | 2017.06.21 |
los : goblin (1) | 2017.06.19 |
los : cobolt (1) | 2017.06.12 |
좀 알려주세요 현기증 난단 말이에요..