Wargame
-
<Webhacking.kr> old-10Wargame/Webhacking.kr 2021. 11. 23. 16:31
old-10 O에 마우스를 가져가면 yOu로 바뀌고, 클릭하면 오른쪽으로 조금 움직인다. O를 Goal라인으로 가져가라는 것 같다. 직접 눌러서 해보니 굉장히 오래 걸린다. 페이지 소스 코드를 살펴보면 id="hackme"라는 a 태그가 있다. O의 처음 좌표가 나오고, 눌렀을 때 parseInt로 현 x좌표에 1을 더하여 움직인다. 이 O의 x좌표가 1600이 되었을 경우, ./?go=1600px로 이동하게 된다. 그래서 ./?go=1600px를 입력하면 "no hack" 메시지를 출력한다. 바로 접속하지는 못하는 것 같다. 그럼 처음 위치를 옮길 수 있다. O의 x좌표가 1600까지 가면 되기에 1599로 주면 이제 O를 한번 더 클릭하면 문제를 해결할 수 있다.
-
<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을 처리하므로 참이 된다. 괄호가 있을 시, 괄호를 우선적으로 처리한다. 위와 같은 방법을 사용하여 ..
-
<Webhacking.kr> old-09Wargame/Webhacking.kr 2021. 11. 18. 15:08
old-09 3개의 링크와 패스워드를 입력할 수 있다. 각 링크를 살펴보면 no=1 이면 Apple을, no=2 이면 Banana를, no=3이면 'Secret'이라는 메시지와 컬럼은 id와 no 그리고 no=3의 아이디가 패스워드라 한다. id no Apple 1 Banana 2 {Secret} 3 대략 이런 형태를 띄는 것 같다. 일반적인 SQL Injection 문제라 생각하고 어떤 문자를 필터링하는 지 확인해본다. ?no=' 를 입력하면 'Access Denied' 메시지를 출력한다. 이외에도 더블 쿼터("), =, 공백, , ||, or, and, ascii, ord, left 등을 필터링한다. if 문을 사용하여 길이를 확인할 수 있다. Apple의 길이는 5이므로 ?no=if(length(i..
-
<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 #' 빨간 부분이 단순한 문자열로 인식된다.