※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
문제 분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB연결을 위한 코드 ↑--
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
-- preg_match를 통한 필터링 ↑--
$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";
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_darkknight where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
() → 붙은 괄호만 필터링 하고 있다. ( ) 안에 공백이나 문자가 있다면 우회가능
ㆍ ' ( 싱글쿼터 ) → 싱글 쿼터를 이용한 SQL Injection query를 사용하지 못하게 필터링
ㆍ substr, ascii, = → Blind SQL Injection의 주요 함수를 필터링 하고 있다.
( 위의 함수를 보고 Blind SQL Injection과의 관련성을 파악 )
- 실행 쿼리
ㆍ$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";
ㆍ조건 id는 'guest'로 픽스 되어있고, pw와 no를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍ if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
ㆍ데이터 베이스에 저장되어 있는 admin의 pw를 입력하면 문제가 해결된다.
이전 문제와 비슷하게 Blind SQl Injection통해 admin의 pw를 알아내는 문제이다. 현재 ' ( 싱글쿼터 ), ascii, substr,=
이 필터링 되고 있다.
필터링 되고 있는 함수와 동일한 기능을 하는 함수를 찾아내서 필터링 우회를 시도해 볼 수 있다.
↑ascii 함수와 동일한 기능을 하는 ord 함수를 이용해 필터링을 우회 할 수 있다.
↑현재까지 String Injection에서 싱글쿼터 ( ' )를 우회 할 방법은 존재하지 않는다.
# 더블 쿼터 ( " )는 우회라는 개념보다는 같은 기능을 하는 같은 메서드라고 생각하면 된다. 단지, 현재 preg_match를 통한 필터링에
더블쿼터 ( " )에 대한 필터링이 없기 때문에 사용 하는것
↑조금 다른 접근으로 hex를 사용해 ascii함수를 대체할 수 있다.
# ascii가 10진수를 반환해 준다면, hex는 16진수를 반환해 준다.
↑이전 난이도와 동일하게 Blind SQL Injection을 통해 admin의 pw를 알아갈 수 있다.
↑자동화 툴을 코딩하지 않았다면 조금의 고생을 통해 pw를 얻어낼 수 있다.
darkknight 중요 포인트
ㆍascii함수를 우회할 수 있는 함수
ㆍBlind SQL Injection을 시도할 때 데이터 베이스의 구성을 그릴 줄 알아야 한다.
ㆍBlind SQL Injection을 시도할 때 자동화 코드 구성 해보기
los : giant (0) | 2017.06.27 |
---|---|
los : bugbear (0) | 2017.06.27 |
los : golem (0) | 2017.06.23 |
los : skeleton (0) | 2017.06.23 |
los : vampire (0) | 2017.06.23 |
좀 알려주세요 현기증 난단 말이에요..