webhacking 180

chall.tasteless.se Infiltration

힌트 : Capture the flag! hint: table level1_flag column flagNo Bsqli!! 이고 블라인드 인젝션을 하지 말라 했으니 union으로 값을 가져오거나 만드는거라 추정된다. http://chall.tasteless.eu/level1/index.php?dir=asc 이고 asc나 desc에 의해 정렬이 바뀌고, 단순 dir=1처럼 넣어보면 에러가 뜨는데 ,2 처럼 넣어보면 에러가 안 뜨는 것으로 보아 select * from table order by 1 $_GET['dir']; 정도인것같다. 현재 설치된 mysql에서 select * from prob order by 1 union (select 1,2) 등등으로 괄호를 바꿔가면서 해봤는데 잘 안됬다. order..

Security Override Decryption 1~7

level 1. rot13으로 암호화되있다고 한다. http://ko.wikipedia.org/wiki/ROT13첫번째 문자열은 본인 아이디 같다. # -*- coding: euc-kr -*- enc = 'dxdukyn, jung vf Frgrp Nfgebabzl' dic = {} small = [chr(x) for x in range(97,123)] big = [chr(x) for x in range(65,91)] for i in range(26): if ord(big[i])+13=65: dic[big[i]]=chr(ord(big[i])-13) if ord(small[i])+13=97: dic[small[i]]=chr(ord(small[i])-13) answer = [] for i in range(le..

webhacking/etc 2014.12.21

Security Override Advanced 2

이전에 풀었던 xcz.kr 21번처럼 php가 엄청나게 난독화되어있다. xcz.kr 21번을 풀면서 난독화에 대해서 조금 익숙해져서 이번에는 일일히 복호화하는데 시간이 좀 덜 걸렸다. 요령을 적자면 1. 주석처리된 부분을 지운다. 2. 함수 하나에 한줄이 차지하게 정렬한다. 3. 최대한 많은 범위를 한번에 치환한다. 자잘한것은 놔두고, 한번 치환 후 눈치를 봐서 치환하던지, 그냥 놔두던지 한다. 3번같은경우 주석을 지우면 $_717=base64_decode(base64_decode(base64_decode(base64_decode(base64_encode('V1cxR2VscFVXVEJZTWxKc1dUSTVhMXBSUFQwPQ==')))));;;;;;;;;;;;;;;;; 같은 $717변수는 딱 보면 bas..

webhacking/etc 2014.12.21

Security Override Advanced 1

라는 코드가 있고 필터링들을 통과해서 complete_advanced_1로 가게되면 성공이다. ==과 ===과 strcmp과의 차이점을 잘 이해해야 한다. ==은 그냥 형을 따지지 않고 같으면 같다고 나오고, ===은 엄격한 비교로 데이터형까지 같아야 같다고 나온다. strcmp는 문자열이 같으면 0, 사전 순서에 따라 1또는 -1이 리턴된다. 즉 위의 필터링을 보면... $input===0을 피해가기 위해서는 대충 0으로 변환되는... "00"같은걸로 형이 다르면 될것이고, strcmp($input,"0000")에서 0이 안나오려면 0의 갯수를 다르게 써주면 된다. 처음엔 "00000"이런거나 NULL, false등등의 왠지 0과 비슷하게 행동할것같지만 다른 형들을 생각해봤는데 자꾸 필터링에서 걸렸다...

webhacking/etc 2014.12.19

Security Override Javascript 1~8

level 1.자바스크립트 사용 안하게 하면 된다. level 2.라고 소스에 있다. level 3.if (password=='4D3dchfa') {window.location.href=''+password+'.php';}라고 소스에 있다... level 4.var pass1= '4';var pass2= '2168827.25';password=prompt('Please enter the Password!','');if (password==pass1*pass2) {window.location.href=password+'.php';라고 소스에 있다.. 8675309 level 5.var pass1= '451';var pass2= '502181';var pass3= pass1*pass2;var pass4= p..

webhacking/client 2014.12.19

Security Override Basic

basic level 1: 주석에 써있다. basic level 2: 입력하는 폼 부분을 찾아보면... AdminPassword: 이라고 히든 속성으로 하나가 있다.pass.html로 가보면된다. basic level 3: user-agent값이 다르다고 안된다고 나온다. User agent Switcher로 하나하나 바꾸다 보니googlebot일때 됬다고 나온다. basic level 4: 자동으로 비밀번호가 입력되 있으니, 어드민으로 들어가라고 한다. 처음엔 그냥 크롬 개발자도구로 보내지는 값만 admin으로 바꿨는데....You have the right idea, although this challenge's focus is to make sure you know how to edit and ex..

webhacking/etc 2014.12.17

Security Override Recon

Recon level 1: securityoverride.org의 아이피 주소를 찾으시오. ping으로 보내보면 된다. ping securityoverride.org 하면 206.214.216.120가 나온다. Recon level 2: 네임서버 두 개를 찾으시오. nslookup툴로 찾으면 된다. 옵션을 -ns로 주면 된다. nslookup -type=ns www.securityoverride.orgns1.423network.com internet address = 206.214.216.118ns2.423network.com internet address = 206.214.216.119라고 두개가 나온다. Recon level 3: 이 서버의 php버전은 몇인가? PHP/*.*.*와 같은 형식으로 작성..

webhacking/etc 2014.12.17

xcz.kr 21번.

난독화가 되어있다....... 이건 코드 난독화라기보다는 변수명? 난독화라 복호화할 수 있는 툴이 없다.(적어도 내가 알기로는... ) 파이썬과 hwp를 이용해서 복호화를 했다. 파이썬에서는 \x71같은거는 알아서 아스키로 변환해 준다. 그리고 대부분 코드 특성상 세미콜론(;)으로 한줄이 끝나는걸 생각해 ;를 ;\n으로 바꾸어 출력했다. (for문의 ;도 한줄 내려가지만 어쩔수없었음.) 바꾸어 출력한뒤 줄을 맞추고, 각각의 변수명이 엄청나게 더럽게 되있다. 예로 그냥 $a라고 쓰면 될것을.. ${"GLOBALS"}["hpceeyxto"]="a"; ${${"GLOBALS"}["hpceeyxto"]}로 선언해놓았다. 이것은 단순히 $a이다.. 그리고 아랫줄에 $raraw="a"; 요런식으로 써서 같은 변수인..

webhacking/etc 2014.12.07

xcz.kr 32번.

라고 있는데... a를 받아서 이걸 urlencode한다. 그 후에 12735366333132132465461????????????????????????????? 와 비교해서 같으면 통과이다. php의 트릭을 이용하여 키 값을 구하라고 하는데 여기서 이용해야 하는 php트릭은 php가 매우 작은 숫자 비교는 같다고 처리한다는 것이다. rubiya님 블로그에 잘 정리가 되있다. http://blog.naver.com/withrubiya/70175920455 를 출력해보면 다름에도 불구하고 작은 차이는 무시하여 1을 출력하는걸 알 수 있다. 1273536633313213246546100000000000000000000000000000 그냥 요런식으로 보내면 매우 작은 차이라 통과된다. 0이 아닌 다른 아무 ..

webhacking/etc 2014.12.07

xcz.kr 18번.

18. 라고 소스가 있다. 가벼운 난독화가 적용되었는데 아래의 echo $key부분을 출력하면 된다. 키를 출력하기 위해서는 1. 여기서 거짓이 되게 하여 exit로 가지 않게 한다. if(empty($liillillilliliili) || empty($liillillliiiliili) || empty($lilllillliiiliili)){exit ('wrong T.T');} 2. 아래 조건문을 참을 만들어줘야 된다. if(test($lililillliiiliili)==" - 103 - 105 - 118 - 101 - 109 - 101 - 112 - 97 - 115 - 115 - 119 - 111 - 114 - 100" || test($lilililliiiiliill) == " - 107 - 101 - ..

webhacking/etc 2014.12.07

Net-Force javascript 7

들어가보면 폼이 있는데 비밀번호하나밖에 입력할 수가 없다. 일단 소스를 보면 unescape관련된 코드가 있는데 자세히 살펴보면 뒤에서 한번더 unescape를 한다. 일단 이상한 변수 d가 있는데 d가 언젠가 쓰일지도 모르므로 개발자도구로 d를 정의해두고 unescape를 두번 한다. 그러면 또다른 자바스크립트 코드가 나오는데 여기서 맨 마지막에 s를 출력하는 것으로 보아 s변수에 뭔가 있을것같다. s를 출력해보면 또다른 코드가 나온다. 중요한 부분은 네모상자쳐놓은 부분이다. 첫번째 상자부분은 우리가 처음 들어갔을때 보이는 폼 부분이다. 폼의 이름은 passwordform이며, 특이점은 username이라는 변수를 히든 타입으로 설정하고 기본 이름이 default이다. 우리가 입력한 부분은 이름이 pa..

webhacking/client 2014.12.04

Net-Force javascript 6

6. html가디언이 있다고 하는데 소스를 보면 자바스크립트가 두부분 나온다. 처음의 뭔가 인코딩되보이는 var~로 시작되는부분과 eval(unescape로 시작되는 부분으로 나눌수 있는데, 앞의 부분은 일단 놔두고, 뒤의 unescape로 디코딩하고 eval로 디코딩된 코드를 실행한다. 일단 unescape부분을 개발자콘솔에서 돌려보면. 또다른 자바스크립트가 나오는데 그 자바스크립트를 돌리려고 하면 변수 fw가 정의가 되어있지 않다고 나온다. fw는 위의 var~ 부분에 정의된것일것이다. 그럼 콘솔에서 해당 변수를 인식시키기 위해 윗부분을 한번 돌리고, 그다음에 unescape부분을 돌려보았다. 뭐 이런식으로 나오는데 끝부분의 오류메시지를 보면 보안설정때문에 inline 스크립트가 실행이 거부되었다 정..

webhacking/client 2014.12.04

Net-Force javascript 1~5

1. view-source:http://www.net-force.nl/challenge/level101/secret.html kiddie, javascript 2. 끝부분에 출력해 보면 된다. 3. 개발자콘솔. user, member 4. 주석을 보면 라는 계정이 있는데 이 계정은 낚시다. 틀린게 아니면 location = user.toLowerCase() + "/" + pass.toLowerCase() + ".html"; 로 이동하는데 또 이걸 다 계산해서 /soulslayer/2aBl6E94IuUfo.html 로 가보면 또 낚시다. /soulslayer까지만 입력해보면 디렉터리 리스팅으로 페이지 목록이 보인다. 5. IE로 들어와야 볼수있을거라고 하지만 크롬도 별 차이가 없는것같다. 소스를 잘 보면 ..

webhacking/client 2014.12.03

GoogleBig - HackGame

1. 소스보기 2. 시스코 라우터를 찾아서 인증을 하라는데; http://blog.naver.com/jjp4rk/80019659546 요기 들어가보니 목록 중에서 찾아서 인증을 하면 된다; 3. /p4s5.js 를 불러오는데 들어가보면 이진수. 8자리씩 있는거보니 각각 십진수로 변화시킨후 아스키값으로 변화시켜보면 될듯싶다. str = '01010000 01100001 01110011 01110011 00100000 01101001 01110011 00100000 01000111 01101111 01101111 01100111 01101100 00110011 01100010 00110001 01100111' an = [] for s in str.split(): an.append(chr(int(s,2))) ..

webhacking/etc 2014.12.01

webhacking.kr 27, 29

27. select id from challenge27_table where id='guest' and no=($_GET[no]) 가 쿼리문. no=(0) or no like 2-- no=(0) or no regexp 2-- 매직쿼터가 안걸려있으면 no=(0) or id like 'a%'나 id like 'admin' 같은것도 될지 모르지만 쿼리 에러가 뜨는거보면 매직쿼터가 걸려있나보다. 29.아무 파일이나 올려보면 내용이 뜨는데 결과값을 보고 쿼리문을 대충 예측해볼수있다. time, ip, file 3개가 있는것으로 보아 insert into table values(값 3개.) 등으로 예측가능한데 내가 입력한 파일명이 첫번째에 들어가는지 두번째에 들어가는지 3번째에 들어가는지 모르므로 하나하나 예측해서..

Enigmagroup basic/Prerequisites, Spoofing, URL Manipulation

Prerequisites level 1 : 소스 보기 하면 답이 있다. Prerequisites level 2 : fopen: could not open file '/www/htdocs/missions/basics/pre/2/dontlookinhere/password.txt'; 이런게 나오는데 저 경로의 파일을 열수 없다는 뜻이다. 현재 url의 경로가 /missions/basics/pre/2/ 이므로 뒤에 /dontlookinhere/ 를 더 쳐보면 디렉터리 리스팅. password.inc가 있다. Prerequisites level 3 : 소스를 보면.. 구글 구글 구글... /robots.txt를 들어가보면 /f0rk가 있고 거기에 config.inc가 있다. Spoofing One : 프록시를 사..

webhacking/etc 2014.11.30

overthewire natas 11

급 난이도 상승; xor_encrypt함수 내부의 $key값은 내가 알아내야된다. 처음엔 ''라고 있어서 이거 자체가 키값인줄 알았는데 똑같은 소스코드로 돌려봤는데 같은 결과가 안나오고, censored라는 단어를 찾아보니 검열되어 삭제된 그런 뜻이 있어서 key값을 구해야된다는걸 알았다. 쿠키는 아래 함수로 만들어진다. function saveData($d) { setcookie("data", base64_encode(xor_encrypt(json_encode($d))));} 이게 맨 마지막에 실행된다. 실행되는 부분은 $data = loadData($defaultdata); if(array_key_exists("bgcolor",$_REQUEST)) { if (preg_match('/^#(?:[a-f\..

webhacking/etc 2014.11.24

overthewire natas 1~10

http://natas0.natas.labs.overthewire.org/ id : natas0, pw: natas0 0,1 : 소스보기. 2 : http://natas2.natas.labs.overthewire.org/files/pixel.png 라는 경로가 있는데 files/까지 치면 디렉터리 리스팅 3 : 구글은 찾을지도 모른다. /robots.txt 4 : http://natas5.natas.labs.overthewire.org/에서 인증을 받고와야 된다. 저기서 온것처럼 Referer를 저기로 바꿔주면 된다. 5 : 로그인이 안되있다고 한다. 쿠키값에 loggedin이 0으로 되있는데 1로 바꾸면 통과 6 : "includes/secret.inc" 폴더를 인클루드 하므로 거기로 들어가보면 된다...

webhacking/etc 2014.11.24

chall.tasteless.se Stop Quotes

test account guest:guesthint: table is level4, columns are username and pass! 요렇게 힌트가 나오고, 폼이 하나 있어서 폼에다가 블라인드 인젝션을 하는줄알고 별 난리를 쳐봤지만 별 유효한걸 못찾았다. 테스트 계정으로 guest,guest가 있어서 들어가보니 guest로 성공적으로 로그인됬다고 나오고 쿠키값에 login=guest%25084e0343a0486ff05530df6c705c8bb4 이 추가되어있다. 딱 봐도 여기에 뭔가 단서가 있는것같다. 잘 살펴본결과 guest%25뒤의 32글자는 guest를 md5로 인코딩한 값이다. 아이디를 인코딩할리는 없고, 비밀번호인 guest를 md5로 인코딩한 값인 것 같다. view라는게 있어서 들어가보..

chall.tasteless.se Milk

Capture the flag! hint: table level2_flag column flagNo Bsqli!! 라는 힌트와 함께 그림이 있다. 주소창이 http://chall.tasteless.se/level2/index.php?req=f 이므로 mysql이라 가정하고 f%23등으로 뒤를 주석 으로 막았더니 그림이 나오질 않는다. 그림이 안나오면 에러처리되는것 같고, f'%23으로 해보면 되는것으로 보아 쿼터로 둘러쌓여있음을 알 수 있다. 힌트에 Bsqli하지말라고 했으므로 그냥 값이 딱 나오는 sqli일 것이다. union으로 값을 넣어봤더니. http://chall.tasteless.se/level2/index.php?req=f%27%20union%20select%201,2,3%23 처럼 3까지 ..

Enigma Group basic/javascript 9

난이도가 조금 올라감. 폼에 입력한 비밀번호가 함수 내에서 쓰이기 때문에 단순히 끝에 alert같은걸로 pass를 출력하는게 되지 않는다; 예를 들어보면 var a="abcde";var b="abedf";var c="abefd";라 하면 첫번째 인덱스에서 셋다 a이므로 이자리는 그냥 넘어간다. 그렇지만 var a="abcde";var b="abedf";var c="gbefd"; 이렇게 첫번째 인덱스의 두개가 a이면(var a,b가 'a'인데 다른변수 두개가 'a'여도 된다.) 그걸 비밀번호의 인덱스와 비교한다. 예로 비밀번호가 "abcd"라고 하면 첫번째 자리는 a가 맞는거. 비밀번호의 인덱스는 변수의 인덱스와 따로 증가한다.(비밀번호는 변수 길이보다 짧음.) 이런식으로 비교해보면 된다. 파이썬. imp..

webhacking/client 2014.11.01

Enigma Group basic/javascript 1~8

외국사이트 http://www.enigmagroup.org/ 의 문제. basic카테고리에 들어가면 여러가지가 있는데 그중 자바스크립트 부분. 1. Jane으로 로그인하라고 한다. 근데 Jane가 목록 상자에 없다. 목록 상자중 아무거나 하나를 크롬 개발자도구로 Jane로 바꿔서 보내면 된다. 2. 뭔가 비밀번호 치는 창이 나오는데 취소 누른다음에 소스를 보면 이리 나오는데 skriptkid가 맞으면 skriptkid.php로 이동하게 된다므로 skriptkid.php로 가면 된다. 3, 2번하고 똑같은데 소스가 아래에 있다. 아래로 주욱 내리다보면 똑같이 있다. 4. 뭔가 똑같은거 같은데 없다. 자세히 살펴보면 비밀번호 입력창을 취소를 눌렀을때 주소가 Index.php로 이동하는걸 알 수 있다. (원래..

webhacking/client 2014.11.01

suninatas level 23

level 22는 23이랑 똑같은데 더 쉬우므로 그냥 안씀... 22와 달리 admin이 필터링되있고, 거기다가 길이제한도 있는데, mysql이 아니라 mssql이라 꽤 오래 걸림.... 공백 필터링, 그리고 아래 필터링된다고 써져있는것들 필터링, 길이제한까지 되있다. 최대한 길이를 줄여가며 인젝션. admin이 필터링되어있길래 mysql에서는 'a' 'dmin'같이 하면 되서 해봤는데 안된다. 귀찮아서 안찾다가 찾아보니 'a'+'dmin'처럼 +로 붙여줄수 있어서 이렇게 해봤는데 이번엔 길이제한에 걸린다. 이리저리 해보다가 다 안되서 그냥 admin을 포기하고 해보기로 했는데 된다. id=' or len(pw)>10-- &pw=guest 처럼 해봤는데 OK admin이 나온다.... len(pw)6 이..

suninatas level 7

http://suninatas.com/Part_one/web07/web07.asp 많이 본 버튼 빨리 누르기........ 코드를 짜면 된다. 주의사항은 패킷 몸체에 어떤 가는 값이 있는지 프록시같은걸로 확인해보고 코드를 짜야된다는거.. import urllib2 req = urllib2.Request('http://suninatas.com/Part_one/web07/web07.asp') req.add_header('cookie','ASPSESSIONIDQSTDACTR=쿠키') urllib2.urlopen(req).read() req = urllib2.Request('http://suninatas.com/Part_one/web07/web07_1.asp','web07=Do+U+Like+girls%3F') ..

webhacking/client 2014.10.30

suninatas level 6

글을 읽어보면 suninatas의 글을 읽으라는게 힌트. 또 참조하라고 http://tools.web-max.ca/encode_decode.php 라는 사이트 링크가 있다. 나머지는 다 쓸모없는 말. readme 들어가보면 sql문이 보이는데 sqli를 성공해야한다. "select szPwd from T_Web13 where nIdx = '3' and szPwd = '"&pwd&"'" asp라 알아보기 좀 불편할수도 있음.... qkqhxla1을 넣으면 이런식으로 변형 select szPwd from T_Web13 where nldx = '3' and szPwd = 'qkqhxla1' 필터링이 거의 없으니 그냥 true로 만들어주면 된다. select szPwd from T_Web13 where nldx..

wargame.kr type_confusion

$json = json_decode($_POST['json']); $key = gen_key(); if ($json->key == $key) { $ret = ["code" => true, "flag" => auth_code("type confusion")]; } else { $ret = ["code" => false]; } function gen_key(){ $key = uniqid("welcome to wargame.kr!_", true); $key = sha1($key); return $key; } 중요부분. POST방식으로 json값을 받아서 $json->key와 $key와 같으면 통과. $key는 gen_key()함수로 값을 얻음. gen_key()의 리턴값은 랜덤한 문자열이 sha1로 인코딩된값..

webhacking/etc 2014.10.30