[Lord of SQLInjection] Golem Write UP
2021. 7. 18. 17:51
워게임/Lord of SQLInjection
이번 문제는 Orge 문제와 유사한 문제이다. 하지만 좀 더 강력한 필터링이 걸어져 있었다. prob, _, ., (), or, and, substr(, =이 필터링이 걸어져 있었고, 거기에 addslashes 함수로 특정 특수문자를 사용 못하게 치환하였다. 내가 SQL Injection에 사용하는 문자열들은 or, LENGTH(pw)=, SUBSTR(PW, 1, 1)=이 있다. 필터링에 걸리는 것은 or, SUBSTR(, =이 걸린다. 이것을 우회하려면 ||, LIKE로 우회가 가능하다. 하지만 SUBSTR 함수는 우회 방법이 없어서 다른 함수를 사용해야할 것 같았다. 일단 pw의 길이를 구해보겠다. Orc 문제처럼 admin의 pw가 여러 개는 아닌 듯 하다. admin의 pw 길이는 8개이며, gu..
[Lord of SQLInjection] Skeleton Write UP
2021. 7. 18. 17:48
워게임/Lord of SQLInjection
이번엔 좀 특이한 쿼리문이 나왔다. 내 생각에는 만약 where절의 pw에 ' or id='admin'를 삽입하여 select id from prob_skeleton where id=‘guest’ and pw=‘’ or id=‘admin’ and 1=0와 같은 쿼리를 만들었을 때, id='admin' and 1=0을 False (True and False)로 만들어줘서 작동이 안되겠끔하기 위해서 맨 뒤에 and 1=0를 넣은 듯 하다. 하지만 우리에겐 주석처리라는 방법이 있다! 위와 같이 and 1=0을 주석처리를 하면 True만 남게 됨으로 쿼리문의 결과는 admin을 반환하게 된다.
[Lord of SQLInjection] Vampire Write UP
2021. 7. 18. 17:46
워게임/Lord of SQLInjection
이번 문제는 '를 필터링하고 있으며, id 파라미터의 값을 소문자로 만들어서 만약 값이 admin이 있으면 replace 함수를 이용하여 지우는 알고니즘을 갖고 있다. 나는 '의 필터링과 admin의 replace를 우회하기 위해 Hex 값을 사용하는 것을 생각했지만, where절의 id가 ''으로 묶어져 있기 때문에 통하지 않는다. 그래서 나는 Xss 공격을 방어하기 위한 replace 함수를 우회하는 방법 중 하나인 를 이용하기로 하였다. adadminmin을 넣어줘서 ad admin min으로 replace처리가 되어 지워지면 값은 admin이 되기 때문에 간단하게 쿼리의 결과를 admin를 반환받을 수 있었다.
[Lord of SQLInjection]Troll Write UP
2021. 7. 16. 10:12
워게임/Lord of SQLInjection
id가 admin인 결과를 반환해야하는데 문자열 admin에 필러팅이 걸려져 있다. 그럼 그동안 풀었던 방법대로 or와 Hex 값을 넣어줌으로써 풀이하면 될까? 이 방법도 '를 필터링을 걸어줌으로 막고 있었다. Try - 1 0x27은 '의 아스키코드 Hex 값이다. 혹시나 '를 아스키코드 Hex 값으로 넘겨주면 인식하지 않을까? 라는 생각에 넣어봤지만 실패하였다. Try - 2 webhacking.kr의 문제 풀이를 하면서 배웠던 공백을 이용한 방법을 이용해봤다. 만약 mysql에서 id 컬럼을 만들 때 varchar의 크기를 255로 설정하였고 저장된 값은 ‘admin’ 5글자이면 나머지 250의 크기는 공백으로 처리가 된다. 이 점을 이용하여 ‘admin ‘를 요청하면 mysql은 ‘admin’으로..
[Lord of SQLInjection] Orge Write UP
2021. 7. 16. 10:09
워게임/Lord of SQLInjection
이번 문제는 Orc 문제와 Darkelf 문제를 혼합한 문제이다. or, and가 필터링되어 있기 때문에 ||, &&를 이용하면 되고, addslashes 함수를 통해 ', ", \, Null 바이트를 사용하지 못하게 치환하기 때문에 문자열은 Hex 값으로 넘겨주면 우회가 된다. import requests, string, itertools url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' headers = {'Cookie': 'PHPSESSID=vu81ckm9savbopm00mj0sj2b9i'} def pwLength(): for num in range(1, 100): parameter = f"?pw='||LENG..
[Lord of SQLInjection] Darkelf Write UP
2021. 7. 14. 13:53
워게임/Lord of SQLInjection
이번 문제는 Wolfman 문제에서 발전된 문제이다. Wolfman의 정답을 그대로 보내봤지만, or, and가 필터링 되어서 통과를 못하는 것을 볼 수 있다. 그럼 or, and를 대체 문자를 이용하여 필터링을 우회하면 된다. or, and는 ||, &&로 대체할 수 있다. ||, &&를 사용하면 공백을 넣을 필요 없이 구분할 수 있어서 (, )를 사용하지 않아도 된다.
[Lord of SQLInjection] Wolfman Write UP
2021. 7. 14. 13:18
워게임/Lord of SQLInjection
pw를 입력을 받는데, 쿼리문의 결과 id는 admin이어야 문제를 풀 수 있다. 필터링되는 문자은 prob, _, ., (, ), 공백이다. 일단 or 연산을 이용하여 id='guest' and pw='' or id='admin' -> False or True으로 만들어줘서 True인 id='admin'이 작동하도록 하겠다. 하지만 or id='admin'에는 공백이 있어서 if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");이 작동되었다. 그래서 or 뒤에 공백 대신 ()를 감싸줘서 공백을 없애주도록 하겠다. or 뒤 (,)은 No Hack ~_~ 조건문에 걸리지 않는 듯 하다.
[Lord of SQLInjection] Orc Write UP
2021. 7. 12. 22:49
워게임/Lord of SQLInjection
이번엔 두 개의 쿼리문으로 문제를 만들었다. $query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result['id']) echo "Hello admin"; 첫번째 쿼리문이다. 쿼리의 결과 id가 admin일 때, Hello admin를 출력한다. $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($..
[Lord of SQLInjection] Goblin Write UP
2021. 7. 6. 08:01
워게임/Lord of SQLInjection
쿼리문을 보자마자 생각나는 방법이 하나 있다. if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); id 파라미터가 쿼리문에 하드코딩 되어 있어서 id의 검증은 따로 없었다. 하지만 no 파라미터의 경우 prob, _, ., (), ', ", `에 대해서 검증하고 있었다. $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result[..