webhacking 180

webhacking.kr 22

guest, guest로 로그인하면 이상한 해쉬값 발견, 길이가 32라 md5같은데 salt를 뭘 붙이는거같음. 조인으로 새로운 아이디 만들어보니 또다른 해쉬값 생성. salt+아이디 등으로 해쉬가 만들어지는듯. 별짓 다해봐도 안되다가 id를 admin' or 1%23 등으로 보냈더니 Wrong가 아닌 Wrong password라는 에러메시지 확인. Wrong password는 아이디는 맞았는데 password가 틀렸다는 소리같음. 그럼 admin' or 1%23은 true라는 소리이므로. 이걸로 pw길이 확인. id=admin\' and length(pw)

webhacking.kr 21

1 입력시 true. 2입력시 true http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=1&id=&pw= 라는 인자로 보아 no,id,pw컬럼 확인. no=이 입력부분이고, 대부분 숫자로 가정하여 홑따옴표'를 안씌운다는 가정하게 인젝션. ?no=2 and ascii(substr(id,1,1))=97%23&id=&pw= 이런식으로 true, false판별해본결과 no=1 의 id='guest', no=2의 id='admin' 확인. no=2의 pw를 뽑으면 될거같으므로 ?no=2 and length(pw)

wargame.kr q&a

뭔가 되게 페이지는 열심히 만드신거같은데 취약점 찾기가 쉬웠다는 ㅠㅠㅠ.. 들어가기전 시간 기반 인젝션이라는 힌트가 있고, 들어가서 탭 하나하나 눌러보면 주석에 힌트로 xss문제가 아니라 sqli문제라고도 써있음. 다들 일반적인 자바스크립트 동작들... jsmaster에게 메일을 보내는게 있는데 당연히 여기가 취약... 메일을 보내게되면 패킷을 잡아보면 post방식으로 이런 데이터가 가는데... cont=sdfsfsfsdfsdf&mail=sdfsdfsdfsdf&type=1 type에 따라 q&a인지 free인지 구별을 하게해놓았지만 여기 뒤에 인젝션이 가능.... &type=1 and if(1=1,sleep(3),1) 이런식으로 여러번 해보면 3초 멈추는걸 확인 가능.. cont=sdfsfsfsdfsdf..

wargame.kr ip_log_table

들어가면 admin으로 로그인하는 창과 ip log를 보여주는 기능을 하는 창 두개가 있다. admin으로 로그인하는 창으로 들어가서 admin-- , admin#,등으로 삽질을 해봤는데 반응이 없다. ip 로그 테이블목록을 보여주는곳에서 소스를 보면 숨겨진 폼이 있다. 이거에 뭔가 있을듯. ip 로그 목록을 클릭해보면 진짜로 아이피주소만 나오고 다른건 안나온다. 프록시로 데이터를 잡다보니 idx라는 값을 보낸다. 위의 숨겨진 폼에서 어떻게 연산을 해서 보내는것 같다. 숫자면 당연히 인젝션이 될거같으므로 바꿔서 보내봤다. idx=0이나 idx=1255 or 1=0나 idx=1244 and 0 등으로 거짓이 되게 보내면 이런 문자열이 나온다. 1970-01-01 09:00:00 webhacking.kr 2..

wargame.kr web_chatting

풀고 싶었는데 서버가 너무 자주 죽어서 관리자님께 하소연했더니 호흡기 붙여주심.(관리자님 감사해요) 이전에도 말했듯이 기술을 중요시하는 webhacking.kr보다는 조금 더 현실적인(?) 워게임이라 취약점 찾는데 몇일 걸렸습니다. 그런데 찾고보니 일반적인거네요... 소스 사이에 잘 숨겨두심. var xmlhttp,ni,iq=0,brtype=1; function getchatlog(type){ xmlhttp = new XMLHttpRequest(); if(type==1){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1"); }else if(type==2){xmlhttp.onreadystatechange=chatprint;xmlht..

wargame.kr tmitter

들어가기전에 테이블 구조가 있다. you need login with "admin"s id! =========================== create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32) );그리고 들어가보면 조인(회원가입)과 로그인 두개밖에 없다. 조인에서 아무거나 만들고 로그인으로 들어가보면 글 쓰는 페이지가 있다. 글에는 필터링이 되어있는지 아무거나 입력해봐도 다 나온다. 테이블 구조가 문제 들어오기 전에 보이고, 페이지가 조인, 로그인 두개밖에 없으면 당연히 sql문에서 insert문을 공략하는 문제이다. 그리고 insert문을 공략하는 방법이면 가장 흔한 insert into 테이블 ..

wargame.kr php? c?

c의 오버플로우 관련 문제. d1과 d2를 post로 받은 후 p7.c파일을 컴파일해서 /tmp/p7로 만든 후 d1을 인자로 줘서 프로그래밍 실행 후 결과가 1이 아니면서 d2와 나온 결과가 같으면 키값 출력. 우선 뭔지 알려면 컴파일하게 되는 p7.c소스코드를 봐야된다. p7.c를 주소창에 입력해보면 소스코드가 나온다. #include #include void nono(); int main(int argc,char **argv){ int i; if(argc!=2){nono();} i=atoi(argv[1]); if(i4){nono();} if(i

webhacking/etc 2014.10.04

wargame.kr strcmp

코드게이트 2013에서 나왔던 php strcmp취약점. 찾아보니 루비야님이 잘 정리 해놓으셨음... http://blog.naver.com/withrubiya/70173344266 데이터 전송시 배열형태로 전송하면 된다. password[]=a 배열 형태이면 무조건 0이 반환.... 근데 루비야님의 실험을 보면 php 5.2부터는 제대로 1로 나온다고함.. $password는 sha1로 변환한 엄청나게 복잡한 값이고 내가 입력해서 POST방식으로 받은 password변수와 비교해서 0이 리턴되면 통과. php 4버전 이하로 strcmp함수에 배열값이 들어왔을때 NULL값이 반환되어 무조건 0이 반환된다. PHP5부터는 패치되서 안된다고 한다.

webhacking/etc 2014.10.02

wargame.kr DB is really GOOD

뭔지 몰라서 한참찾았다. 이것저것 별 난리를 다해봐도 넘어가는데 이상이 없다. 문제 클릭을 해보면 유저와 db사이에 관계? 를 파악하는 문제라는데 답이 없어보인다. 첫번째날은 그냥 포기해버리고 다음날에는 admin으로 접속하면 안된다고 자바스크립트로 표시된 부분에 주의하여, admin계정으로 접속하면 뭔가 있을것같아서 접속했다. 어 근데 자바스크립트로 되있어서 아무값이나 입력 후 프록시로 잡아채서 admin으로 바꿨는데 안된다. 클라이언트측에서도 검사하고 서버측에서도 검사하나보다. 서버측에서 검사할땐 일반적인 php....같은걸로 할테니까 예전에 어디서 보았던 php의 널바이트 였나? ;%00 으로 잘 조합하면 될것같기도 했다. user_id=adm;%00in 로 바꿔서 보내봤더니 이런 소스가 뜬다.? ..

wargame.kr fly_me_to_the_moon

일단 비행기 게임을 해보고, 제작자가 일부러 햇갈리게 하려고... 인지는 모르겠지만 항상 해왔던데로 소스를 열어봤는데 eval(function(p,a,c,k,e,d) 로 시작되는 엄청 긴 소스가 있다. 자바스크립트 문제구나. 생각하고 이쁘게 만들어서 소스를 해석해보았는데 별 정보가 없다. 계속 봐도 없다. 나중에 생각하니 p.a.c.k.e.r이게 너무 유명해서 너무 거기에 민감해진 듯 싶다. 그러다가 다시 게임을 해 봤는데 31337점이 필요하다고 한다. 점수는 뭐 내가 죽으면 보내지는거니까 점수 보내질때 변조를 해보자고 생각하고 프록시를 켜니 또 이상한것들이 잡힌다. 그건 무시하고 점수를 31337로 변조해서 보내봤는데 반응이 없다. 뭐지... 계속 하다가 프록시로 잡아서 보낼때만 token error..

webhacking/client 2014.09.29

wargame.kr QR CODE PUZZLE

들어가보면 예전에 필통으로 많이 하던 퍼즐이 나온다. 소스를 보면 jquery소스가 있다. 근데 난 jquery를 자바스크립트에서 조금 쓰기 쉽게 된 그런 언어? 라는것밖에 모른다.(방학때 공부해야겠다.) /*$(function(){ $('#join_img').attr('src',unescape('.%2f%69%6d%67%2f%71%72%2e%70%6e%67'));$('#join_img').jqPuzzle({rows:6,cols:6,shuffle:true,numbers:false,control:false,style:{overlap:false}});hide_pz();});function hide_pz(){var pz=$('#join_img div'); if(pz[pz.length-2]){$(pz[1]).r..

webhacking/client 2014.09.28

wargame.kr wtf_code

이거밖에 없다. 꾸쌤이 이거에 대해 언급하지 않았으면 계속 몰랐을듯 싶다. 스페이스바, 탭 줄내림만으로 이루어진 white space라는 이상한 언어이다. http://en.wikipedia.org/wiki/Whitespace_(programming_language) white space라는것만 알면 인터프리터 찾아서 돌리면 되므로 쉽다. http://ws2js.luilak.net/interpreter.html 근데 언제봐도 신기하다... 이거말고도 brainfuck라는 이상한 언어도 있다 ㅋㅋ http://cafe.naver.com/sourcemulti/42579 http://en.wikipedia.org/wiki/Brainfuck

webhacking/etc 2014.09.28

information_schema

information_schema 데이터베이스에는 모든 테이블의 정보가 들어있음. 데이터베이스.테이블이름 이런 형식으로 접근 가능함. 많이 쓰이는건 information_schema.tables, information_schema.columns, information_schema.processlist 테이블명을 알아낼때. information_schema.table 테이블의 table_name컬럼이 있음. 이 컬럼은 영어 그대로 테이블 이름을 저장해둠. select table_name from information_schema.tables; 로 해보면 시스템 테이블이라던지 모든 테이블이 보여져서 찾기가 불편함. 현재 내가 들어온 db의 테이블만 보려면 select table_name from inform..

wargame.kr lonely_guys

http://wargame.kr:8080/lonely_guys/index.php 방법론은 대충 알았는데 잠시 해멨다. reg_single(sort) 부분을 클릭하면 정렬이 됬다가 다시 반대로 정렬이 됬다가 바뀐다. 소스 윗부분에는 POST방식으로 sort를 받는다. 그리고 이것에 따라서 정렬을 수행하는것 같다. if(isset($_POST['sort'])){ $sort=$_POST['sort']; }else{ $sort="asc"; } 그리고 mysql_real_escape_string함수로 받은 sort에서 위험한 문자를 제거한 후에 쿼리를 돌린다. $result=mysql_query("select * from guys_tbl order by reg_date $sort"); 대충 여기까지 읽어봤으면 P..

rubiya.kr 19번 다른방법.(원래방법?)

if등의 조건문이 전부 막혔을시 이전 글에서 coalesce라는 이상한 함수를 써서 해결했었는데 페이스북 그룹 생활해킹에서 또다른 해답이 올라왔는데 너무 좋은 방법같아서 포스팅... Izayoi Sakuya님의 방법인데.. 이런식으로도 할수 있다고 함.. 우와 신기... 더 아래 댓글에서 union은 내부적으로 임시 테이블을 만들고 쿼리문의 결과를 테이블화 한 후에 리턴하므로 저런 에러가 발생하는것 같다고 추측하셨음.. 어제 적었던 a' or coalesce(substr~ or null, (에러나는서브쿼리)); 나 이 글의 a' or (select 0x~ union select substr~); 를 조합하면 엄청나게 많은 벡터가 생성될듯. 다만 위 구문은 or이 안막혀있어야 하고, 아래구문은 select..

mysql hex()함수에 관해서

블라인드 인젝션시 한글자씩 값을 뽑아와야되는데 ascii나 ord가 막혀서 hex로 값을 뽑아오는 경우가 있다고 가정하자. 일단 프로그래밍으로 자동화하기에 앞서 mysql에서 구문이 제대로 동작하는지 확인해봐야 될 것이다. mysql> select * from prob;+-------+-------+| id | pw |+-------+-------+| admin | 1234 || guest | guest || oop | nop |+-------+-------+3 rows in set (0.00 sec) mysql> 요런 테이블이 있다고 가정하면 연습으로 pw에서 제일 첫번째 글자를 뽑아와서 그것을 hex했을시 아스키코드값인 0x67(10진수 103) 이 나오는걸 확인할수 있다. 그런데 단순히 이거만 확인..

webhacking.kr 13번.

힌트는 HINT : select flag from prob13password 라는 쿼리문하나. 다른곳을 찾아봐도 다른 힌트는 없고, SQLI같이 소스가 보이지도 않아서 블라인드 인젝션으로 생각. 나와있는 열은 flag밖에 없어서 flag값을 알아내는거라고 추측 값을 넣을 수 있는 no에 이것저것 값을 넣어보면 0또는 1만 나오고, 1 이외의 다른 수를 넣어봤을때 무조건 0이 나오는걸로 보아서 0을 틀린경우로, 1을 맞는경우로 사용하면 되겠다고 생각. 값을 넘길때 no=?식으로 값이 넘어가는데 쿼리문을 예상해보자면 select flag from prob13password where no=?같은 형식이나 select 열 from 다른테이블 where no=? 같은 형식으로 예상할 수 있음. no=if((se..

mysql max,min함수

mysql에서 max,min함수를 자주 쓴다. 그런데 종종 헷갈릴 때가 있다. 컬럼에 'aaa'와 'bcd'와 같이 길이가 같은 두개의 열이 있다고 하면.. max결과시 뭔가 예상했듯이 'bcd'가 결과로 나온다. 하지만... 'c' 'bcd' 두개의 열이 있고, max함수를 써보면 c가 결과값으로 나온다. 개발 경험이 없고 웹해킹에서만 쓰다 보니 그냥 길이가 긴게 우선인줄 알았는데 아니다. 길이가 같던 다르던, 앞에서부터 하나하나 비교하다가 더 뒤쪽의 아스키코드값이 나올경우 그게 max값이다. 'bc'와 'bcd'가 있으면 bcd가 max이고, 'bd'와 'bcz'가 있으면 bd가 max이다. (길이는 상관없다.) mysql> select * from contacts;+------+-------+---..

webhacking.kr 12번

크롬 개발자도구에 eval로 실행하는 부분만 빼고 돌려보면 저렇게 나옴. 대충 소스 살펴보면 아래의 if 내부의 ck가 뒤의 복잡한 부분이 맞으면 alert으로 답을 출력해주는거같음. ck는 url의 =의 위치. 뒷부분만 추려서 document.write로 화면에 출력해보면 =youaregod~~~~~~~! 출력. ck(url에서 =의 위치)와 저 문자열이 같아야 하므로 뒤에 =youaregod~~~~~~~!를 붙여주면 통과 ****** 파이썬으로 위의 악성코드 생성기를 구현해보았음.(심심해서) javascript = "alert('xss!');" strs = """""" print strs 돌려보면 로 잘 생성됨. 제대로 동작도 함..

webhacking/client 2014.08.31

webhacking.kr 9번.

처음에 문제 들어가기 위한 관련 자료 -> 여기 a = ['{:x}'.format(i) for i in range(128+1)] 관련 자료는 여기 일단 요청을 보낼때 파로스나 버프같은 프록시로 요청을 잡아서 메소드를 OPTION메소드로 바꿔서 요청을 보내면 어떤 화면이 나오는데.. 인젝션은 특별히 어려운게 없으므로 그냥 하면 됨. 필터링을 다 피하고 쿼리문을 짜보면 if(substr(비밀번호,1,1)in(0x16진수),3,0) 이런식으로 판별. 그런데 한가지 이상한점. 처음에 인젝션할때는 맞으면 no=1로 판별해서 Apple가 출력되면 맞는걸로 확인, 틀리면 no=2로 판별 해서 banana였나? 그게 나오도록 해서 판별했는데 이런식으로 판별하니 중간에 맞는 값인데도 인젝션 결과가 틀리게 나와서 한참동안..