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'를 입력해서 이동할 수 있다. 이동해보면 패스워드 값을 알 수 있고 인증을 하면 문제를 풀 수 있다.
TABLE: temp실험에 사용한 임시테이블mysql> SELECT * FROM temp;+------+----------+------+| no | id | pw |+------+----------+------+| 2 | ant | 6666 || -2 | bear | 5555 || 3 | cat | 4444 || 0 | dog | 3333 || -3 | elephant | 2222 || 1 | fox | 1111 || -1 | goat | 0000 |+------+----------+------+7 rows in set (0.00 sec)cs - 오름차순(ASC), 내림차순(DESC) 중에 표기하지 않을 경우 기본값으로 오름차순(ASC)이 설정된다.mysql> SELECT * FROM temp ORDER..
문제 페이지를 보면 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 파일의 내용을 볼 수 있다.
TABLE: temp실험에 사용한 임시테이블mysql> SELECT * FROM temp;+------+----------+------+| no | id | pw |+------+----------+------+| 2 | ant | 6666 || -2 | bear | 5555 || 3 | cat | 4444 || 0 | dog | 3333 || -3 | elephant | 2222 || 1 | fox | 1111 || -1 | goat | 0000 |+------+----------+------+7 rows in set (0.00 sec)cs - WHERE 조건 뒤 숫자 1(참이 될 수 있는 값, true, 0x01, 0b01)을 주면 모든 값을 출력mysql> SELECT * FROM temp WHER..
문제 페이지에 접속을 하면 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";위와 같이 값을 입력하고 새로고침을 하면 된다.
FAMP(FreeBSD with Apache, MySQL and PHP) - Apache 2.4 – Installation and Configuration# cd /usr/ports/www/apache24/# make install clean Create a file named /boot/loader.conf or edit it if it is already present and add the following line:accf_http_load="YES" # vi /usr/local/etc/apache24/httpd.conf # vi /etc/rc.confapache24_enable="YES" # /usr/local/sbin/apachectl start# service apache24 start - M..
- Install python27 # cd /usr/ports/lang/python27/ # make install clean Configuration # ln -s /usr/local/bin/python2.7 /usr/bin/python 설치된 모듈 확인 # python -c 'help("modules")' - Install py-pip # cd /usr/ports/devel/py-pip/ # make install clean # pip FLAVOR=py27 install clean Configuration # ln -s /usr/local/bin/pip-2.7 /usr/bin/pip requests 모듈 설치 # pip install requests pip를 통한 설치된 모듈 확인(기본 모듈은 제외)..
- Install bash # cd /usr/ports/shells/bash/ # make install clean - Configuration # ln -s /usr/local/bin/bash /bin/bash # chshShell: /usr/local/bin/bash # vi /root/.bashrc alias vi='vim' alias ls='ls -FG' # vi /root/.profilesource /root/.bashrcsource $HOME/.bashrc # bash(bash에서 make DISABLE_VULNERABILITY=yes 같은 옵션을 줄 경우, 명령줄에서 사용 가능)
로컬 저장소 생성 $ mkdir Code $ cd Code $ git init git config 명령어를 이용하여 설정 committer 정보 입력 (--global 옵션이 없을 경우 해당 로컬 저장소에만 적용, 정보는 자신의 정보 입력) $ git config --global user.name "do9dark" $ git config --global user.email "do9dark@gmail.com" 정보 확인 $ git config --global --list 다른 옵션들... $ git status $ git log $ git help ... 파일 생성 $ echo "# Code" >> README.md INDEX(stage)에 추가 (-f 옵션 사용 시 ignore 파일, 삭제한 파일 이력까..
- Install vim-tiny# cd /usr/ports/editors/vim-tiny/# make install clean - ConfigurationVim 설정# vi /usr/local/etc/vim/vimrc(초기 설정)set nocompatibleset bs=indent,eol,startset history=50set rulerset numberset autoindentset smartindentset cindentset tabstop=4set shiftwidth=4set expandtabset pasteset nobackupset viminfo= alias 설정# vi /root/.cshrcalias ls ls -FGalias vi vim 변경사항 적용# source .cshrc