전체 글
-
<Webhacking.kr> old-26Wargame/Webhacking.kr 2021. 12. 12. 22:05
old-26 view-source를 통해 페이지 소스 코드를 살펴보면 view-source GET 방식으로 전달받는 id에서 "admin"이란 문자열을 필터링한다. 만약 "admin" 문자열이 포함되어있으면 "no!"라는 메시지를 출력하고 종료된다. 그리고 id는 id를 urldecode()로 처리한 값이다. 이 값이 "admin"과 같다면 문제가 풀린다. URL은 ASCII 코드를 이용하고 인터넷을 통해서만 전송할 수 있다.(#을 %23으로 하는 것처럼) 따라서, 브라우저는 전송 데이터를 URL encoding하여 전송하게 된다. 또한 PHP 문서에 따르면, $_GET 및 $_REQUEST는 자동으로 urldecode()를 수행한다고 나와있다. 그럼 이 문제에서는 urldecode()를 2번 하게 된다..
-
<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..
-
<Webhacking.kr> old-23Wargame/Webhacking.kr 2021. 12. 6. 14:03
old-23 script로 alert(1)을 주입하라고 한다. 페이지 소스 코드를 살펴보면 GET 방식이라는 것 외에는 힌트가 될 만한 것이 보이지 않는다. input 박스에 1을 입력하면 입력한 값 그대로를 출력한다. GET방식이므로 URL 창에 "?code="를 입력하면 "no hack"을 출력한다. input 박스에 ;()를 입력하면 , ;, ()는 필터링의 대상이 아닌 것을 알 수 있다. input 박스에 alert나 script를 입력하면 "no hack"을 출력한다. 즉, alert와 script 문자열 그대로를 필터링한다. 이 경우, 문자 사이사이에 NULL 문자(URL encoding 방식으로 %00)을 입력하면 된다. "?code=a%00l%00e%00r%00t(1);"를 입력하면 문제를..
-
<Webhacking.kr> old-24Wargame/Webhacking.kr 2021. 12. 6. 13:21
old-24 IP 주소와 브라우저 정보 그리고 "Wrong IP"를 출력한다. view-source를 통해 페이지 소스 코드를 살펴보면 view-source php 구문을 살펴보면 extract()는 배열 속의 키 값들을 변수화시킨다. 따라서, $_SERVER["REMOTE_ADDR"]을 $REMOTE_ADDR로 사용할 수 있다. $REMOTE_ADDR인 $ip에서 ".."을 "."으로, "12"를 ""으로, "7."를 ""으로, "0."를 ""으로 변환시킨다. 그리고 $ip가 127.0.0.1이면 문제가 풀린다. 그럼 127.0.0.1에서 거슬러 올라가면 된다. 127.00..00..1 -> 127.0.0.1 1277..00..00..1 -> 127.00..00..1 112277..00..00..1 -..
-
<Webhacking.kr> old-22Wargame/Webhacking.kr 2021. 12. 5. 17:41
old-22 가입과 로그인을 할 수 있는 폼이 있다. 'admin'으로 로그인하라고 한다. 'guest/guest'로 가입하고 계정이 이미 존재한다고 한다. 'guest'로 로그인해보면 비밀번호 해시값이 출력된다. 이 해시값이 32자리인 것으로 보아 md5가 적용되있는 것 같다. 해시값을 md5 decrypt 사이트를 통해 해시되기 전 값을 구해보면 'guestapple'이 출력된다. 그럼 'woong/abc'로 가입하고 로그인해보면 해시되기 전 값을 구해보면 'abcapple'이 출력된다. 즉, password hash값은 'apple'을 salt값으로 사용하여 '{pw}+apple'을 md5로 해시한 값임을 알 수 있다. ※ md5는 단방향 해시함수이므로 복호화가 불가능하지만 여러 단어의 해시값을 미..
-
<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은 메타데이터들을 종류별로 묶어 테..
-
<Webhacking.kr> old-21Wargame/Webhacking.kr 2021. 12. 3. 16:31
old-21 admin으로 로그인해야 하는 것 같다. 페이지 소스 코드를 살펴보면 BLIND SQL INJECTION id : pw : Result : GET 방식이므로 URL 창에 ?id=admin&pw=' or 1=1%23을 입력하면 ?id=admin&pw=' or 1=2%23를 입력하면 이를 통해 "wrong password"는 참이고, "login fail"은 거짓이라고 짐작해 볼 수 있다. ■pw 길이 구하기 ?id=admin&pw=' or length(pw) > 35%23를 입력하면 ?id=admin&pw=' or length(pw) > 36%23를 입력하면 이를 통해 pw의 길이는 36임을 알 수 있다. ■pw 구하기 ?id=admin&pw=' or ord(substr(pw,1,1))=47%..