Wargame/Lord of SQL Injection
-
<Lord of SQL Injection> vampireWargame/Lord of SQL Injection 2021. 11. 13. 00:49
vampire 싱글 쿼터(')를 필터링하고, 전달받은 'id' 값을 소문자로 변환한다. 그리고 전달받은 'id' 값에 'admin' 문자열이 있으면 전달받은 'id' 값에서 'admin'을 지운다. 그런데 'id'의 값이 'admin'이 되야 문제가 풀린다. 'admin'을 한 번 없애기 때문에, 'aadmindmin' or 'adadminmin' or 'admadminin' or 'admiadminn' 을 'id' 값에 전달하면 'admin'이 된다. 문제가 풀리게 된다. 이 문제를 처음 접했을 때, 'admin'을 16진수로도 해보고, 여러 방법을 시도했다. 하지만 한 개 남겨진 싱글 쿼터(')를 해결할 수 없었다. SQL Injection은 창의력? 같은 것도 필요한 것 같다.
-
<Lord of SQL Injection> orgeWargame/Lord of SQL Injection 2021. 11. 12. 01:04
orge 'prob', '.', '_', '()', 'and', 'or'을 필터링한다. 전달받은 'pw'의 값에 싱글 쿼터, 더블 쿼터, 백 슬래시가 있을 경우, 이 들 앞에 '\'를 추가한다. 그리고 'pw'의 값이 참이고 'pw'의 값과 전달받은 'pw'의 값이 같으면 문제가 풀린다. 우선 ?pw=' || 1=1%23을 입력하면 현재 'id' 값에 따라 "Hello guest"를 출력한다. "1=1" 대신 "1=2"로 거짓을 만들어 입력하면 아무것도 출력하지 않는 것을 확인할 수 있다. 이를 통해 Blind SQL Injection을 수행해야 한다는 것을 짐작할 수 있다. 먼저 'pw'의 길이를 알아보면 ?pw=' || length(pw) < 10%23를 입력하면 ?pw=' || length(pw) ..
-
<Lord of SQL Injection> wolfmanWargame/Lord of SQL Injection 2021. 11. 11. 23:51
wolfman 앞의 문제들과 같이 'prob', '_', '.', '()'를 필터링 한다. 또한 공백을 필터링한다. 따라서, ?pw=' or 1=1%23 을 입력하면 (%23은 #의 urlencoding 방식으로 주석처리를 위함이다) "공백 없음"이란 메시지가 출력된다. 공백없이 ?pw='or1=1%23 을 입력하면 아무 것도 출력하지 않는다. 이렇게 공백문자를 필터링 할 경우, %09, %0a, %0b, %0c, %0d, %a0, /**/ 를 사용해서 공백문자를 대체할 수 있다. 즉, ?pw='%09or%091=1%23 을 입력하면 현재 id의 값에 따라 "Hello guest"를 출력하는 것을 확인할 수 있다. 그럼 이제 id의 값을 'admin'으로 주면 문제가 풀리게 된다. ?pw='%09or%0..
-
<Lord of SQL Injection> orcWargame/Lord of SQL Injection 2021. 11. 11. 14:25
orc GET 방식으로 'pw' 값을 전달받는다. 'id' 값이 참이면 "Hello admin"을 출력한다. 전달받은 'pw'에 싱글 쿼터('), 더블 쿼터("), 백 슬래시(\)가 있으면 그 앞에 '\'를 추가해서 전달받은 'pw' 값으로 한다. 그리고 'pw' 값이 참이고, 'pw' 값이 전달받은 'pw' 값이 같다면 문제가 풀린다. 우선 pw=1을 해보면 아무것도 출력되지 않는다. or 문을 사용하여 'id' 값도 전달해야 하는 것 같다. ?pw=' or 1=1%23을 전달하면 "Hello admin"이 출력된다. 이를 통해 쿼리가 참이면 "Hello admin"이 출력되고, 거짓이면 아무것도 출력되지 않는 것을 짐작할 수 있다. 결과가 참과 거짓뿐이므로 Blind SQL Injection을 수행해..
-
<Lord of SQL Injection> goblinWargame/Lord of SQL Injection 2021. 11. 11. 00:14
goblin 이 문제는 작은따옴표, 큰 따옴표를 필터링하여 사용할 수 없다. 그리고 'id'의 값이 'admin'이면 문제가 풀리는 것 같다. 우선, 'no'의 값으로 1을 주면 guest로 로그인이 되었다. 이번엔 'no'의 값으로 0을 주면 아무것도 출력하지 않았다. 'no'의 값이 1이면 guest로 로그인하기 때문에 'no'의 값에 0을 줘야 할 것 같다. 이제 or문을 사용하여 앞의 구문은 거짓으로 뒤의 구문은 참으로 하여 우회하면 될 것 같다. 'id'의 값이 'admin'이 되어야 하는데, 이 문제에서는 따옴표를 필터링하기 때문에 사용할 수 없다. 그렇다고 따옴표 없이 admin만 전달하면 문자열 인식을 하지 못한다. 이렇게 싱글쿼터(')가 막혀서 문자열을 입력할 수 없을 때는 0b, 0x를..