Wargame/Lord of SQL Injection
-
<Lord of SQL Injection> zombie_assassinWargame/Lord of SQL Injection 2021. 11. 18. 13:39
zombie_assassin addslashes() : 싱글 쿼터('), 더블 쿼터("), 백 슬래시(\), NULL 문자 앞에 백 슬래시가 추가된 문자열 반환 strrev() : 문자열 반전 즉, 전달받은 id와 pw에 위와 같은 문자가 있다면 백 슬래시를 추가하고 반전하여 반환한다. 그리고 prob, _, ., ()를 필터링한다. id 값이 참이면 문제를 해결할 수 있기 때문에 select id from prob_zombie_assassin where id='' and pw='' 빨간 부분을 단순한 문자열로 만들고 맨 뒤의 싱글 쿼터는 주석 처리하면 될 것 같다. 더블 쿼터(")를 입력하면 addslashes()에 의해 \"가 되고 strrev()를 통해 "\를 반환한다. 즉, id에 더블 쿼터를 전..
-
<Lord of SQL Injection> succubusWargame/Lord of SQL Injection 2021. 11. 17. 12:04
succubus prob, _, ., (), 싱글 쿼터(')를 필터링한다. 쿼리에 대한 결과가 참인지 거짓인지 구분하는 메시지를 출력하는 구문이 없어 Blind SQL Injection이 아닌 것을 알 수 있다. 그리고 'id'의 값이 참이면 문제가 풀린다. SQL에서 특수문자 앞에 \를 붙이면 단순한 문자열로 인식한다. 이를 이용하여 문제를 해결할 수 있다. ?id=\&pw= || 1=1 %23을 입력하면 select id from prob_succubus where id='\' and pw=' || 1=1 #' 빨간 부분이 단순한 문자열로 인식된다.
-
<Lord of SQL Injection> assassinWargame/Lord of SQL Injection 2021. 11. 16. 12:18
assassin GET 방식으로 전달받은 pw의 값은 싱글 쿼터(')를 필터링한다. 그리고 'id'의 값이 'admin'일 경우 문제를 해결할 수 있다. like는 특정 문자를 모르더라도 검색할 수 있는 와일드카드 %와 _를 지원한다 %는 모든 문자를 의미하고, _는 한 글자를 의미한다. A% A로 시작하는 문자열을 가져온다. A%B A로 시작하고 B로 끝나는 문자열을 가져온다. %A A로 끝나는 문자열을 가져온다. A_ A로 시작하고 뒤에 한 글자가 있는 문자열을 가져온다. A__ A로 시작하고 뒤에 두 글자가 있는 문자열을 가져온다. _A 맨 앞에 한 글자 뒤에 A가 있는 문자열을 가져온다. 먼저, pw의 길이를 찾아야 한다. _를 사용해서 ?pw=_*n 을 통해 pw의 길이를 구할 수 있다. ex)..
-
<Lord of SQL Injection> giantWargame/Lord of SQL Injection 2021. 11. 15. 13:02
giant GET 방식으로 전달받은 값의 길이가 1보다 크면 "No Hack ~_~"을 출력한다. 공백, \n, \r, \t를 필터링한다. \n 줄 바꿈, 개행 \r 복귀(캐리지 리턴) \t 수평 탭 shit은 from과 prob_giant사이에 들어간다. 우선 그냥 1을 입력해보면 from1prob_giant가 된다. 맨 처음 시도했던 방법은 ?shit=%09prob_giant%23로 테이블을 새로 정하고, 뒷 부분은 주석으로 처리하려 했다. 하지만, 길이가 1보다 길어 "No Hack ~_~"을 출력한다. 이 문제는 그냥 from과 prob_giant 사이에 공백을 두면 된다. 먼저 %09를 사용해 ?shit=%09를 입력하면 "HeHe"를 출력한다. %09가 공백으로 처리되어 필터링 되는 것 같다...
-
<Lord of SQL Injection> bugbearWargame/Lord of SQL Injection 2021. 11. 15. 00:17
bugbear 전달받은 no의 값은 prob, _, ., (), substr, ascii, =, or, and, 공백, like, 0x를 필터링한다. 전달받은 pw의 값은 싱글 쿼터(')를 필터링한다. 함수 및 연산자 대체 substr mid 또는 right 또는 left or || and && 또는 %26%26 공백 %09, %0a, %0b, %0c, %0d, %a0, /**/ like 또는 = in 쿼리의 조건을 참으로 만들기 위해 ?pw=&no=1%09||%092%09>%091을 입력하면 Hello 문이 출력된다. 쿼리의 조건을 거짓으로 전달하면 ?pw=&no=1%09||%092%09
-
<Lord of SQL Injection> darkknightWargame/Lord of SQL Injection 2021. 11. 13. 18:51
darkknight 'no'로 전달받은 값은 'prob', '_', '.', '()', 싱글 쿼터('), 'substr', 'ascii'를 필터링한다. 'pw'로 전달받은 값은 싱글 쿼터(')를 필터링한다. 참인 값인 ?pw=&no="" or 1을 입력하면 "Hello guest"를 출력한다. 거짓인 값을 입력하면 아무것도 출력하지 않는다. 참과 거짓만을 구분하므로 Blind SQL Injection을 수행할 수 있다. 이를 통해 pw의 길이를 알아보기 위해 ?pw=&no="" or length(pw) < 10을 입력하면 pw의 길이가 10보다 작은 것을 확인할 수 있다. ?pw=&no="" or length(pw) like 8을 통해 pw의 길이가 8인 것을 확인할 수 있다. 이제 한 글자씩 찾아야한다..
-
<Lord of SQL Injection> golemWargame/Lord of SQL Injection 2021. 11. 13. 16:26
golem 'prob', '_', '.', '()', 'or', 'and', 'substr(', '='을 필터링한다. 'pw'의 값을 알아내면 문제가 풀린다. '='이 필터링되는 경우에는 'like'를 사용하여 우회할 수 있다. 참으로 ?pw=' || 1 like 1%23을 입력하면 "Hello {$result[id]}"를 출력한다. 거짓으로 ?pw=' || 1 like 2%23을 입력하면 아무것도 출력하지 않는다. 참과 거짓으로 구분할 수 있기 때문에 Blind SQL Injection 공격을 하면된다. 먼저 pw의 길이를 알아보면 ?pw=' || length(pw) like 8%23을 입력하면 "Hello admin"을 출력하는걸로 봐서 pw의 길이는 8인 것 같다. 이제 한 글자씩 찾으면된다. ?p..