문제 페이지에 접속해보면 아래와 같이 파일 목록 리스트가 길게 늘어져있다. 내리다보면 tmp-Unixtime 형식으로 되어 있는 이름들도 볼 수 있다. 끝까지 내려보면 127.0.0.1:7777 이라는 정보와 파일을 업로드할 수 있는 기능이 있다. 조금 더 정보를 얻기 위해서 소스를 보면 소스 파일이 주어져 있다. 소스 파일을 보면 $time 변수에 time() 값을 저장하고 tmp/tmp-$time 으로 파일을 생성한 다음 127.0.0.1을 기록하고 닫는다.중간에 보면 $file_nm 변수에 업로드한 파일명을 저장하고 파일명에 "", ".", " " 이 있을 경우 "" 으로 치환한다.그리고 해당 파일을 열어서 클라이언트의 IP 주소를 기록하고 닫는다. tmp 디렉터리에 있는 파일들을 출력한다.그리고 ..
문제 페이지를 보면 hint vi blackout이 나와 있다. vi 작성 중에 정전(강제종료, blackout)이 발생할 경우를 대비해서 vi는 백업 파일을 생성한다.해당 페이지를 작성 중에 정전이 발생하였다고 가정을 하면 .index.php.swp로 백업 파일이 남게 되고 해당 파일에 접근을 해보면 아래와 같이 작성 중이던 파일 내용을 볼 수가 있다. 패스워드는 "$_SERVER[REMOTE_ADDR] dlseprtmvpdlwlfmfquswhgkwkglgl" 값을 md5해주면 된다.
문제 페이지를 보면 전화번호를 입력하는 곳과 소스 파일이 주어져 있다. 소스 파일을 보면 insert into challenge35_list(id,ip,phone) values('$_SESSION[id]','$_SERVER[REMOTE_ADDR]',$_GET[phone]) Query를 통해서 테이블에 데이터를 삽입할 수 있는 것을 볼 수 있다. 하지만 사용자가 입력할 수 있는 부분은 $_GET[phone]에 제한되어 있어서 id가 admin이고 자신의 ip를 삽입할 수가 없다. 이를 우회하기 위해서 아래와 같이 다중 Insert 문을 이용해서 데이터를 삽입해보면 문자열로 인해서 querry error가 발생한다. INSERT INTO challenge35_list (id, ip, phone) VALUES..
문제 페이지에 접근하면 Wrong 이라는 메시지 창이 발생한다. 그리고 나면 검정색 화면이 반겨준다. 정보를 더 찾기 위해서 해당 페이지의 소스를 보면 아래와 같이 난독화되어 있다. 해당 스크립트는 개발자 도구를 이용해서 요소 보기를 하면 쉽게 알아볼 수 있다.if(document.URL.indexOf('0lDz0mBi2')!=-1){location.href='Passw0RRdd.pww';}else{alert('Wrong');}부분을 보면 URL에 '0lDz0mBi2'가 있으면 'Passw0RRdd.pww'로 이동되는 것을 볼 수 있다.이 부분을 직접 이동해도 되고 아래와 같이 URL에 '0lDz0mBi2'를 입력해서 이동할 수 있다. 이동해보면 패스워드 값을 알 수 있고 인증을 하면 문제를 풀 수 있다.
문제 페이지를 보면 33-1 문제 소스 파일이 주어져 있다. 소스 파일을 보면 GET 방식으로 get=hehe를 보내주면 다음 페이지로 넘어갈 수 있다. 33-2 문제도 소스 파일이 주어져 있다. 33-2 문제는 POST 방식으로 post=hehe&post2=hehe2를 보내주면 된다. 위와 같이 burp suite를 이용해서 풀어도 되고 자바스크립트 콘솔을 이용해서도 풀 수 있다. document.body.innerHTML+=""; document.getElementById("do").submit(); 33-3 문제도 소스 파일이 주어져 있다. GET 방식으로 myip=자신의 IP 주소를 보내주면 된다. 33-4 문제는 소스 파일과 hint가 주어져 있다. hint를 보면 time() 값이 나와 있고 ..
문제 페이지에 접근하면 아래와 같이 순위를 볼 수 있다. 하단에 보면 Join 버튼을 누르면 자신의 계정이 등록이 된다. 등록 완료! 확인을 누르면 아래와 같이 자신의 계정이 추가된 것을 볼 수 있다. 자신의 계정을 클릭해보면 아래와 같이 숫자가 증가한 것을 볼 수 있다.100까지 표시가 되어 있는 것으로 봐서 100이 되면 문제를 풀 수 있는 것 같다. 하지만 두번째 클릭을 하면 아래와 같이 no! 라고 표시가 되면서 숫자가 증가되지 않는다. 쿠키 값을 보면 이전과 달리 vote_check=ok 라는 값이 추가된 것을 볼 수 있으며 해당 쿠키를 삭제하면 정상적으로 숫자를 증가할 수 있다. 이와 같은 작업을 반복해주는 것을 스크립트로 작성하면 문제를 풀 수 있다.GET 방식으로 ?hit=자신의계정 정보를..
문제 페이지에 접속을 해보면 아래와 같이 ?server=123.248.181.123 으로 자신의 IP에 10000~10100 포트 중에 하나의 포트로 socket 통신을 시도한다는 것을 알 수 있다. nc(netcat)을 이용해서 10000부터 10100 포트를 열어두고 다시 요청하면 패스워드 값을 받을 수 있다. open.sh#!/bin/bash# do9dark for x in $(seq 10000 10100)do nc -lvp $x &donecs 패스워드 값을 받고 난 다음에 앞에서 열어둔 포트를 닫아준다. kill.sh#!/bin/bash# do9dark i=29309for ((x=0;x
문제 페이지를 보면 hint로 소스 파일이 있고 파일을 업로드할 수 있다. 소스 파일을 보면 mysql 접속 부분이 생략되어 있고 mysql_fetch_array(mysql_query("select password from challenge_30_answer) 를 통해 데이터를 가져오면 패스워드가 출력이 된다. 하지만, 누군가가 설정을 해둬서 upload 디렉터리로 이동해보니 패스워드가 출력이 되어서 쉽게 풀 수 있었다. + 추가 직접 설정을 해서 문제를 풀어보기 위해서 .htaccess 파일의 내용을 비운 상태로 업로드해보니 패스워드가 출력되지 않았다.패스워드가 출력될 수 있는 조건을 만들어주기 위해서 자신의 데이터베이스 서버에 정보를 삽입해준다.데이터베이스명: challenge_30_table테이블명..
hint로 주어진 것들을 살펴보면 c29_tb 테이블에 password 컬럼이 존재하고, 파일 업로드 시 파일명에 .(dot)이 있을 경우 공백으로 치환된다. 처음에 먼저 do9dark.jpg 파일을 만들어서 업로드 해보면 위와 같이 Done, time, ip, file 문자가 표시가 된다. 다시 한번 같은 파일로 업로드 해보면 "파일이 존재합니다." 문자가 표시되어 이름을 do9.jpg로 변경해서 올려보면 위와 같이 이번에는 time, ip, file 에 대한 값들이 출력되는 것을 볼 수 있다. 그리고 파일명은 앞에서 말한 것과 같이 .(dot)이 공백으로 치환되어 표시가 된다. 그리고 파일명을 변경해서 올려보면 time, ip, file에 대한 값이 순서대로 추가로 표시가 되는 것을 알 수 있다. 그..
hint로 upload/index.php 파일이 있고 해당 파일 내용에 $pw 에 대한 값과 readme라는 글자가 있다는 것이 주어져 있다.(hint에서는 readme로 되어 있고 실제 파일 내용에는 read me라고 되어있다.)그리고 하단에는 파일을 업로드할 수 있는 기능이 있다. 먼저 upload/index.php 내용을 보면 read me라는 글자만 보인다.주어진 힌트를 토대로 생각을 해보면 파일 업로드 기능을 이용하여 .htaccess 파일(php_flag engine off)을 업로드해서 php 실행을 제거해서 $pw에 대한 값을 보면 되는 문제처럼 보였다. 실제로 임의의 파일을 업로드 하면 위와 같이 다른 힌트가 주어지고 앞에서 말한 대로 하면 문제를 풀 수 있다.
SQL INJECTION 문자열을 통해 SQL Injection 문제임을 알 수 있고 입력할 수 있는 공간이 있다. 다른 정보를 얻기 위해서 소스 파일을 보면 index.phps 소스 파일도 제공하고 있다. 소스 파일을 보면 $q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");$GET_[no] 을 통해서 받은 값을 Query에 입력하고 나온 결과값을 비교하였을 때 admin이 출력이 되면 문제를 풀 수 있다.그리고 소스 파일 중간에 보면 SQL Injection에 사용되는 다양한 문자들을 필터링한 것을 볼 수 있다. 이 문제는 ..
문제 페이지를 보면 소스 파일 index.phps가 표시되어 있다. 소스를 보면 $_GET[id] 값이 admin이 되면 문제를 풀 수 있으나 앞에서 admin이 될 경우 no!를 출력하고 종료가 된다.그리고 소스 중간에 $_GET[id]=urldecode($_GET[id]); URL Decode 해주는 부분이 있는데 다시 이야기를 하자면 입력값을 브라우저에서 1번, 소스에서 1번, 총 2번을 URL Decode 해준다.이를 이용하여 admin 중 a를 %61로 URL Encode 해주고 필터링 부분을 우회하기 위해서 1번 더 %61 을 URL Encode 해주면 %2561 이 된다.즉, ?id=%2561dmin을 입력하면 브라우저에서 URL Decode 해주면 id=%61dmin 이 되고 필터링 부분에..
문제 페이지를 보면 파일 목록이 출력되어 있고 하단에는 hello world 라는 문자열이 출력되어 있다. 그리고 url에 보면 ?file=hello 라고 되어 있는데 아마도 파일 목록 중에서 hello.txt 파일의 내용을 출력해주고 있는 것 같다. (확장자 .txt는 서버에서 붙여서 파일 내용을 불러오는 구조) 이를 이용하여 password.php를 보기 위해서는 ?file=password.php를 한 다음에 .txt를 제거하기 위해서 %00(null) 문자를 붙여서 입력하면 password.php 파일의 내용을 볼 수 있다.
문제 페이지에 접속을 하면 IP와 User-agent 정보가 출력이 된다.다른 정보를 얻기 위해서 소스 코드를 보면 index.phps을 통해 소스 파일을 제공하는 것을 알 수 있다. 소스 코드를 보면 $_COOKIE[REMOTE_ADDR]=127.0.0.1 이 되면 문제를 풀 수 있다는 것을 알 수 있다.하지만 코드 중간에 보면 '12', '7.', '0.' 의 값들을 공백으로 대체하도록 되어 있다. 이를 우회하기 위해서 대체되는 문자 값 사이에 대체되는 값을 삽입하여 대체가 되면서 127.0.0.1 이 되도록 작성하면 문제를 해결할 수 있다. document.cookie="REMOTE_ADDR=112277..00..00..1";위와 같이 값을 입력하고 새로고침을 하면 된다.
username, password를 입력할 수 있고 login, join 기능을 이용할 수 있다. 먼저 join을 누르고 username에는 자신이 사용하는 아이디를 입력하고 패스워드는 비워두고 join을 하면 아래와 같이 Done 표시를 볼 수 있다. back을 누르고 첫 페이지에서 join한 계정 정보를 입력하고 login 해보면 아래와 같이 hi! do9dark와 32글자의 user key가 표시된다.user key : 0eda241fc65ccf35d9743309ac395215 32글자이기 때문에 md5 디코딩해보면 zombie라는 값을 구할 수 있다. http://md5decoder.org/ user key에 대해서 좀 더 많은 정보를 얻기 위해서 username: a, password: a로 j..
Blind SQL Injection 문제라고 명시가 되어 있고 입력을 할 수 있고 결과를 출력해주는 부분도 있다. 먼저 숫자 1을 Submit을 해보면 위 그림과 같이 Result: True라고 표시가 되고 숫자 2를 넣어도 마찬가지로 True가 표시된다. 숫자 3이나 -1과 같이 1, 2가 아닌 값을 Submit할 경우 Result: False라고 표시가 된다.URL 값을 보면 파라미터로 no, id, pw가 있는 것을 알 수 있고 이 값들이 테이블의 컬럼명이라고 생각하고 아래와 같이 id의 길이를 알 수 있다. no=1 and length(id)=4를 넣을 경우에 False가 표시된다. no=1 and length(id)=5를 넣을 경우에는 True가 표시된다. 마찬가지로 pw도 길이를 구할 수 있다..
nickname, comment, code를 입력할 수 있고 code 입력하는 곳에 옆에는 nvvbbntlcy 문자열을 볼 수 있다.그리고 time limit : 2와 do not programming! this is javascript challenge 표시되어 있다.소스와 함께 분석을 해보면 화면에 표시되는 문자(랜덤)를 2초 안에 입력을 하고 Submit 버튼을 누르면 문제를 풀 수 있다. 이 문제는 간단하게 Console에 Javascript를 이용하여 풀 수 있다.lv5frm.id.value='do9dark'; lv5frm.cmt.value='comment'; lv5frm.hack.value=lv5frm.attackme.value; lv5frm.submit(); 2초 안에 입력을 해야하기 때문에..
id 를 입력할 수 있는 input form을 볼 수 있고 admin 글자가 적혀져 있다.submit button을 누르면 아래와 같이 you are not admin를 표시를 하고 3초 뒤에 첫페이지로 돌아간다. guest로 시도해보면 다시 처음 페이지로 돌아오고 test 값으로 시도를 해보면 아래와 같이 hello test 표시와 함께 로그인이 된 것을 볼 수 있다. 다른 정보를 찾아보면 기존에 없었던 userid라는 쿠키를 볼 수 있다. test의 userid:Vm0wd2QyUXlWa2hWV0doVlYwZFNVRlpzWkZOWFJsbDNXa2M1VjAxWGVEQmFSV2hyVmxVeFYyTkVRbUZXVjJoeVZtMTRZV015VGtsalJtaG9UV3N3ZUZacVFtRlRNbEpJVm10c2F..
SQL Injection 문제이고 소스 파일이 주어져 있다. 소스를 보면 no 값을 입력할 수 있고 challenge18_table에 컬럼은 id, no가 있고 id는 guest와 admin이 있다는 것을 알 수 있다.그리고 Query를 조작해서 $q가 admin 값을 가져오면 문제를 풀 수 있다. no=1 을 넣었을 경우 hi guest가 출력이 된다. SELECT id FROM challenge18_table WHERE id='guest' AND no=$_GET[no]Query를 보면 WHERE 조건절에 id는 guest라고 명시되어 있고 AND 조건으로 되어 있기 때문에 no 값에 admin의 no 값을 입력하더라도 admin을 나타낼 수 없다.따라서, 앞의 값을 부정시키고 OR 연산자를 이용하여 ..
input form과 check button이 있다. unlock 값을 계산한 값과 input form을 통해서 입력한 값(login.pw.value)이 같을 경우 패스워드가 표시가 된다.이 문제는 간단하게 Console 창에 unlock 변수를 입력하면 자동으로 연산해서 나오는 값 9997809307을 입력해주면 패스워드가 출력이 된다. 그리고 패스워드 값 역시 소스를 보면 입력한 값의 1/10 이기 때문에 간단하게 구할 수 있다. 패스워드를 입력해주면 문제를 풀 수 있다.
크롬에서는 스크립트에 나와있는대로 움직이지 않기 때문에 제대로 움직이는 것이 보고 싶다면 다른 브라우저를 이용하면 된다. 전체적인 소스 내용을 설명하면 onkeypress 속성에 의해서 사용자가 키를 입력하면 스크립트가 동작이 되고 kk(1,1)가 onload 된다. onkeypress = mv(event.Keycode)로 키가 입력이 되면 function mv(cd)가 실행되어 kk(star.style.posLeft-50,star.style.posTop-50);가 실행된다.kk는 function kk(x,y)가 실행되는데 random() 함수를 이용해서 색을 지정해주고 *을 표시해주고 마우스를 가져가면 사라지게 되어있다. 그리고 function mv(cd)에서if(cd==100) star.style.p..
문제에 접근하면 다짜고짜 Access_Denied 창이 뜨면서 이전 페이지로 이동한다.하지만, 이전 페이지에 이동하기 전에 화면 상에 password is off_script 이란 글자가 보인다. (동체시력이 좋으면 바로 풀 수 있는 문제) 동체시력이 안 좋다면 간단하게 주소 앞에 view-source 를 붙여주면 크롬에서는 소스를 보여주기 때문에 화면에 적힌 내용을 확인할 수 있다. Burp Suite를 이용하여 Response 값을 확인해도 동일하게 내용을 확인할 수 있다. off_script 값을 인증해주면 문제를 풀 수 있다.
input form과 check button에 값을 입력하면 Wrong! 이라는 메시지창이 표시된다.소스를 보면 아래와 같이 되어 있다. 먼저 text를 입력할 수 있는 input form이 주어지고 그것을 check하는 button이 있는데, button이 동작하는 onclick을 보면 ck() 함수가 사용된 것을 볼 수가 있다. 여기에서 function ck()를 살펴보면 앞에서 어떻게해서 “wrong!” 생성되었는 지 알 수 있고 password가 무엇인지 알아낼 수도 있다.17번째 줄에 if문에서 ul과 pw.input_pwd.value가 같으면 password를 알려주고, 아닐 경우 “wrong!” 메시지를 생성한다.그렇기 때문에 ul의 값을 알아내기 위해서는 함수의 시작부분인 13번째 줄을 보..
HINT로 컬럼과 테이블이 주어져 있고 입력을 할 수 있는 Submit와 Auth가 주어져 있다. submit에 1,2 그리고 다른 값들을 넣어본 결과 no=1 일 경우에는 result도 1, 그 외에 다른 값들은 result은 0이 표시되었다.(0을 입력하였을 때는 아무런 값도 표시되지 않았다.)이를 통해서 참일 경우에는 result는 1이 표시되고 거짓일 경우에는 0이 표시된다는 것을 알 수 있다. flag 값을 알아내기 위해서 submit에 SQL Injection 해본 결과, =, like, 띄어쓰기 등을 사용하면 no hack이 발생하였다.이를 in(), ^(XOR) 연산자로 우회해서 먼저 flag 값의 개수를 count() 함수를 이용하여 확인해보면 2개가 있는 것을 알 수 있다. ^(XOR)..
javascript challenge 소스를 보면 다음과 같이 되어 있다. String.fromCharCode() 함수 안에 들어가 있는 내용들을 파이썬을 이용해서 디코딩할 수도 있고 더 간단하게는 자바스크립트 콘솔에 wtf만 입력하면 해당 값을 알 수 있다.#!/usr/bin/python# -*- coding: utf-8 -*-# do9dark import sys wtf = "118,97,114,32,101,110,99,111,61,39,39,59,13,10,118,97,114,32,101,110,99,111,50,61,49,50,54,59,13,10,118,97,114,32,101,110,99,111,51,61,51,51,59,13,10,118,97,114,32,99,107,61,100,111,99,..
문제 페이지를 보면 정규표현식과 관련된 문제이고, $pat(정규표현식 규칙)과 $_GET[val] 값이 맞을 경우 Password가 출력된다. 정규표현식을 살펴보면 다음과 같다.$pat="/[1-3][a-f]{5}_.*123.248.181.123.*\tp\ta\ts\ts/"; [1-3] : 1,2,3 중에 하나 일치[a-f] : a,b,c,d,e,f 중에 하나 일치{5} : 앞의 문자 5번 반복_ : _ 문자. : 1개의 문자 일치(어떤 문자라도 상관없다.)* : 0개 이상의 문자 일치(어떤 문자라도 상관없다.)203.246.10.9 : 자신의 IP 주소\t : 탭을 의미(Tab, URL에서 사용시 URL Encoding 하여 사용하면 된다. %09) $pat에 나와있는 정규표현식에만 해당하면 되기 때문..
크롬에서는 동작하지 않아서 사파리를 이용하였다.문제를 보면 붉은 2개의 줄 사이에 회색 줄이 있고 왼쪽에는 O 표시가 있고, 오른쪽에는 | 와 buy lotto가 결승선처럼 되어 있다. O 표시를 누르면 결승선을 향해서 오른쪽으로 이동을 하고 마우스를 올려놓으면 yOu 표시로 변화는 것을 볼 수 있다. 소스를 보면 O 표시가 this.style.posLeft==800에 만족할 경우 this.href=?go=800이 실행되는 것을 알 수 있다. 이를 이용하여 http://webhacking.kr/challenge/codeing/code1.html?go=800 로 접근 해보면 no hack이 표시 된다. 다른 방법으로 시작 위치를 799로 주고 한번만 클릭하면 800이 되도록 하거나 시작 위치를 0으로 주고..
문제에 접근하면 아파치 웹 인증을 하게 되고 실패할 경우 위 그림에 인증 뒷부분에 보이는 것처럼 Unauthorized 즉, 권한이 없어서 접근할 수 없다.아파치 웹 인증은 .htaccess 에서 설정할 수 있고 위 사이트와 같이 특정 디렉터리에 대해 접근에 대한 인증을 사용할 수 있다. require valid-user .htaccess 파일에 내부에 위와 같이 되어 있다면 GET, POST 메소드에 대해서 웹 인증을 거치게 된다. 하지만 GET, POST 외에 다른 메소드나 다른 문자로 요청할 경우 우회해서 접근을 할 수 있다. 이를 막기 위해서는 .htaccess 에서 정의된 메소드 외에는 허용하지 않도록 설정해야 한다. 요청할 때마다 변경하기가 번거롭기 때문에 Burp Suite 기능 중에서 Ma..
USER-AGENTdone! (1/70)또는 USER-AGENT Access Denied! 를 볼 수 있다.다른 정보를 얻기 위해서 소스를 보면 index.phps 에 대한 정보를 얻을 수 있다. index.phps 소스 파일 index.phps 파일을 보면 ck[0] 값이 admin 되면 solve 문제가 풀리는 것을 알 수 있다.ck 값을 어디서 가져오는 지 보면 아래와 같이 $_SERVER[HTTP_USER_AGENT]를 통해서 agent 를 비교하고 id를 가져오는 것을 알 수 있다.$q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'");$ck=@mysql_fetch_array($q); 공격을 할 수 있는 부분을 ..