Index of /webhacking.kr 1(200): Cookie 2(500): Blind SQL Injection 3(350): SQL Injection 4(150): Encode/Decode 5(300): 코드 분석, MySQL 특징 6(100): Encode/Decode 7(300): SQL Injection (Bypass) 8(350): SQL Injection (Insert) 9(900): Apache Auth Bypass, Blind SQL Injection (If) 10(250): 코드 분석 및 변조 11(300): 정규표현식 12(250): 코드 분석 13(1000): Blind SQL Injection 14(100): 코드 분석 15(50): 코드 분석 및 변조 16(100): 코드 ..
source 가 주어져 있다. id 파라미터가 없을 경우 $_GET[id] 는 guest가 입력이 된다.$_GET[id] 파라미터에는 아래와 같은 문자가 있거나 18글자 이상이 되면 Access Denied가 발생한다. select $_GET[id] from c_61 order by id desc limit 1다른 문제들과 달리 특이하게 컬럼 위치에 입력한 값이 들어가는 것을 볼 수 있다.그리고 id 컬럼의 값으로 admin이 나오면 문제를 해결할 수 있다. ?id=id 해서 Query를 완성시켜주면 아래와 같이 zombie 라는 값이 출력되는 것을 볼 수 있다. admin을 만들어주기 위해서는 별칭을 이용하면 쉽게 해결할 수 있다.?id=0x61646d696e id또는?id=0x61646d696e as..
페이지에 접근하면 Access Denied와 함께 소스 파일을 제공한다. 소스 파일을 보면 $_COOKIE[PHPSESSID]에 0~9의 값이 있을 경우 Access Denied가 발생하는 것을 볼 수 있다.따라서 쿠키값을 문자로만 구성하여 적용시키고 다시 로그인을 하면 Access Denied 대신에 hi라는 문구를 볼 수 있다. GET 파라미터로 mode=auth가 있을 경우 Auth~를 출력한 다음 readme/$_SESSION[id].txt 파일의 내용을 $result에 담는다.그리고 $result게 담긴 값과 $_SESSION[id] 값이 같을 경우 Done! 이라는 표시와 함께 문제를 해결할 수 있다. mode=auth가 없을 경우에는 readme/$_SESSION[id].txt 파일을 만들어..
소스와 함께 JOIN, LOGIN을 할 수 있는 테이블을 볼 수 있다. 소스를 눌러서 내용을 보면 위에 있는 코드는 LOGIN 부분이고 아래 부분은 JOIN 부분인 것을 알 수 있다. - LOGIN 부분($_POST[lid] && $_POST[lphone])두 값이 전송되면 c59 테이블에서 해당 값이 있는 지 조회를 하고 조회한 아이디가 admin이면 문제를 해결할 수 있다. - JOIN 부분($_POST[id] && $_POST[phone])두 값이 전송되면 여러 검증을 거치게 된다. phone은 20글자가 넘으면 접근이 제한되고 admin|0x|#|hex|char|ascii|ord|from|select|union가 있을 경우에도 접근이 제한된다.id는 admin이라는 문자가 올 수 없다. inser..
SWF 플래시 문제이다. 소스를 보면 kk.js 파일만 보인다. 개발자 도구를 이용하여 정보를 살펴보면 kk.js 외에도 kk2.js, hackme.swf 를 볼 수 있다. kk.js 파일kk = hack kk2.js 파일kk = hackme.swf hackme.swf만 실행 swf 소스를 보면 하단에 pw가 맞을 경우에 이동되는 URL 경로를 볼 수 있다. 해당 경로로 이동해보면 문제를 풀 수 있다. 다른 방법으로 크롬에서는 URL 경로창에 마우스를 클릭하여 활성화하고 Ctrl + s 하면 해당 swf 파일을 다운 받을 수 있다.swf 파일을 다운 받아서 디컴파일러를 이용하여 문제를 풀 수도 있다. 해당 경로로 바로 이동해도 되지만 pw 다음에 나와있는 10;(_ 문자열 값을 입력해보면 pw 값과 동일..
message를 적을 수 있고 secret 옵션으로 yes, no가 있다.그리고 Secret key를 입력할 수 있고 phps 소스 파일이 주어져 있다. 소스 파일을 보면 $_POST[pw]와 $secret_key가 같으면 문제를 풀 수 있고, $_GET[msg]와 $_GET[se] 값을 입력하면 $_SESSION[id]와 $secret_key와 함께 challenge57msg 테이블에 삽입이 된다.msg를 입력할때 $_GET[se]는 yes를 선택하면 1, no를 선택하면 0의 값이 같이 삽입되는 것을 볼 수 있다.$_GET[se] 값이 1일 경우에는 Done 표시가 발생하나 0일 경우에는 표시가 발생하지 않는 것을 알 수 있다.(다른 방법으로 0을 입력해보면 1과 동일하게 Done 표시가 발생하여 공..
BOARD 게시판에 2개의 글과 검색 기능을 볼 수 있다. admin의 readme 글을 눌러보면 아래와 같이 access denied가 표시되면서 내용을 볼 수가 없다. guest의 hi~ 글을 눌러보면 아래와 같이 hi~ 라는 내용을 볼 수가 있다. 즉, admin이 작성한 readme의 내용을 보면 문제를 풀 수 있다. 검색 기능을 이용하면 내용을 알아낼 수 있다.h를 검색하면 모든 글이 목록에 표시가 되고 i를 검색하면 guest 글만 표시가 된다.내용의 일부만으로 검색이 되는 것을 알 수 있고 admin에 내용 중에 h는 있지만 i는 없는 것을 알 수 있다.이러한 방법으로 admin의 내용을 유추할 수는 있지만 비효율적이다. SQL에서 Like를 이용한 비교에서 _ 와 %가 와일드 카드 문자로 ..
크롬에서는 동작하지 않지만 IE에서는 초록색 물컹이가 마우스 포인터를 잡으러 따라온다.rank를 눌러보면 다른 사람의 점수를 볼 수 있다. score 점수가 2147483647int 형(32 비트) 최대값이다. 마지막에 small letter 이라는 표시가 있다.다른 정보를 알아보기 위해서 소스를 보면 hint가 나와있다. 테이블에 대한 정보가 힌트로 나와있다.(ip는 id와 같고, score, password가 있다.) 점수를 클릭해보면 id // score 가 표시가 된다. or 또는 || 를 이용해서 항상 참으로 만들어주면 id에 localhost가 표시된다.조건이 거짓이 될 경우 score에 해당하는 id가 표시된다.즉, 이를 이용해서 SQL Injection을 할 수 있다.하지만, union, ..
페이지에 접근하면 Password is 와 함께 패스워드가 한 글자씩 출력이 된다.따라서 문제를 풀기 위해서 한 글자씩 출력되는 것을 받아적거나 스크립트를 짜서 알아내야 한다. 더 쉬운 방법을 찾아보기 위해서 소스를 보면 출력되는 코드를 볼 수 있다. 33번 라인이 페이지에 출력을 하는 부분이 있는데 여기에 = 대신에 += 을 사용해서 문자가 누적해서 기록되도록 바꾸고 36번 라인은 삭제하였다.그리고 해당 스크립트를 콘솔로 실행을 하면 패스워드가 한꺼번에 보인다. 패스워드를 인증하면 문제를 풀 수 있다.
hello world 소스를 보면 index.phps 파일이 주어져 있다. index.phps 파일을 보면 answer 파라미터로 $hidden_table 을 입력해주면 문제를 풀 수 있다.그리고 val 파라미터를 통해서 입력을 할 수 있지만 필터링이 되어있는 것을 볼 수 있다. select test1 from $hidden_table where test2=$_GET[val]val 이 입력되는 부분을 보면 '(single-quote)가 없는 것을 볼 수 있다.val=1 을 입력하면 testval=2 를 입력하면 guestval=3 을 입력하면 adminval=4 를 입력하면 oldzombie가 출력이 되지만, 테이블 명을 알아낼 수는 없다.테이블 명을 알아내기 위해서는 UNION을 써야하지만 해당 문자도..
Admin page 라는 표시와 함께 ID, PW를 입력해서 로그인을 할 수 있고, Source 가 있는 것을 볼 수 있다. 먼저, 소스를 보면 id, pw를 입력받아서 pw는 md5() 함수를 거친 다음 비교를 통해서 id가 admin 일 경우 문제를 풀 수 있다.간단하게 id 부분에 admin'-- - 을 넣고 pw 부분에는 임의의 값을 집어넣어서 인증 우회를 시도하였으나 실패하였다.소스 코드 상에는 나와있지 않지만 '(single quote)를 입력할 경우 \(backslash)가 붙어서 우회가 정상적으로 되지 않는 것 같다.다른 방법을 찾아보기 위해서 소스를 다시 보면 md5() 함수에 true 라는 옵션이 추가되어 있는 것을 볼 수 있다. string md5 ( string $str [, boo..
문제 페이지에 나와있는 대로 id와 pw 값을 guset로 제출을 하면 level : 1 이라는 정보를 출력한다. 더 많은 정보를 얻기 위해서 소스를 보면 index.phps 소스 파일이 주어져 있는 것을 볼 수 있다. index.phps 소스 파일을 보면 Challenge 45 문제와 동일하게 mb_convert_encoding() 함수를 사용하고 있는 것을 볼 수 있다. select lv from members where id='$_GET[id]' and pw=md5('$_GET[pw]') 입력할 수 있는 두 개의 값 id, pw 중에서 id에 대해서만 mb_convert_encoding() 함수를 사용하고 있기 때문에 멀티바이트를 이용하여 '(single-quote)를 닫아주고 /* 주석을 열어준다..
SQL INJECTION 문제 소스를 보면 index.phps 소스 파일이 주어져 있다. 소스 파일을 보면 GET[lv]로 입력되는 값 중에 union,select,or,and 등을 입력하면 종료가 된다.따라서 소스 파일에 나와있는 문자를 제외하고 조건으로 id=admin을 만들어주면 된다. Query를 보면 single quote가 없기 때문에 hex(0x61646d696e)를 이용하여 admin을 만들어주고 or 대신에 || 를 이용해서 우회해주면 문제를 풀 수 있다. ?lv=1을 입력할 경우 zzibong이 발생하고 ?lv=2를 입력하면 아무런 값도 발생하지 않는다.따라서, ?lv=2||id=0x61646d696e 를 입력하면 문제를 우회하여 풀 수 있다.
문제 페이지를 보면 메모와 파일을 업로드할 수 있는 것을 볼 수 있다. 위와 같이 메모와 함께 파일을 업로드해보면 아래와 같이 파일명이 3글자 이상 안된다는 것을 알 수 있다. 파일명을 123으로 해서 내용은 test 로 올려보면 아래와 같이 메모와 파일이 업로드되어 올라간 것을 볼 수 있다. 실제로 업로드된 파일에 접근해보면 내용이 null 로 변경이 되는 것을 알 수 있다. 삭제를 해보면 mode=del 과 time=1440951597 값이 전달이 되면서 메모와 업로드된 파일이 삭제되는 것을 확인할 수 있다. 구조는 알 수 없지만 파일명이 3글자로 제한되어 있다는 점과 삭제를 할 때 time 값을 토대로 데이터베이스에서 비교를 통해서 메모와 파일이 삭제되는 것이라 생각할 수 있다. 그리고 삭제를 할 ..
Mail Header injection 문제이다. 문제가 요구하는 답을 입력할 경우 문제가 풀리도록 하드 코딩되어 있다.소스를 보면 index.phps 소스 파일이 주어져 있다. 소스 파일을 보면mail("admin@webhacking.kr","readme","password is $pass",$header);부분을 볼 수 있는데 여기서 조작을 할 수 있는 부분은 $header 부분 밖에 없다. mail() 함수에 대한 자세한 내용은 아래 페이지에 자세하게 나와 있다.참고(http://php.net/manual/en/function.mail.php)bool mail ( string $to , string $subject , string $message [,string $additional_headers ..
level 1을 전송해보면 아래와 같이 zzibong information, money : 10000 이라는 정보를 얻을 수 있다. 소스를 보면 index.phps 소스 파일이 주어져 있는 것을 알 수 있다. 소스 파일을 보면 lv 부분에 여러가지 필터링이 되어 있는 것을 볼 수 있다. 실행이 되는 Query를 보면 입력 부분이 상수형으로 되어있는 것을 알 수 있다."select id,cash from members where lv=$_GET[lv]"따라서 아래와 같이 간단하게 인증 우회하여 문제를 풀 수 있다.아래 방법 외에도 2진수(0b)를 이용하거나 like, in 과 같은 연산자를 이용해서도 문제를 풀 수 있다. 띄어쓰기는 %0a, %09로 우회할 수 있다.
SQL INJECTION 문제id와 pw를 입력하는 걸로 봐서는 인증 우회 문제로 보인다. 기본적으로 적혀져 있는대로 로그인을 해보면 아래와 같이 hi guest가 출력 된다. 소스를 보면 index.phps 파일이 주어져 있다는 것을 알 수 있다. index.phps 파일을 보면 id 부분은 admin, from ,union 등이 필터링되어 있고 pw 부분은 md5로 변환되서 비교를 한다는 것을 알 수 있다.그리고 Query 위쪽에 보면 mb_convert_encoding($_GET[id],'utf-8','euc-kr'); 이 있는데 이를 이용해서 magic_quote_gpc, addslashes, real_escape_string 을 우회할 수 있다. (single quote, double quote..
name을 입력할 수 있는 공간과 Make 버튼이 있다. 숫자를 입력해보면 아래와 같이 다섯칸으로 되어있다. Make 버튼을 누르면 index/go.html 페이지로 이동되고 페이지 내용에 hello 12345 가 출력되어 있는 것을 볼 수 있다.즉, 첫 페이지에서 입력한 내용 중 5글자만 index/go.html 페이지에 출력이 된다는 것을 알 수 있다. Code Injection 취약점을 이용한 문제로 추측을 하고 문제의 구조를 파악해보면 다음과 같다. 1. name 으로 입력한 값이 $_POST['name']으로 전달2. $name = substr($_POST['name'],0,5); 5글자만 전달3. system("echo 'hello $name' > index/go.html"); system()..
파일을 업로드할 수가 있고 웹쉘을 올리면 문제를 해결할 수 있다. 힌트로는 파일 타입이 나와있다. 먼저, 문제에서 지시한대로 간단하게 test.php 를 올려보면 아래와 같이 access denied 가 발생하는 것을 볼 수 있다. 우회하기 위해서 test.jpg 로 업로드를 해보면 아래와 같이 정상적으로 파일이 업로드가 되는 것을 볼 수 있다. 힌트에서 파일 타입이라고 알려줬기 때문에 Content-type 값을 image/jpeg 로 변경해서 test.php를 업로드해보면 문제를 풀 수 있다.
문제 페이지를 보면 테이블에 no와 subject, file에 대한 정보가 나와있고 태그가 걸려있는 것을 볼 수 있다. no 1에 해당하는 read me에 있는 test.zip 파일을 다운받기 위해서 눌러보면 아래와 같이 Access Denied 창이 발생하면서 다운을 받을 수가 없다. no 2에 해당하는 test에 있는 test.txt 파일을 다운받기 위해서 눌러보면 아래와 같이 test.txt 파일의 내용을 확인할 수 있다. 소스 파일을 확인해보면 아래와 같이 주석으로 test.zip 파일의 패스워드는 오직 숫자로만 되어있다는 정보를 얻을 수 있고 다운 받는 부분을 보면 하드코딩으로 test.zip 파일은 받을 수 없도록 되어있는 부분을 볼 수 있다.소스 내용 중에 test.txt 파일을 다운 받는 ..
파일을 업로드하는 기능이 있다. 다른 정보를 더 찾아보기 위해서 소스를 보면 소스 파일이 주어져 있다. 소스 파일을 보면 업로드하는 파일명에 많은 제한을 두었고 해당 문제는 hidden_dir를 알아내서 내가 업로드한 파일명에 기록된 패스워드를 보면 된다..htaccess 파일에 대해 까다롭게 제한을 두고 있기 때문에 다른 우회 방법을 생각해보면 에러를 발생시켜서 업로드 되는 위치 값을 볼 수가 있다. 먼저, 정상적인 파일(파일명: do)을 업로드해서 패스워드가 기록되도록 한다. 그리고, 파일명 조건 중에서 보면 eregi()를 통해 exit()가 아니라 공백으로 치환되는 조건들이 있다. 이를 이용해서 공백으로 치환이 되는 값들로 파일명을 해서 업로드를 하게 되면 서버 쪽에서는 copy() 함수를 실행하..
no, id, pw 를 입력을 해서 로그인할 수 있는 페이지를 볼 수 있다. 로그인을 해보면 아래와 같이 Success - guest 를 볼 수 있다. no 부분에 ||를 이용해서 SQL Injection이 되는 지 확인해보면 로그인이 되는 것을 볼 수 있다. 이를 이용해서 id 값의 첫 글자를 비교해보면 3가지 결과를 얻을 수 있다.0x66(f) 와 비교하였을 경우 해당하는 값은 참이 될 수 없기 때문에 Failure이 발생한다. 0x67(g) 와 비교하였을 경우 guest가 있기 때문에 참이 된다. 0x61(a) 와 비교하였을 경우 admin이 있기 때문에 참이 되고 guset와 달리 admin password를 입력하는 부분을 볼 수 있다. 값을 입력해보면 Wrong 이 발생한다. pw의 길이가 1..
문제 페이지를 보면 값을 입력하여 전송할 수 있는 부분을 볼 수 있다. 다른 정보를 더 얻기 위해서 소스를 보면 아래와 같이 소스 파일을 제공하는 것을 볼 수 있다. 소스 파일을 보면 값을 입력하여 전송을 하면 POST 방식으로 값을 전달을 하고 값 중에서 \(backslash)가 있을 경우 제거를 하고 '(single-quote)가 있을 경우에 '(single-quote)를 하나 더 생성하고 길이가 15자 이하만 Query에 전달을 하여 good을 출력하게 된다. 즉, 입력하는 값을 이용하여 항상 참이 되도록 만들어 주면 문제를 풀 수가 있다. 그리고 소스상에 Query를 보면 id='$_POST[id] 로 되어 있다. 즉, '(single-quote)를 입력해서 해당 Query가 에러가 발생하지 않도..
문제 페이지를 보면 LOG INJECTION 문자열과 입력할 수 있는 부분, login, admin 버튼을 볼 수 있다. 소스를 보면 주석으로 admin.php 가 되어 있고, admin 버튼을 누르면 admin.php 페이지로 이동하게 된다. 페이지로 이동해보면 log라고 적혀있다. 해당 페이지에 소스를 보면 hint 로 admin이 주어져 있다. 힌트에 따라서 admin 으로 로그인해보면 you are not admin 이라는 메시지와 함께 로그인이 되지 않는다. 이를 우회하기 위해서 %00(NULL) 문자를 이용해서 우회를 해서 admin 페이지로 이동해보면 로그만 남아있을 뿐 문제는 풀리지 않는다. 로그의 양식을 보면 IP 주소:아이디로 되어있기 때문에 개행문자(%0a)를 이용해서 다음 줄에 자신..
문제 페이지에 접속해보면 아래와 같이 파일 목록 리스트가 길게 늘어져있다. 내리다보면 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() 값이 나와 있고 ..