※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
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('/or|and/i', $_GET[pw])) exit("HeHe");
-- preg_match를 통한 필터링 ↑--
$query = "select id from prob_darkelf 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("darkelf");
highlight_file(__FILE__);
-- 해결 포인트 ↑--
?>
해결 과정
- 필터링
ㆍ prob, _ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지
ㆍ or , and → or과 and 문자를 필터링, SQL Injectrion query 완성을 막고 있다.
- 실행 쿼리
ㆍSELECT id FROM prob_wolfman WHERE id='guest' and pw='{$_GET[pw]}';
ㆍ조건 id는 'guest'로 픽스 되어있고, pw를 GET메서드로 넘겨받고 있다.
- 해결 포인트
ㆍ if($result['id'] == 'admin') solve("darkelf");
ㆍ해결 포인트는 wolfman과 유사하다. 현재는 id가 guest로 고정 되어있지만, id값에 admin을 가져오면 해결 된다.
or과 and 문자를 필터링 하고 있어서 조건 연산을 사용할 수 없다. 하지만 and와 or문자 필터링을 우회할 수 있는
같은 기능을 하는 대체 문자가 존재한다.
↑ 이처럼 조건의 no값을 null값으로 정하면 아무런 결과도 조회 되지 않지만, or 연산자를 이용해 쿼리를 항상 참으로 만든다면
Hogwarts 테이블의 student컬럼의 모든 값이 조회 된다.
# or 연산 → A or B : A와 B 둘 중 하나라도 참이면 결과는 참이다.
# and 연산 → A and B : A와 B 모두 참이면 결과이다.
↑ and 연산으로 student를 지정해서 원하는 학생을 뽑을 수 있다.
이렇게 SQL Injection query를 완성할 때 or, and 연산자는 매우 중요한 역활을 한다. 이때 and와 or을 필터링한다면
같은 기능의 다른 문자를 이용해서 필터링을 우회 할 수 있다.
- or, and 필터링을 우회 할 수 있는 문자
ㆍor → || ( 더블 파이프 )
ㆍand → && ( 엠퍼센트 ) = %26%26 ( URL 표기법 ), &는 URL상에서 변수 구분자로 사용되기 때문
↑ and연산과, or연산을 | |와 &&로 대체할 수 있다.
↑ 같은 방법으로 and문자, or문자 필터링을 우회해서 문제를 해결할 수 있다.
darkelf 중요 포인트
ㆍSQL Injection에서 and와 or을 우회 할 수 있는 문자
los : troll (0) | 2017.06.22 |
---|---|
los : orge (0) | 2017.06.22 |
los : wolfman (0) | 2017.06.22 |
los : orc (0) | 2017.06.21 |
los : goblin (1) | 2017.06.19 |
좀 알려주세요 현기증 난단 말이에요..