※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.
※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.
http://los.eagle-jump.org/(클릭)
분석
<?php
include "./config.php";
login_chk();
dbconnect();
-- DB 연결을 위한 코드 ↑ --
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
-- preg_match를 통한 필터링 ↑ --
$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
-- 실행 쿼리 ↑ --
$result = @mysql_fetch_array(mysql_query($query));
if($result['id'] == 'admin') solve("cobolt");
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
-- 해결 포인트 ↑ --
highlight_file(__FILE__);
?>
해결 과정
해결 포인트를 보면 쿼리를통한 결과값이 'admin'이어야 한다. gremlin과 마찬가지로 입력가능한 파라미터는 id 와 pw이다.
md5는 암호화 해시함수로 사실상 게싱방법으로 추측해서 맞추기는 불가능하다.
point! 싱글 쿼터를 이용해 id에 admin값을 넘겨 주고, 항상 참이게 만듦과 동시에 주석처리를 통해 변수 파라미터 pw의
md5는 무시할 수 있다.
↑ 싱글쿼터( ' )의 위치를 조정해서 admin 값을 id파라미터에 넣어줄 수 있다.
# here이 위치한곳의 조작해 pw파라미터를 무시한채 쿼리가 항상 참일 수 있게 만들어주자
↑ 간단하게 풀릴 줄 알았는데 함정이 있었다.
이러한 결과가 나오는 이유는 where id='admin' 조건문이 존재하지만, or 1=1 # 때문에 그냥 참인 값만 반환
하게 된다. 이는 id가 admin인 값을 반환하는것이 아니라 테이블에 들어간 순서대로 뽑아냈기 때문이다.
아마도 rubiya가 테이블 맨 위에 있지 않을까 싶다.
↑ mysql에 직접 쿼리를 작성하면서 문제를 해결하면 이해하기 쉽다.
# magic_student = woo를 뽑아내는게 아니라 no컬럼의 모든 값을 뽑아냈다.
이때 and를 이용해 뽑고자하는 id를 확실히 해준다면 정확하게 admin을 뽑아올 수 있다.
↑ and를 이용해 magic_student='woo'를 정확히 지정해줬다.
↑cobolt 퇴치
los : wolfman (0) | 2017.06.22 |
---|---|
los : orc (0) | 2017.06.21 |
los : goblin (1) | 2017.06.19 |
los : gremlin (0) | 2017.06.12 |
los : Start (0) | 2017.06.12 |
좀 알려주세요 현기증 난단 말이에요..