Wargame/Lord of SQL Injection
-
<Lord of SQL Injection> green dragonWargame/Lord of SQL Injection 2021. 11. 27. 16:40
green dragon GET 방식으로 전달받은 id와 pw에서 prob, _, ., ', " 를 필터링한다. $query를 통해 id와 pw를 가져와 $result 배열로 저장한다. $result['id']가 참이면 $query2를 통한 id를 $result 배열로 저장한다. $result['id']가 'admin'이면 문제가 풀린다. '\' 뒤에 특수문자가 오면 일반 문자로 인식한다. ?id=\&pw= or 1=1%23을 입력하면 항상 참이지만 아무 것도 출력하지 않는다. prob_green_dragon 테이블이 비어있음을 짐작할 수 있다. 따라서 union select를 이용해야 한다. ?id=\&pw=union select 1,2%23을 입력하면 select id,pw from prob_green..
-
<Lord of SQL Injection> evil wizardWargame/Lord of SQL Injection 2021. 11. 26. 13:13
evil wizard 앞서 풀었던 'hell fire'와 비슷하지만 sleep과 benchmark를 필터링한다. 출제자의 의도와 달리 앞의 문제에서 exp(1000)을 이용해 문제를 풀었기 때문에 이 문제도 똑같이 풀면된다. ■참과 거짓 구분하기 ?order=1 and id='rubiya' and if(substr(email,1,1)='r', exp(1000), 1)을 입력하면 rubiya의 email 첫 글자가 'r'로 참을 나타내므로 exp(1000)에 의해 테이블의 데이터가 출력되지 않는다. ?order=1 and id='rubiya' and if(substr(email,1,1)='a', exp(1000), 1)를 입력하면 테이블의 데이터가 출력된다. 즉, 참일 때는 테이블의 데이터가 출력되지 않고..
-
<Lord of SQL Injection> hell fireWargame/Lord of SQL Injection 2021. 11. 25. 13:19
hell fire 전달받은 order에서 prob, _, ., proc, union을 필터링한다. 올바른 email을 찾으면 문제를 해결할 수 있다. select id,email,score from prob_hell_fire where 1 order by {$_GET[order]} 위 소스 코드에서 3개의 열(id, email, score)를 가지는 것을 알 수 있다. order를 3개의 열 중 하나인 id순으로 정렬하기 위해 ?order=id를 입력하면 소스 코드에 나와있는 대로 id가 "admin"이면 email은 "**************"로 출력하고, id가 "rubiya"인 경우 email은 "rubiya805@gmail.cm"인 것을 확인할 수 있다. 올바른 email을 찾기 위해 email..
-
<Lord of SQL Injection> dark eyesWargame/Lord of SQL Injection 2021. 11. 24. 18:25
dark eyes 전달받은 pw에서 prob, _, ., ()를 필터링한다. 그리고 이전의 문제와 달리 col, if, case, when, sleep, benchmark를 필터링한다. ?pw='를 입력하면 빈 화면을 출력한다. 즉, 쿼리에 오류가 있으면 exit()을 통해 빈 화면을 출력한다. pw의 길이는 ?pw=' or id='admin' and (select 1 union select (length(pw)=문자열 길이))%23로 알아볼 수 있다. (and가 or보다 우선순위가 높음) ?pw=' or id='admin' and (select 1 union select (length(pw)>10))%23을 입력하면 빈 화면을 출력하고 ?pw=' or id='admin' and (select 1 uni..
-
<Lord of SQL Injection> iron_golemWargame/Lord of SQL Injection 2021. 11. 23. 14:33
iron_golem 전달받은 pw에서 prob, _, ., (), sleep, benchmark를 필터링한다. if(mysqli_error($db)) exit(mysqli_error($db));를 통해 에러 메시지를 출력한다. 에러 메시지를 출력하는 경우, 에러 메시지를 기반으로 하는 SQL Injection인 Error Based SQL Injection을 수행할 수 있다. pw를 구해야 문제를 풀 수 있기 때문에, Error Based Blind SQL Injection을 수행해 한 글자씩 찾아야 한다. select * from table where 1 and if(1=1,1,(select 1 union select 2))을 통해 if 절이 참이면 1을 반환하고, 거짓이면 select 1 union ..
-
<Lord of SQL Injection> dragonWargame/Lord of SQL Injection 2021. 11. 22. 21:49
dragon 전달받은 pw에 prob, _, ., ()를 필터링한다. id가 'admin'이면 문제를 풀 수 있지만, id는 'guest'로 고정되어 있고 뒷 부분은 '#'으로 주석 처리 되어있다. '#'은 한 줄 주석이므로 뒷 부분을 주석 처리 되지 않게 줄 바꿈을 하면 될 것 같다. '\n'(linefeed)은 커서를 다음 줄로 이동시키는 개행 문자로, URL Encoding으로 '%0a' 이다. 그러므로, ?pw=%0aand pw='1' or id='admin을 입력하면 select id from prob_dragon where id='guest'# and pw=' and pw='1' or id='admin' 쿼리는 위와 같은 형태를 띈다. URL 창에 ?pw=%0aand pw='1' or id='..
-
<Lord of SQL Injection> xavisWargame/Lord of SQL Injection 2021. 11. 20. 15:23
xavis 전달받은 pw에 prob, _, ., (), regex, like를 필터링한다. 문제를 해결하기 위해서는 pw의 값이 참이면서, 전달받은 pw와 쿼리 결과의 pw의 값이 같아야 한다. 우선, 기본적인 SQL Injection 구문인 ?pw=' or 1=1%23을 입력하면 "Hello admin"을 출력한다. ?pw=' or 1=2%23을 입력하면 아무것도 출력하지 않는다. "Hello admin"으로 참과 거짓을 구분할 수 있으므로 Blind SQL Injection 공격을 수행할 수 있다. pw의 길이를 확인하기 위해 ?pw=' or length(pw)=12%23을 입력하면 ?pw=' or ord(substring(pw,1,1))=47%23의 형태로, 한 글자씩 보았지만 "Hello admi..
-
<Lord of SQL Injection> nightmareWargame/Lord of SQL Injection 2021. 11. 19. 22:24
nightmare 전달받은 pw에 prob, _, ., (), #, - 를 필터링해서 하나라도 있으면 "No Hack ~_~" 메시지를 출력한다. 그리고 이 pw의 길이가 6보다 크다면 "No Hack ~_~" 메시지를 출력한다. id의 값이 참이라면 문제를 풀 수 있다. id의 값이 참이기만 하면 되기 때문에 pw를 참으로 만들고, 쿼리 뒷부분의 id!='admin' 부분은 주석 처리를 하면 될 것 같다. MySQL이 중복으로 사용되었을 때 1=2=0 (1=2)=0 1=(2=0) 참 참 거짓 일정 순서대로 처리가 된다. 즉, 괄호가 없는 1=2=0은 1과 2를 비교한 결과가 False이고, False=0을 처리하므로 참이 된다. 괄호가 있을 시, 괄호를 우선적으로 처리한다. 위와 같은 방법을 사용하여 ..