Wargame
-
<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%..
-
<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 구문을..
-
<Webhacking.kr> old-20Wargame/Webhacking.kr 2021. 12. 2. 13:12
old-20 닉네임과 코멘트 그리고 captcha를 입력하게 되어있다. time limit가 2초인 것으로 보아 2초안에 제출하라는 것 같다. 페이지 소스 코드를 살펴보면 time limit : 2 second nickname comment captcha ck() 함수를 살펴보면 모든 입력 칸이 비어있으면 안된다. 그리고 captcha는 captcha_의 값과 같아야만 한다. 위 행동을 2초안에 직접 입력하기는 굉장히 힘들다. 그래서 python의 selenium을 이용해 문제를 해결했다. import requests from selenium import webdriver # 사용중인 크롬의 버전과 같은 버전의 chromedriver를 받아 python 코드의 위치와 같게했음 driver = webdri..
-
<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..