본문 바로가기

워게임

[워게임 LOS] 문제 20번, 드래곤(Dragon) Lord Of SQL injection, 문제 20번 드래곤입니다. 이번 문제는 앞에 주석을 우회해야 풀리는 문제입니다.현재 쿼리문은 한 줄로 이어져있습니다.이것을 멀티라인으로 만들어서 보내면 풀릴 것입니다. 멀티라인으로 만들기 위해서는 개행문자가 필요한데그 예를 들어서 Tab(%09), Line Feed \n(%0a), Carrage Return \r (%0d) 등이 있습니다.저는 여기서 %0a 를 택했습니다. pw=1'%0a or id='admin' -- 하지만 이렇게 보냈을 때 Hello admin이 아닌 Hello guest가 출력되었습니다.제가 예상한 바로는 아래와 같습니다. SELECT id FROM prob_dragon WHERE id='guest' # and pw='1' or id='adm.. 더보기
[워게임 LOS] 문제 19번, 자비스(Xavis) Lord Of SQL injection, 문제 19번 자비스입니다.힌트는 비밀번호가 한글이라는 점인데요. 예전에 풀었던 일반적인 모습에서 비밀번호는 한글을 사용해 풀어야합니다. 먼저 LENGTH(`pw`) 를 사용해서 비밀번호 길이를 추측합니다.?pw=1' or id='admin' %26%26 LENGTH(`pw`)='12 이렇게 하면 참이 되는데요.그렇다면 비밀번호 길이가 12일까요?아닙니다. 저도 착각을 했었는데 한글 1문자당 4바이트를 차지합니다.결과적으로 비밀번호는 총 3자리가 됩니다. 이제 비밀번호를 substr 를 사용해서 찾아보겠습니다.?pw=1' or id='admin' %26%26 SUBSTR(`pw`,1,1)='가 이런식으로 풀어나갈 것입니다.저는 여기 사이트를 참고해서 한글 리스트를 .. 더보기
[워게임 LOS] 문제 18번, 나이트메어(Nightmare) Lord Of SQL injection, 문제 18번 나이트메어입니다. 일단 자리수가 6자리 이하로 정해져있습니다.필요한 값을 작성해보겠습니다. %27) 그리고 뒤를 주석처리할 %00 %27은 single quote 이고 %00은 그저 널값이니까 총 세자리를 사용했습니다.그러면 남은 세자리로 답을 출력해야는 상황입니다. 해답을 보기전에, SQL문에서 일반적으로 문자열과 상수를 어떻게 비교를 하는지부터 알아보겠습니다. "AAA" = 1 은 거짓입니다.당연하듯이 AAA는 따옴표로 감싸진 문자열이고 1은 상수이지요. 그런데.. "AAA" = 0 은 참이됩니다.엥? 왜 참이 되는 걸까요?그 이유는 0 에게 있습니다.SQL에서는 0이 임의의 문자열을 나타내는 역할을 맡고있습니다. 하지만 '123'=0 은 거짓입니.. 더보기
[워게임 LOS] 문제 17번, 서큐버스(succubus) Lord Of SQL injection, 문제 17번 서큐버스입니다. 이번 문제는 제 지식을 벗어난 문제이었습니다.그래서 하루 이틀 고생을 했는데도 모르겠다가 물어보기 찬스로!! 답은 \ 이었습니다. 생각치도 못했죠. 사실은 ㅋㅋ 이것은 특수기능인 문자를 일반 문자로 바꾸는 역할을 가지고 있습니다.이것을 id 파라미터에 넣으면 id의 시작 quote 부터 pw의 시작 quote까지 묶어지고(중간의 single quote는 일반문자열로 치환되므로)뒤에 남은건 주석처리하면 되는거였습니다. ?id=\&pw= or id LIKE "a%"# 더보기
[워게임 LOS] 문제 16번, 좀비 어쌔신(Zombie Assassin) Lord Of SQL injection, 문제 16번 좀비 어쌔신입니다. if(@ereg("'",$_GET[id])) exit("HeHe"); if(@ereg("'",$_GET[pw])) exit("HeHe"); preg_match가 아닌 ereg로 single quote를 체크하고 있습니다.그리고 쿼리문에서는 id와 pw를 single quote로 감싸고 있구요.이 상황에서는 double quote를 쓰면 바깥에 있는 single quote 때문에 먹히지 않는데요.그러면 결국 single quote를 사용해야하는 상황입니다. ereg와 관련된 문제는 8번 트롤문제에서도 나왔지만 이번과는 다른 모습이네요.ereg의 취약점은 찾아보시면 알겠지만 %00 (NULL)이 앞에 붙으면 정상적으로 체크를 하지 못합.. 더보기
[워게임 LOS] 문제 15번, 어쌔신(Assassin) Lord Of SQL injection, 문제 15번 어쌔신입니다. if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 필터링에서는 홑따옴표(Single quote)만 검사하고 있는데pw like 를 보시다시피 정규표현식을 허용하는 LIKE를 사용하고 있습니다.그리고 id 파라미터는 없고 pw만 있네요. 정규식에서 % 기호는 임의의 문자가 0번이상 반복된다는 것을 의미합니다.0% 시작해서 일일이 찾아나가면 될것입니다. 자동화 스크립트로 돌리면 더 편하지만이 문제 SQL테이블에서는 admin과 guest 사용자가 존재합니다. 입력값에 9%를 넣었을 때 반응이 이렇습니다.9%를 지정하고 Hello admin을 find로 찾으면 모든 경우의 수에서 실패할 것입니.. 더보기
[워게임 LOS] 문제 14번, 자이언트(Giant) Lord Of SQL injection, 문제 14번 자이언트입니다. if(strlen($_GET[shit])>1) exit("No Hack ~_~"); if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); 핵심을 보시면 shit 파라미터를 GET으로 받아오는데 이 길이가 1을 초과하면 exit가 됩니다.그리고 %20, %0a, %0d, %09 을 필터링합니다. 단순하게 공백 문자를 작성하면 되는 것입니다. 답은 여러가지가 있을것 같은데 제가 찾은 답은 아래입니다.%0b, %0c이 두가지중 하나를 shit= 으로 보내주면 클리어. 더보기
[워게임 LOS] 문제 13번, 버그베어(Bugbear) Lord Of SQL injection, 문제 13번 버그베어입니다. if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe"); 이전 다크나이트 문제에 더해서 or, and, 공백(%20), like, 0x 를 필터링하고있습니다.하지만 구조상에서는 비슷하기 때문에 적절하게 치환하시면됩니다. Single quote는 Double quoteor, and는 || 와 %26%26공백은 %0a %0b %09like는 IN(" ")을 사용해서 우회하고substr은 left 또는 right 사용 더보기
[워게임 LOS] 문제 12번, 다크나이트(Dark knight) Lord Of SQL injection, 문제 12번 다크나이트입니다.배율을 좀 확대해서 캡처했기 때문에 사진이 좀 큽니다. 가장 중요한 필터링 부분을 보시겠습니다.if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe"); pw에서 single quote를 필터링하고no에서 single quote, substr, ascii, 등호기호를 필터링하고 있습니다.이번에는 substring이 먹히지 않겠습니다. pw에 작업을 하려했더니 no가 있군요. 그러므로 no를 사용해서 작업을 합니다.먼저 단순하게 참을 만들어보겠습니다. pw=1234&no=1 or id LIKE ".. 더보기
[워게임 LOS] 문제 11번, 골렘(Golem) Lord Of SQL injection, 문제 11번 골렘입니다. 기본 필터링은 무시하고 두번째 pw 필터링을 봅시다. if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); or and substr( 그리고 등호(=, equal)까지 필터링하는 군요.그럼 각각의 다른 표현을 알아볼까요 or은 || 으로 바뀌고and 는 &&substr 은 substring으로 작성하면되고엥 substring이 어떻게 되냐구요? 그 이유는 preg_match에서 substr( 을 대상으로하고 있기 때문입니다.그냥 substr이라면 substring 또한 필터링되기 때문에 substring을 쓰라고 배려해준듯합니다.등호는 LIKE로 표시하면 되겠죠. 일단 첫번째 조.. 더보기