본문 바로가기

Wargame(hacking)/LOS

(26)
LORD OF SQLINJECTION : nightmare Write-Up if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~"); if(strlen($_GET[pw])>6) exit("No Hack ~_~"); $query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'"; if($result['id']) solve("nightmare"); 위의 필터링 조건에서 눈여겨 봐야할 부분은 strlen() 으로 길이를 제한 하고 있다는 점과 주석 기호가 필터링되고 있다는 것이다. 주석 필터링에 대한 우회방법은 아래와 같다. --(공백) : -- 뒤에 공백이 있어야 주석 처리가 가능하다. # : 뒤에 공백이 없어도,..
LORD OF SQLINJECTION : zombie_assassin Write-Up $_GET['id'] = strrev(addslashes($_GET['id'])); $_GET['pw'] = strrev(addslashes($_GET['pw'])); if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; if($result['id']) solve("zombie_assassin"); 위의 query 조건에 따라, addsla..
LORD OF SQLINJECTION : succubus Write-Up if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/\'/',$_GET[id])) exit("HeHe"); if(preg_match('/\'/',$_GET[pw])) exit("HeHe"); $query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; if($result['id']) solve("succubus"); 위의 필터링 조건을 봤을 때, '(single quote) 를 사용..
LORD OF SQLINJECTION : assassin Write-Up if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_assassin where pw like '{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result['id']) echo "Hello {$result[id]}"; if($result['id'] == 'admin') solve("assassin"); {$_GET[pw]} 가 like 구문과 ' ' 사이에 입력된다. 해당 문제는 wildcard를 이용해 풀어줘야 할 것 같다. ?pw=% ?pw=________ 위와 같이 wildcard '%' 사용 시..
LORD OF SQLINJECTION : giant Write-Up if(strlen($_GET[shit])>1) exit("No Hack ~_~"); if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); $query = "select 1234 from{$_GET[shit]}prob_giant where 1"; 위의 조건들을 보면, strlen() 에 의해 shit 에 대한 인자의 길이가 1자리를 넘어가서는 안된다. 또한 공백에 대한 필터링 패턴 ( |\n|\r|\t )이 적용되어 있다. select 1234 fromprob_giant where 1 위는 현재 쿼리인데, from 과 prob_giant 사이에 공백이 없어, 올바른 query가 수행되지 않는다. 공백을 통해 두 문자 사이를 떨어뜨려주도록 ..
LORD OF SQLINJECTION : bugbear Write-Up if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe"); $query = "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"; $_GET[pw] = addslashes($_GET[pw]); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve..
LORD OF SQLINJECTION : darkknight Write-Up 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"); $query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_darkknight where id='admin' and pw='{$_GET[..
LORD OF SQLINJECTION : golem Write-Up if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); $_GET[pw] = addslashes($_GET[pw]); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 필터링 및 주요 조건은 위와 같다. pw에 알맞은 문자를 입력해야만 문제를 해결할 수 있다. pw를 구하기 위해, pw 길이 부터 구해보도록 한다. ?pw=1%27%20||%20id%20like%20%27admin%27%20%26%26%20length(pw)>8%23 ?p..