Wargame/Lord of SQL Injection
-
<Lord of SQL Injection> cthulhuWargame/Lord of SQL Injection 2021. 12. 13. 16:26
cthulhu 서버에 WAF(웹 방화벽)가 동작한다. Paranoia Level은 기본값인 1로 설정되어있다. 이 WAF를 우회할 수 있냐고 묻는다. GET 방식으로 전달받은 id와 pw에서 prob, _, ., (), admin을 필터링한다. 그 뒤 쿼리를 통한 결과를 배열로 가져오는데, id의 값이 참이면 문제가 풀린다고 한다. 기본적인 SQL Injection 구문인 ' or 1=1#을 id에 입력해보면 접근이 제한되었다. 이 외의 구문들을 통해 시도해본 결과, 웬만한 SQL Injection 구문은 다 필터링하는 것 같다. https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/1181에는 CRS v3.1.0을 우회하는 방법을 참고하였다. 이 방법..
-
<Lord of SQL Injection> alienWargame/Lord of SQL Injection 2021. 12. 6. 22:46
alien admin, and, or, if, coalesce, case, _, ., prob, time을 필터링한다. 쿼리가 2개 나와있다. 하나는 싱글 쿼터(')가 없고, 하나는 싱글 쿼터가 있다. 아래 조건문을 살펴보면 첫 번째 쿼리는 "admin"과 값이나 타입 하나라도 다르면 "sandbox1"을 출력하고 종료한다. 또, "admin"과 같으면 "sandbox2"를 출력하고 종료한다. 두 번째 쿼리는 "admin"과 같으면 "sandbox"를 출력하고 종료한다. 또 한번 더 같으면 문제가 풀린다. 우선, 주석을 사용해 두 쿼리를 동일한 결과를 출력하게 만들 수 있다. query 1 : select id from prob_alien where no=1 union select 1#' union se..
-
<Lord of SQL Injection> zombieWargame/Lord of SQL Injection 2021. 12. 5. 16:23
zombie GET 방식으로 전달받은 pw에서 rollup, join, ace, @를 필터링한다. ?pw=' or 1=1%23을 입력하면 쿼리가 참임에도 불구하고 아무것도 출력되지 않는다. 이를 통해 prob_zombie 테이블이 비어있음을 짐작할 수 있다. 그런데 전달받은 pw와 쿼리의 결과로 나온 pw의 값과 타입이 모두 같아야 문제가 풀린다. 앞서 풀었던 'ouroboros'문제와 같음을 알 수 있다. 하지만 'ouroboros'문제에서는 'replace'를 사용하여 quine query를 통해 문제를 해결할 수 있었지만, 이 문제에서는 'ace'를 필터링하기 때문에 'replace'를 사용할 수 없다. 이 문제의 경우 메타데이터를 활용하여 풀 수 있다. MySQL은 메타데이터들을 종류별로 묶어 테..
-
<Lord of SQL Injection> ouroborosWargame/Lord of SQL Injection 2021. 12. 3. 13:08
ouroboros GET 방식으로 전달받은 pw에서 prob, _, ., rol, up, join, @를 필터링한다. 이 pw를 사용한 쿼리의 결과를 배열로 가져온 뒤, pw에 값이 참이면 pw를 출력한다. 그리고 결과 배열의 pw와 전달받은 pw가 갑과 타입 모두 같아야 문제가 풀린다. 먼저, ?pw=' or 1=1%23을 입력하면 아무것도 출력하지 않는다. 이를 통해 prob_ouroboros 테이블이 비어있음을 짐작할 수 있다. union을 사용해 ?pw=' union select 1%23을 입력하면 Pw : 1을 출력한다. ?pw=' union select 1%23을 입력했는데 $result['pw']는 1이 되었다. $_GET['pw']에 해당하는 부분인 'union select 1%23 구문을..
-
<Lord of SQL Injection> phantomWargame/Lord of SQL Injection 2021. 12. 2. 11:47
phantom email을 찾는 문제인 듯 하다. GET 방식으로 전달받은 joinmail에서 duplicate를 필터링한다. insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}'); 위 구문을 이용해서 테이블에 레코드를 추가할 수 있다. joinmail에 1을 넣어보면 별도의 필터가 없으므로 insert into prob_phantom values(0, 자기 IP, '1'), (0, 자기 IP, '2')로 여러 개의 레코드를 삽입할 수 있다. 이를 이용해서 insert into prob_phantom values (0, 자기 IP, '1'), (0, 자기 IP, (select email from prob_phant..
-
<Lord of SQL Injection> frankensteinWargame/Lord of SQL Injection 2021. 12. 1. 11:55
frankenstein GET 방식으로 전달받은 pw에서 prob, _, ., (, ), union을 필터링한다. 에러메시지를 출력하는 걸로 보아 Error Based SQL Injection 기법을 수행할 수 있다. 첫 번째 쿼리에서는 id가 frankenstein이고 두 번째 쿼리의 id는 admin이다. 따라서, id='admin'을 넣어 줘야 한다. 괄호를 필터링하기 때문에 앞에서 풀었던 것 처럼 if 문을 사용할 수 없다. 따라서 case when 조건 then 결과1 else 결과2 end 문을 사용할 수 있다. substr()이나 length()도 사용할 수 없기 때문에 like와 %를 사용할 수 있다. 조건이 성립할 경우를 구분하기 위해 에러를 출력하게 한다. MySQL에서 처리할 수 있는..
-
<Lord of SQL Injection> blue dragonWargame/Lord of SQL Injection 2021. 11. 29. 13:30
blue dragon GET 방식으로 전달받은 id와 pw에서 prob, _, .을 필터링한다. $query의 결과를 $result 배열에 저장한다. 이 $result['id']의 값이 있으면 "Hello admin"을 출력한다. 그 뒤, 전달받은 id와 pw에 싱글 쿼터('), '\'를 필터링한다. 두 번째 $query의 결과를 $result 배열에 저장하고 $result['pw']의 값이 전달한 pw와 값이 같으면 문제가 풀린다. 앞의 문제 처럼 한 줄 주석을 사용해서 먼저 풀어보았다. ?id=admin%23&pw=%0a을 입력해서 쿼리를 select id from prob_blue_dragon where id='admin#' and pw=' ' 의 형태로 만들어 보면 아무것도 출력하지 않는다. 필터..
-
<Lord of SQL Injection> red dragonWargame/Lord of SQL Injection 2021. 11. 28. 15:07
red dragon GET 방식으로 전달받은 id에서 prob, _, .을 필터링한다. 그리고 전달받은 id의 길이가 7보다 크면 "too long string" 메시지를 출력한다. 전달받은 no가 숫자로만 이루어졌다면 전달받은 그대로 $no가 되고, 숫자가 아닌 다른 문자가 있다면 $no는 1이 된다. select no from prob_red_dragon where id='admin' 을 수행한 결과의 no 값과 전달받은 no의 값과 타입이 모두 같으면 문제가 풀리게 된다. ?id=admin'%23을 입력하면 "Hello admin"을 출력한다. 참인지 거짓인지 구분하기 위해서 no에는 숫자만 입력해야 한다. #(한줄 주석)을 사용해서 and no를 주석처리 하고 %0a(line feed)로 줄 바꿈..