안녕하세요. 오늘은 webhacking 20번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 20번을 눌러주세요.

칸이 세개가 있고 그  밑에 문구가 있습니다.

프로그래밍을 하지 마라! 이것은 자바스크립트 문제이다. 라고 적혀있네요.

일단은 소스를 봅시다.

function 은 사용자 정의 함수입니다. 즉 기본적으로 제공되는 함수가 아닌 사용자 임의로 만들어진 함수란 뜻입니다. 뒤에 ck가 있는 걸로보아 임의로 만든 ck라는 함수를 호출하는 것 같습니다.

첫줄을 보시면 if(lv5frm.id.value=="") { lv5frm.id.focus(); return; } 라고 되어있네요.

lv5frm의 id 값이 비어있으면 id의 포커스를 맞추고 값을 리턴시킨다는군요. focus()라는 것은 커서위치를 맞춰주는 함수입니다. 즉 값이 반환이 되어도 바로 입력할 수 있도록 커서위치를 맞춰준다는 것이지요.

2번째와 3번째 줄도 똑같구요. 4번째 줄을 보시면

hack의 값과 attackme의 값이 다르면 hack값을 리턴시킨다는군요. 즉 두 값이 같아야 리턴이 안됩니다.

마지막으로 이 데이터들을 전송시키는 submit함수를 호출하고 종료합니다. 아무래도 문제해결을 위해선 ck함수를 실행시킬 필요가 있습니다.

정상적으로 ck함수를 실행시키기 위해선 id ,cmt ,hack에 값을 넣어야 하며 이중 hack의 값은 attackme랑 같아야 합니다.

그렇다면 본문으로 들어가 id와 cmt, hack와 attackme를 찾아봅시다.

개발자도구에 들어가 하나하나 살펴봅시다.

 nickname옆의 칸은 id

comment옆의 칸은 cmt

 code옆의 칸은 hack

 값이 cyfsrwutxu인 버튼은 attackme

마지막으로 누르면 ck함수를 호출하는 Submit버튼이 있네요.

자 그럼 이제 값을 대입하는 것만 남았네요. hack과 attackme의 값만 같으면 되고 나머지는 따로 조건이 없었으므로 그냥 아무거나 입력해봅시다.

전송버튼을 눌러봅시다.

 ???? 틀렸다는 문구와 함께 attackme의 값이 바껴져있습니다.

왜 이렇게 된걸까 하고 살펴보았더니 상단 중앙에 다음과 같은 문구가 있습니다.

시간 제한 : 2 라고 되어있네요. 왜 진작에 못봤을까요.

2라고 적혀있으니 2분 또는 2시간이거나 아니면 2초(...)

혹시 2분이 아닐까 해서 빠르게 적어서 전송을 눌렀습니다만 역시 실패했습니다.

그렇다면 역시 2초인 것 같습니다.(...) 사실 상 2초안에 데이터를 입력한다는 건 불가능합니다. attackme의 값이 매번 달라지는데다가 복사도 안되서 일일이 써야하는데 다른거 다 재껴놓고 attackme만 쓰는데도 2초이상 걸립니다. 그래서 이럴땐 꼼수를 써야하지요.

아까도 말씀했다시피 2초안에 내용을 다적기는 불가능합니다. 그렇다면 2초란 카운트가 시작되기전에 미리 다 적어놓아야 하지요. 일단 메모장을 열고 다음과 같이 적어봅시다.

 뜻은 다들 아실테니 생략하겠습니다. 다 적으셨으면 복사를 해줍시다.

그리고 개발자 도구의 콘솔에 붙여넣습니다.

그 다음이 중요합니다. F5를 눌러 문제를 새로고침한다음 바로 콘솔창에서 엔터를 눌러 붙여넣은 내용이 실행이 되도록 합니다. 성공적으로 되셨다면 아래와 같은 창이 뜹니다.

간단한 문제처럼 보였지만 통수 맞았군요.

네 이것으로 문제풀이를 마치겠습니다.

 

 

 

'Webhacking' 카테고리의 다른 글

webhacking - 18번 문제  (0) 2015.10.02
webhacking - 60번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 42번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 42번을 눌러주세요.

음 download버튼이 있습니다. 한번 눌러 봅시다.

test.txt는 위와 같이 뜨는군요.

test.zip은 위와 같이 접근거부 당했습니다.

자 이제 소스를 한 번 봅시다.

주석처리된 부분을 보시면 test.zip의 패스워드는 오로지 숫자만으로 되어있다는군요.

그렇다면 test.zip을 받을 필요가 있습니다. 그러면 어떻게 해야 할까요?

자 본페이지로 돌아가서 관리자도구를 열어 봅시다. 열어서 삼각형 버튼을 눌러 쭉 훑어보면

아래와 같은 화면이 나옵니다.

txt의 download 링크는 down값이 dGVzdC50eHQ= 인 주소로 하이퍼링크가 되구요.

zip의 download링크는 접근거부 창이 뜨는 주소로 하이퍼링크가 되어있네요.

그렇다면 여기서 궁금증이 하나 생기죠.

dGVzdC50eHQ=가 도대체 뭘까요?

딱 봐도 소문자 대문자 숫자가 섞인걸 보아 인코딩된 문구라는 것을 알 수 있습니다. 

게다가 문구 뒤에 =가 붙어있기 때문에 base64로 인코딩 된 것을 알 수 있습니다.

그렇다면 base64로 디코딩 해 봅시다.

위의 주소로 들어가시면 base64가 있습니다.

디코딩을 하니 test.txt가 나오는군요.

즉 정리하면 down 값에 파일이름을 base64로 인코딩한 값을 넣으면 그 파일의 주소로 이동하게 된다 라고 해석이 되겠네요.

우리는 test.zip의 주소로 이동해야 하므로 test.zip을 인코딩하여 down에 넣어봅시다.

dGVzdC56aXA=란 값이 나왔군요. 그렇다면 down에 넣어봅시다.

변수에 값을 넣을때는 아래와 같이 주소뒤에 ?를 붙이고 넣어야 합니다.

엔터를 칩시다.

그러면 test.zip이 다운되는 것이 보입니다. 한번 열어 봅시다.

readme.txt가 보이네요. 보기를 위해 압축을 풀어 줍시다.

암호를 입력하라는군요. 아까 소스창에 적힌 것을 보면 암호는 오로지 숫자만으로 되어있답니다. 그런데 숫자로만 되어있다 해도 몇글자인지 모르니까 이건 뭐 별 소용이 없습니다.

그래서 zip파일의 암호를 풀어주는 프로그램을 써봅시다.

여기선 azpr프로그램을 사용해 보겠습니다.

다운받아서 열어봅시다.

열어서 위와 같이 해주시면 됩니다. 따로 설명이 없어도 다들 아시겠죠?

Zip-file부분엔 test.zip넣어 주시고 비번은 온리 숫자이므로 all digits 체크해주시고 start버튼을 눌러주시면 끝입니다. 정말 간단하지요,

해독이 완료되었습니다. 뜬 창을 보면 total passwords가 있는데 이것은 패스워드를 찾기 위해 대입한 숫자구요. 진짜 패스워드는 빨간 박스안에 있는 패스워드입니다.

알집에 입력해서 풀어봅시다.

주소가 하나 나오는군요. 주소를 입력해 봅시다.

패스워드가 나왔습니다. 이제 이 패스워드를 인증해봅시다.

웹해킹 홈페이지의 auth에 들어가 패스워드를 입력해 주시면 됩니다.

Submit를 눌러주시면

이렇게 뜹니다.

네 이것으로 문제풀이를 마치겠습니다.


'Webhacking' 카테고리의 다른 글

webhacking - 60번 문제  (0) 2015.09.25
webhacking - 20번 문제  (0) 2015.09.25
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
webhacking - 49번 문제  (0) 2015.08.07
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 58번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 58번을 눌러주세요.


PW와 login이 있네요. 소스부터 봅시다.

화면의 오른쪽 마우스를 눌러 소스보기를 누릅시다.

kk.js란 파일이 들어가 있음을 알 수 있습니다. 확장자js 인 파일은 외부 Javascript 파일입니다. 즉 JavaScript 코드만을 가지고 있는 text 파일이라고 보시면 됩니다.

그러면 이 kk란 파일은 어떤 것을 의미하는 걸까요. 확인을 위해 본페이지로 돌아가 개발자 도구를 열어봅시다.

개발자 도구의 Elements를 누르면 위와 같은 화면이 나옵니다.

소스에 있는 kk.js외에도 kk2.js와 hackme.swf 파일이 있는 것을 알 수 있습니다.

확장자가 swf인 파일은 플래시 파일을 의미합니다.

그렇다면 이러한 파일들을 확인해 볼 필요가 있습니다. 주소창 바로 뒤에 파일이름을 적어줍시다.

엔터를 치시면 아래와 같이 나옵니다.

보니까 kk에 document.URL을 저장시키고 저장된 kk의 값에서 앞에서 10번째다음 숫자부터 4개의 값을 뽑아내 kk에 다시 저장시킨다는군요.

다음 파일을 봅시다.

kk에 me.swf를 더한 값을 kk에 저장시키고 그다음 embed태그와 kk를 적어 출력시키고 있습니다. embed는 플래시를 재생하게 해주는 태그입니다. src는 플래시의 주소겠지요.

음.. 일단 마지막 파일을 확인 해 봅시다.

문제의 화면이랑 똑같은 것이 나오네요. 아무래도 이 것이 플래시인것 같습니다.

login을 누르니 wrong이라고 나오네요.

그런데 kk2.js를 보시면 kk값에 me.swf를 더한다는 수식이 있습니다.

동영상을 어떻게 더한다는 것일까요? 일단 동영상을 받을 필요가 있어보이는군요.

그런데 어떻게 받아야 할까요? 오른쪽 마우스를 눌러도 파일을 받는 선택지가 없으니까요.

이럴땐 메모장을 하나 열어줍시다. 그리고 아래와 같이 씁시다.

그리고 저장시켜줍시다.

a href는 하이퍼링크를 걸어주는 태그입니다. 글자를 누르면 hackme가 있는 장소로 가게 해주는 것이지요. 그럼 왜 만드느냐고요? 보시면 압니다.

파일 이름은 html로 저장시켜 줍시다.

그리고 파일을 열면 하이퍼링크 걸린 글자가 나옵니다. 그대로 오른쪽 마우스를 눌러 다른 이름으로 대상을 저장합시다.

다운 받은 동영상을 재생시키면 그냥 별거 없습니다. 단 kk+me.swf이므로 문자 또는 숫자로 더할 가능성이 있습니다. 메모장으로 동영상을 열어봅시다.

그냥 메모장을 켜고 동영상을 메모장에 끌여다 놓으시면 됩니다.

알 수 없는 문자들만 우르르 적혀 있군요. 쭉 살펴봅시다.

잘 살피면 우리가 알아들을 수 있는 문구가 하나 보입니다. 주소가 적혀있네요. 한번 들어가 봅시다.

입력하시면 잘못된 주소라고 나옵니다

....

굳이 잘못된 주소를 적어놓았을까요?

메모장을 다시 한번 살펴봅시다.

다시한번 보니까 세번째 줄에 php가 보입니다. php는 웹페이지의 확장자 중 하나입니다.

d.php... 뭔가 이상하죠. 혹시 짤린건가 생각해서 주소에 d.php를 붙여 보았습니다.

엔터를 치시면

음? 바로 해결이 되는군요.. 좋은건가..

네 이것으로 문제풀이를 마치겟습니다. 


'Webhacking' 카테고리의 다른 글

webhacking - 20번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 61번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 61번 문제를 눌러주세요.


정말 쿨하게 나와있네요. source를 눌러줍시다.

여기선 solve 대신 clear가 나와있네요. q[id]=admin이면 해결된다네요. q부분을 한번 봅시다. mysql_query를 통해 query문을 실행하는군요. 

select $_GET[id] : 입력받은 id를 검색한다는 뜻입니다.

from c_61 : c_61 테이블에서 라는 뜻입니다.

order by id desc : order by는 정렬하는 함수이구요. desc는 내림차순을 의미합니다. 즉 id칼럼을 내림차순으로 정렬하라라는 뜻입니다.

limit 1 : 데이터를 가져올 갯수를 뜻합니다. 여기선 id의 맨 첫번째 줄에서 1개를 가져온다는군요. 

limit 1때문에 id를 전부가져오란 명령어를 꺼내도 내림차순 된 id 하나밖에 나오지 않습니다.

내림차순으로 정렬되었으니 가장 으뜸인 z가 맨위에 있는 것이지요.

그렇다면 우리는 어떻게 해야할까요? 

주석문을 넣어 뒤쪽의 조건을 전부 무력화시키면 어떨까요? 쿼리문은

'admin' from c_61--가 되겠죠. 이렇게 되면 참 좋겠습니다만 소스에 보시면

if(eregi("\(|\)|union|select|challenge|from|,|by|\.",$_GET[id])) exit("Access Denied");

가 있습니다. 해당문자열이 들어갈 경우 접근금지 라는 메세지를 출력한답니다.

from이 금지어로 되어있기 때문에 주석문은 의미가 없어졌습니다. 그렇다면 우리는 select문의 비밀을 이용해 풀어보겠습니다.

select id 는 id칼럼에서 검색하라라는 소리입니다. 이건 다들 아시는겁니다만

select 1 id 는 무슨 뜻일까요? 

1이란 값의 별명을 id로 주어 이 id를 칼럼명으로 쓰겠다는 뜻입니다.  그렇게 되면 결국 id칼럼안에 1값이 들어가지게 됩니다. 이것을 칼럼별칭(column alias)이라고 합니다.

그렇다면? select admin a는 무슨 뜻일까요?

admin이란 값의 별명을 a로 주어 이 a를 칼럼명으로 쓴다는 뜻입니다. 그렇게 되면 a칼럼안에 admin 값이 들어가지게 됩니다. 이방법을 사용하면 됩니다. 다만

위와 같이 q[id]가 admin이 되어야 하므로 쿼리는 select admin id 이렇게 써줘야 합니다. 이렇게 해야 id칼럼안에 admin값이 들어가지게 됩니다.  그렇게 되면 뒤쪽의 문구는 쓸모가 없어집니다. 이미 q[id]안에 admin이 들어가졌으니 뭘 어떻게 해도 admin을 뽑게 되어있습니다.

다만 문자열 admin을 입력하기 위해선 '를 입해야 하는데 이 '가 magic_quotes_gpc에 의해막혀있습니다. 게다가 ()도 필터링이 되있기 때문에 char 함수도 사용할 수 없습니다. 그래서 저번에 한 것 처럼 hex값을 줘서 풀이합시다.

admin의 헥스값은 0x61646d696e입니다. 입력칸이 따로 없으니까 주소창에 적어줍시다.

변수를 입력하기전에 ?를 붙여주셔야 합니다.

네 이것으로 문제풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 49번 문제를 풀어보겠습니다.

홈페이지로 들어가 49번 문제를 눌러주세요.

? 보니까 46번 문제랑 똑같이 생겼습니다. 일단 제출을 해봅시다.

zzibong가 뜨는군요. 소스를 한 번 봅시다.

주석처리 되있는 index.phps가 보입니다. 주소창 뒤쪽에 붙여서 들어갑시다.

solve부분부터 봅시다. q[0]이 admin이면 해결이 된다는군요. 46번 소스랑 비슷하네요.

q부분을 봅시다. sql문을 실행시키네요. 입력한 lv에 맞는 id를 nembers에서 검색시켜서 반환한다는군요.

즉 이부분을 보시면 level이 1인 q값이 echo에 의해 출력되었습니다. level1의 q는 zzibong이군요. 그런데 칸에 다른 수를 입력해보시면 1을 제외한 다른 숫자는 출력이 되지 않습니다. 즉 lv1에 맞는 아이디는 하나밖에 없다는 것입니다. 하지만 우리는 id가 admin인 것을 뽑아내야 합니다. 그런데 lv에 맞는 admin이 없으므로 lv의 조건을 무력화 시켜줄 필요가 있습니다.

select id from members where lv=$_GET[lv] 라고 되어있는 문구에 lv값을 넣어 lv값의 조건을 무효화시키고 id가 admin인 것을 빼올려면 어떻게 해야할까요? 간단합니다.

select id from members where lv=1 or id='admin' 이 되게 하면 됩니다.

lv이 1값이거나 또는 id가 admin인 id를 검색한다. 즉 앞의 lv값이 1이든 2이든 3이든 100이든 앞의 조건을 무시할 수 있습니다. or이기 때문에 앞의 조건이 맞지 않아도 뒤쪽의 조건 id가 admin인 id를 검색하게 됩니다. 그런데 or이기 때문에 앞의 조건은 무조건 틀려야 하니까 lv의 값은 1을 제외한 값을 넣어서 앞의 lv조건이 무조건 틀리도록 해주셔야 합니다.

1만 아니면 되니까 아무값이나 넣어줍시다. 저는 2를 넣겠습니다.

select id from members where lv=2 or id='admin' 이렇게 해주시면 됩니다.

그런데 말입니다. 소스의 윗부분을 보시면 eregi가 있습니다. 해당문자열을 찾을 경우 그다음 명령어를 실행하는 함수입니다. exit()가 있는걸로 보아 문자열을 찾았을 경우 종료된다고 되어있네요. 즉 쉽게 말하면 금지어입니다. " "(뛰어쓰기)가 금지어고 or도 금지어네요. 그렇다면 or을 대신할 만한 것 중에서 띄어쓰기가 필요없는 것을 쓸 필요가 있습니다. 간단하죠.

||입니다. ||는 키보드 \위쪽에 있습니다. ||을 넣어주시면 2||id='admin'이 됩니다. 넣어줍시다.

lv칸에 입력하면 안되는 것이 보입니다. 아무래도 magic_quotes_gpc에 의해 '가 막힌 것 같습니다. 그래서 char을 이용하여 입력해보겠습니다.

2||id=char(97,100,109,105,110)가 되겠네요. 한번 입력해봅시다.

제출을 해봅시다. 안되네요...

문법으론 틀리지 않았습니다. 혹시 필터링을 잘못보았나 싶어 필터링을 쭉 자세히 살펴보았습니다.

if(eregi("\(",$_GET[lv])) exit();
if(
eregi("\)",$_GET[lv])) exit();

가로도 필터링이 되있었네요... 즉 char은 사용할 수가 없습니다. 그런데 admin을 '없이 char 사용 없이 표현할 수 있을까요? 굳이 char이 아니더라도 (가 금지되있기 때문에 다른 함수를 쓸 수도 없습니다. 그런데? 다른 함수를 쓰지 않고도 그 것의 고유한 값을 표현할 수 있는 방법이 있지요. 바로 hex값입니다. 

hex값이라 하여 사람들이 어려워 하는데 어려워 할거 하나 없습니다.

그냥 admin을 16진수로 바꿔주시면 됩니다. 프로그램이 구글에 널려있으므로 하나하나 바꿔 보시면 됩니다.

61646D696E이네요. 이 숫자가 admin을 16진수로 바꾼 값입니다.

그런데 그냥 입력하면 16진수인지 그냥 숫자인지 컴퓨터가 판별을 못합니다. 그래서 앞에 0x를 붙여 16진수임을 알립시다.

네 이것으로 문제풀이를 마치겠습니다. 참고로 굳이 16진수값이 아니고 2진수로 admin을 표현하셔도 됩니다. 다만 2진수로 하면 너무 길어지기 때문에 여기선 16진수로 했습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
webhacking - 36번 문제  (0) 2015.07.30
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 21번 문제를 풀어보겠습니다.

홈페이지로 들어가 21번 문제를 눌러주세요.

초기화면입니다. 칸이 있고 제출버튼과 결과버튼이 보이는군요. 일단 임의로 값을 넣어봅시다.

1을 넣었을때의 값입니다. true가 나오는군요. 그래서 1~10까지 넣어보았습니다.

1과 2는 참이었지만 3부터는 false가 나오더군요. 숫자는 시험해봤으니 이제는 영어로 넣어봅시다.   ... 영어는 false가 나오는 것을 알 수 있습니다. 즉 ture가 되는 값은 아직까진 1과 2이군요. 소스를 한 번 봅시다.

음? 별다른 내용이 없습니다. 이건 뭐 문제도 없고 풀 방법이 안보입니다. 어떻게 해야할까요?

다시한번 1을 제출해봅시다. 그리고 주소창을 봅시다.

no값이 1이 주어졌으며 뒤쪽의 id와 pw가 있습니다. 흠... 이번엔 2를 제출해봅시다.

no값이 2가 주어졌으며 뒤쪽의 id와 pw가 있는 것을 확인 할 수 있습니다.

이것을 보아하니 우리는 id와 pw가 존재한다는 것을 알 수 있습니다. 그리고 값이 없기 때문에 이 id와 pw의 값을 알아내야 한다는 것도 알 수 있습니다. 

sql이므로 id와 pw는 테이블에서 가져오겠지요. 테이블을 예상해보자면

no    id      pw

1     ?        ?

2     ?         ?

이런식으로 예상 할 수 있습니다. no의 값이 1과 2외에는 전부 거짓을 반환하기 때문에 no는 1과 2밖에 없습니다 .

자 여기서 우리는 쿼리문을 예상 할 수 있습니다.

$q = mysql_fetch_array(mysql_query(select no,id,pw from table where no=$GET_no))

if(!$q) echo false

else echo true

이렇게 말입니다. 쿼리문을 보시면 q가 입력받은 no값에 맞는 no.id.pw의 값을 가져옵니다.

그리고 그 q의 값을 반전시켜 참이면 false 거짓이면 true가 나오도록 하는 구조입니다.

만약 q값이 참인 상태에서 반전시키면 거짓이 되므로 true가 나올 것이고 q값이 거짓인 상태에서 반전시키면 참이 되기 때문에 false가 나올 것입니다. 그냥 쉽게 생각하시면 q가 참이면 true q가 거짓이면 false를 반환합니다. 값이 0이 아닌 값이면 참, 값이 0이면 ture를 반환합니다. 

만약 쿼리문이 저렇게 되있다면 테이블에 존재하는 no값을 입력했을 경우 그에 해당하는 no,id,pw가 반환되어 참을 출력할 것이고 테이블에 존재하지 않는 no값을 입력했을 경우 해당되는 것이 없기 때문에 거짓을 출력할 것입니다.

자 여기까지 왔으면 이제 공격기법을 쓸 차례입니다. 우리는 GET_no를 손댈 수 있으므로 적절히 바꿔서 id와 pw를 알아내 봅시다. 일단 no가 1인 id를 알아내봅시다.

1 and length(id)=1를 입력합시다. 이 조건문의 의미는 no값이 1이면서 id의 길이가 1인 조건이란 뜻입니다. 만약 id의 길이가 1이라면 참을 반환할 것이고 아니라면 거짓을 반환하겠지요. 아무래도 길이가 1은 아닌것 같습니다. 하긴 저같아도 길이를 1로 하진 않습니다.. 1이 안되니 2를 입력해보고 안되면 3 .. 이렇계 계속 해 봅시다. 그러면

5에서 true값이 나오는 것을 알 수 있습니다. 즉 no값이 1인 id의 길이는 5입니다. 그러면 이번엔 pw도 해봅시다.

pw의 길이도 5이군요. 그러면 이번엔 no값이 2인 id와 pw길이를 파악합시다.

2의 id도 길이가 5입니다.

???? no값이 2인 pw의 길이는 무려 19가 됩니다. 왤케 긴걸까요.. 물론 1부터 맞추느라 너무 힘들었습니다. 그러면 다시 테이블을 정리해 봅시다.

no    id      pw

1     ?(5)      ?(5)

2     ?(5)      ?(19)

네 이렇게 되는군요. 그런데? id글자수가 5개면 생각나는게 딱 하나 있죠. admin(관리자)입니다. 즉 no의 1과 2 둘중 하나의 id는 admin입니다. admin을 찾아내기 위해 쿼리문을 제출해봅시다. 

1 and ascii(substr(id,1,1))=97를 입력해줍시다.

ascii는 문자를 해당 아스키값으로 바꿔주는 함수이구요. substr는 문자열 중에서 특정 시작부분과 끝부분 사이의 문자열을 추출 하는 값입니다. 즉 위의 substr은 id에서 1번째 문자 1개를 추출하라라는 소리입니다. 즉 이 문구는 no가 1인 id의 첫글자가 a인지 아닌지 판별하는 문구입니다. 

아니라는군요. 그러면 2로 함 해봅시다.

true값이 나오는 군요. 아무래도 2의 id는 admin인것 같습니다. 다만 확인을 위해 두번째 글자도 살펴봅시다.

참이 뜨는군요. admin이 확실합니다.

no    id      pw

1     ?(5)      ?(5)

2     admin    ?(19)

그런데 admin의 패스워드를 보니까 길이가 장난이 아닙니다. 아무래도 이 admin의 패스워드가 이 문제의 정답이 되지 않을까 생각이 드는군요. 그런데 이번 pw는 짐작가는 것이 없습니다. 즉 2 and ascii(substr(pw,1,1))=1 부터 2 and ascii(substr(pw,1,1))=127까지 찾아야 합니다. ㅎㄷㄷ 게다가 이렇게 했는데 고작 첫번째 글자하나 맞출 뿐입니다.

그다음은 2 and ascii(substr(pw,2,1))=1 부터 2 and ascii(substr(pw,2,1))=127까지 하고.. 그렇게 쭉 하다가 2 and ascii(substr(pw,19,1))=127까지 한다면 사람이 미쳐버립니다.

우리는 이런 노가다를 하기가 불가능 하므로 코드를 하나 짜서 할 필요가 있습니다.

[출처] substr() 사용하기|작성자 길당

우리는 이럴때 프로그램을 사용해봅시다. 파이썬이란 프로그램입니다.

원래 코드를 짠다는 것이 프로그래밍을 한다는 뜻입니다. 프로그래밍은 손이나 눈으로 할 수 있는 일들을 더 빨리 처리하기 위해 사용되지요. 프로그래밍이라 하면 대부분 c언어를 생각합니다만 사람들이 소스를 짤때에는 간단하고 쉽게 짜길 원하기 때문에 프로그램을 많이 씁니다. 그래서 그 중 유명한 프로그램인 파이썬을 사용해보겠습니다

홈페이지로 가서 받으시면 됩니다. 2.7.10버전을 눌러 받아주시기 바랍니다.

설치가 완료되었으면 실행시켜 봅시다.

IDLE를 누르면 다음과 같이 창이 뜹니다. 자 우리는 소스를 만들어야 하므로 file - new file을 눌러주세요.

새창이 떳으면 다음과 같이 적어줍시다.

이 소스는 사실 가져온것입니다. 그래서 해석은 따로 하지 않겠습니다. 사실 못합니다..

잘보이지 않는 분을 위해 글자로 써놓겠습니다.

import socket

import re


pw=""

my_cookie="자신의 phpsessid값"


host="Host: webhacking.kr\n"

cookie="Cookie: PHPSESSID=%s\n\n" % my_cookie


web = 'webhacking.kr'

ip = socket.gethostbyname(web)


socket.setdefaulttimeout(5)


for i in range(1,20): 

    s = socket.socket()

    s.connect((ip, 80))

    for j in range(48,58):

        head1="GET /challenge/bonus/bonus-1/index.php?pw=&id=&no=if((select(ord(substr(pw,("

        head2="%d" % i

        head3="),1)))in("

        head4="%d" % j

        head5=")),2,3) HTTP/1.1\n"

        s.send(head1+head2+head3+head4+head5+host+cookie)

        aa=s.recv(1024)

        print("i: %d, j: %d (%s)") % (i, j, chr(j))

        find = re.findall("True</b>",aa)


        if find:

            pw+=chr(j)

            print "find pw: " + pw

            break

        if j == 126:

            s.close()

            print "Password is %s" %(pw)

            exit()

위의 my cookie의 값은 우리가 로그인을 하고 21번문제에 들어왔을때의 phpsessid값입니다. 

이 값을 줘야 파이썬이 나의 계정으로 로그인 되어있는 상태로 접속을 합니다.

지금 저 소스는 i가 1에서 20까지 한다는 군요. 즉 i값이 20이 되는 순간 종료가 됩니다. 우리는 19번 까지 패스워드를 구해야 하므로 20까지 하는 것이 맞습니다. 그리고 그 밑의 j의 범위는 48에서 58까지라고 되어있네요. 아스키코드로 48은 0이고 57은 9입니다. 범위를 48에서 57까지로 해놓으면 57이 되었을때 종료가 되버리기 때문에 9를 검사하지 않습니다. 그래서 1을 더한 58까지로 지정해놓았습니다. 값을 찾으면 찾은 값을 문자화시켜 출력하라고 되어있네요. 최종적으로 값을 수정하셨으면 py의 확장자로 저장을 한 후 F5번을 눌러 실행시킵시다

그러면 아래와 같이 뜹니다.

아무래도 패스워드는 숫자가 아닌것 같습니다. 그러면 이번엔 대문자로 맞춰봅시다.

수정을 하고 결과를 봅시다.

패스워드엔 숫자와 대문자가 안들어가는 것 같습니다. 이번엔 소문자로 해봅시다.

오호 한글자씩 출력이 되더니 마지막엔 19글자가 나오는것을 볼수 있습니다. 저것이 바로 admin의 패스워드입니다. 문제의 정답일지도 모르니 한번 auth에 인증을 해봅시다.

네 이것으로 문제풀이를 마치겠습니다. 소스를 공유하신 분께  감사의 말씀을 전합니다. 

'Webhacking' 카테고리의 다른 글

webhacking - 61번 문제  (0) 2015.08.07
webhacking - 49번 문제  (0) 2015.08.07
webhacking - 46번 문제  (0) 2015.08.01
webhacking - 36번 문제  (0) 2015.07.30
webhacking - 35번 문제  (0) 2015.07.29
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 46번 문제를 풀어보겟습니다.

홈페이지로 들어가 46번 문제를 눌러주세요.

또 sql문이군요. 쿼리 전송을 해봅시다.

뭐라고 뜨는군요. 일단 소스를 봅시다.

index.phps가 있네요. 함 들가봅시다. 

당연히 solve부터 봐야 합니다.  q[0]=="admin"이면 해결된다네요. 위의 if문을 한번 봅시다.

q의 값과 get[lv]의 값이 들어왔을 경우 아래의 문구를 출력한다는군요.

$q[0] information<br><br>money : $q[1]

그런데 아까 우리가 레벨1을 전송시켰을때 문구가 하나 떳지요? 다시 한번 봅시다.

zzibong information

money : 10000

음 보니까 get[lv]의 값이 1일경우 q[0]의 값은 zzibong가 되구요. q[1]의 값은 10000이 되네요.우리는 이 q[0]의 값은 admin이으로 만들어야 합니다. 어떻게 해야 할까요?

일단 level값에 1이 아닌 다른 수를 입력해 보았습니다. 그런데 어떠한 값을 넣어도 1외에는 별 내용을 출력하지 않니다. 일단 바로 위의 q를 한번 봅시다.

$q=@mysql_fetch_array(mysql_query("select id,cash from members where lv=$_GET[lv]"))

mysql_fetch_array는 앞의 문제에서도 설명했다시피 DB의 레코드셋을 php배열로 가져오는 함수입니다. 레코드셋이란 레코드들의 집합이지요.  mysql_query는 sql문을 실행하는 함수이구요. 뒤쪽의 문구를 보면 id와 cash를 검색하라고 나와있습니다. 

뒤쪽의 where이 있는걸로 보아 대충 조건에 맞는 아이디와 cash를 검색하라는 것 같습니다.

그런데 우리는 get[lv]에만 손댈 수 있습니다. 그러니까 이 값을 지정하여 admin인 id를 불러와야 합니다. 아까 쿼리전송 하신분은 아시겠지만 lv의 값은 1외에는 아무 문구도 안뜹니다. 즉 lv1의 아이디는 zzibong이고 그외에는 없다는 것이지요. 그렇기 때문에 lv에 상관없이 id가 admin인 것을 불러 와야 합니다. 그렇게 할려면 다음과 같이 되야 합니다.

where lv=0 or id='admin'

이것이 무슨 뜻이나면 where 다음조건을 만족시키는 것을 검색하라

조건은 lv=0 이거나 id가 admin인 id를 가져와라 라는 뜻입니다. lv의 값은 1외에는 없기 때문에 or을 붙여 앞의 lv조건을 무효화 시킨 것입니다. or이기 때문에 lv값이 틀려도 그 다음의 조건이 만족하면 장땡이기 때문입니다. 그 다음의 조건은 id가 admin인것입니다. 이렇게 해서 admin인 id를 불러올 수 있습니다. 그러면 이제 저것을 그대로 대입하면 되느냐구요? 

그렇게 되면 참 좋겠습니다만... 안되네요.

이유는 몇가지가 있지요. 일단 소스를 다시 한번 보시면

$_GET[lv]=str_replace(" ","",$_GET[lv]);

가 있습니다. 이것은 입력받은 lv의 값중 띄어쓰기가 있을경우 그 뛰어쓰기를 무효화 시킨다는 소리입니다. 즉 우리가 입력하려는 lv=0 or id='admin'에는 띄어쓰기가 있으니 그 띄어쓰기를 무효화 시킨다는 것이지요. 그래서 우린 이것을 우회하기 위해 %0a를 씁시다.

그러면 lv=0%0aor%0aid='admin'가 됩니다. 그래서 이것을 그대로 넣었는데 또 되지 않았습니다. 문법이 틀린 것은 아닌데 말입니다. 그러면 역시 그거 하나밖에 없죠.

앞 문제에서 설명했다시피 php에는 magic_quotes_gpc라는 함수가 존재한답니다. 이 함수는 '(홑따옴표), "(큰따옴표), \(이스케이프), %00(null) 값에 대해 앞에 \ 문자를 붙임으로써 공격을 방지하는 기능을 가지고 있답니다. 만약 이 함수가 실행되었다면 우리가 입력한 '의 앞에 이스케이프가 붙게 되서 결국 에러가 생겨버립니다. 즉 우리는 '를 대신할 만한 것을 써야합니다. 앞에서 썻던 함수 char을 또 쓰겠습니다.

 lv=0%0aor%0aid=char(97,100,109,105,110)가 되겠네요. lv값에 넣는거니 lv를 빼면 

정답은 0%0aor%0aid=char(97,100,109,105,110)가 되겠네요. 넣어줍시다. 참고로 앞의 숫자는 0이든 1이든 3이든 상관없습니다. 버리는 조건이니까요.

컨트롤c를 눌러 복사해서 붙여넣었더니 숫자만 붙여넣기가 되었습니다. 그래서 일일이 입력해주었습니다.


.... 안되네요. 아무래도 칸에 넣어서는 안되는 모양입니다. 주소값을 봅시다.


분명 적은것과 다르게 lv값이 바뀝니다. 그래서 이번엔 직접 주소창에 적어보겠습니다.


엔터를 쳐줍시다.


네 이것으로 문제풀이를 마치겠습니다.




'Webhacking' 카테고리의 다른 글

webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 36번 문제  (0) 2015.07.30
webhacking - 35번 문제  (0) 2015.07.29
webhacking - 32번 문제  (0) 2015.07.29
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 36번 문제를 풀어보겠습니다.

홈페이지로 들어가 36번 문제를 눌러주세요.

vi와 blackout가 적혀있네요. 일단 소스를 봅시다.

... 진짜 아무것도 없습니다. 말 그대로 글자만 적혀있네요.

일단 힌트부터 봅시다. blackout은 정전이란 뜻입니다. 그런데 vi뜻을 잘 모르겟군요.

그래서 인터넷에 검색을 했더니 아래와 같은 연관어가 떳습니다.

블랙아웃은 정전입니다. 이것은 아마 도중에 꺼졌다는 의미일 것입니다. 즉 vi는 프로그램일수 있습니다. 그래서 vi 편집기가 vi일 것 같습니다.

해석을 하면 vi를 쓰는데 도중에 정전이 난 것 같습니다. 그런데 vi는 작성중에 비정상으로 종료되었을 때 작성 중이던 파일명에 확장자가 swp인 파일이 추가 생성됩니다.

즉 우리가 파일을 작성하다 정전 때문에 파일이 다 날라간 것 같군요. 그런데 vi 에 의해 swp파일이 추가 생성되었고 우리는 그 파일을 불러와야합니다. 

무슨 파일을 작성하고 있었을까요? 보통 문제를 작성하고 있지 않았을까 하고 저는 생각합니다. 문제는 다들 아시다시피 index.php입니다. 자 그럼 주소창에 한번 적어 봅시다.

.index.swp 

앞에 왜 마침표를 찍는지 궁금한 분들이 있으실텐데 원래 vi가 리눅스 편집기 입니다.

리눅스에서는 숨겨진 폴더나 파일 이름 앞에는 마침표가 붙습니다. 예기치 못한 상황으로 생긴 파일이므로 임시파일일 것이고 임시파일은 대부분 숨겨진 파일입니다. 그럼 입력해봅시다.

에러가 나는 군요. 음.. 그래서 .index.php.swp를 적어 보았습니다.

굿이 뜨는군요. 그리고 password=md5("$_SERVER[REMOTE_ADDR] 라고 적혀있네요.

자기의 ip주소와 뒤의 문구를 md5화 시켜라. 정말 간단하네요.

md5를 시켰으면 auth에 가서 인증해 줍시다. 

ip dlseprtmvpdlwlfmfquswhgkwkglgl = 한꺼번에 md5

네 이것으로 문제풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
webhacking - 35번 문제  (0) 2015.07.29
webhacking - 32번 문제  (0) 2015.07.29
webhacking - 56번문제  (1) 2015.07.19
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 35번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 35번 문제를 눌러주세요.

문제를 낸 사람은 HellSonic분인 것 같네요. 일단 index.phps를 눌러봅시다.

당연하지만 이런 소스에서는 solve를 먼저 봐야 합니다. 

if($admin_ck[ip]==$_SERVER[REMOTE_ADDR])
{

@solve();

admin_ck[ip]의 값이 SERVER[REMOTE_ADDR] 라면 해결된다는 군요. SERVER[REMOTE_ADDR]는 자신의 ip주소를 불러오라는 함수입니다.

그러면 admin_ck[ip]가 뭔지 알아야겠죠.

$admin_ck=mysql_fetch_array(mysql_query("select ip from challenge35_list where id='admin' and ip='$_SERVER[REMOTE_ADDR]'"));

mysql_fetch_array 이란 DB의 레코드셋을 PHP배열로 가져오는 함수입니다. 레코드셋이란 쉽게 말하면 레코드들의 집합이라 보시면 됩니다. 그렇다면 가져올려는 레코드셋을 한 번 봅시다.

mysql_query("select ip from challenge35_list where id='admin' and ip='$_SERVER[REMOTE_ADDR]'")

mysql_query는 php에서 데이터베이스(MySQL)에게 SQL 명령어를 실행시키기 위해서 쓰는 함수입니다. 명령문을 보시면 select ip = ip를 검색하라

from challenge35_list = challenge35_list란 테이블에서, where은 조건입니다. 그렇다면

id가 admin이고 ip가 SERVER[REMOTE_ADDR]인 ip를 challenge35_list에서 검색한 값을 php배열로 가져온다 라는 뜻이 되겠네요. 여기까지 됐으면 자 이제 처음부터 차례대로 해석해봅시다.

if($_GET[phone])
{
if(
eregi("%|\*|/|=|from|select|x|-|#|\(\(",$_GET[phone])) exit("no hack");

eregi는 문자열을 찾는 함수입니다. phone값을 받았는데 이 값에서 

% * / = from select x - # ( 가 있을 경우 참을 반환하여 exit(no hack)를 실행한다는군요. 즉 우리는 phone값에 % * / from select (을 넣을 수 없습니다. 그 다음 걸 봅시다.

@mysql_query("insert into challenge35_list(id,ip,phone) values('$_SESSION[id]','$_SERVER[REMOTE_ADDR]',$_GET[phone])") or die("query error");

앞에 붙은 @는 함수의 오류를 출력하지 않겠다라는 소리입니다. 뒤의 query는 앞서 설명했다 시피 sql 명령어를 실행시키기 위한 함수입니다. 명령문을 보시면 insert = 삽입하라.

into challenge35_list(id,ip,phone) = challenge35_list테이블의 id,ip,phone 컬럼(필드)에

values('$_SESSION[id]','$_SERVER[REMOTE_ADDR]',$_GET[phone]) = $_SESSION[id]','$_SERVER[REMOTE_ADDR]',$_GET[phone]의 값을

즉 정리하면 challenge35_list테이블의 id,ip,phone 컬럼(필드)에 $_SESSION[id]','$_SERVER[REMOTE_ADDR]',$_GET[phone]의 값을 삽입하라는 소리입니다. 뒤의 or die("query error");는 앞의 명령이 실패했을 경우 query error를 내보내라 라는 뜻입니다.

이 함수가 다 끝나면 id는 id란 세션의 값, ip는 SERVER[REMOTE_ADDR]의 값 

phone에는 GET[phone]의 값이 들어가 있겠군요.

자 이제 해석이 끝났으니 정리를 해봅시다.

1. 해결을 위해서는 admin_ck[ip]의 값이 자신의 ip주소여야 한다.

2. admin_ck는 id가 admin인 자신의 ip주소를 가져온다.

3. id의 값에는 SESSION[id]의 값이 들어간다.

4. 우리가 만질 수 있는 부분은 GET[phone]뿐이다.

우리가 바꿀수 있는 부분은 GET[phone]인데 정작 우리는 id의 값을 바꿔야 합니다. 왜냐하면 id의 값이 admin인 자신의 ip주소를 갖고 오기 때문에 ip주소가 똑같아도 id값이 admin이 아니면 백날 가져오지 않습니다. 그러면 우리는 GET[phone]을 이용해 id의 값까지 바꿔봅시다. 이러한 문제를 풀 경우에는 특수문자가 거의 필수로 들어갑니다.

phone 값에 1),('admin','자신의 IP값',2

를 넣어줍시다. 데이터 유형이 문자유형일 경우 '를 입력해야 합니다. 숫자는 상관없습니다. 그러면

@mysql_query("insert into challenge35_list(id,ip,phone) values('$_SESSION[id]','$_SERVER[REMOTE_ADDR]',1),('admin','IP',2)") or die("query error"); 이렇게 되겠지요.

사실 values(값1,값2,값3)는 values(값1,값2,값3),(값4,값5,값6)으로 써도 작동이 됩니다.

다만 후자의 경우에는 값1,값2,값3이 먼저 들어가고 값4,값5,값6이 들어가기 때문에 값1,값2,값3은 덮어져 버립니다. 즉 값4,값5,값6만 남아있게 되는 것이지요. 이렇게 함으로써 우리가 id,ip,phone 값을 전부 수정할 수 있게 됩니다.

방금 쓴 것대로 넣어주시면 id에는 admin이 ip에는 자신의 ip주소가 들어가게 됩니다. 즉 문제가 해결되지요. phone값은 상관이 없으므로 아무거나 넣어주셔도 됩니다. 앞쪽 phone값도 어차피 덮어져 버리기 때문에 아무값이나 넣어도 상관없습니다.그러면 입력해봅시다.

음 쿼리에러가 떴네요. 문법은 맞습니다. 그럼 뭐가 문제일까요? no hack이 뜬게 아닌 걸로 보아 eregi에 걸린 것은 아닙니다. 

알아보니 php에는 magic_quotes_gpc라는 함수가 존재한답니다. 이 함수는 '(홑따옴표), "(큰따옴표), \(이스케이프), %00(null) 값에 대해 앞에 \ 문자를 붙임으로써 공격을 방지하는 기능을 가지고 있답니다. 만약 이 함수가 실행되었다면 우리가 입력한 

1),('admin','자신의 IP값',2 의 값은 1),(\'admin\',\'자신의 IP값\',2 이 되버려 쿼리에러가 되버립니다. 그렇다면 '를 대체할 무언가가 필요합니다. '는 문자를 입력하기 위한 기호이니까 '대신 문자를 쓸 수 있도록 해주는 것을 써야 합니다. 바로 char함수이죠. char함수는 아스키코드를 문자로 바꿔주는 함수입니다. 즉 id의 admin도 아스키코드로 써야 하며 자신의 ip주소도 아스키코드로 써야합니다. 참고로 .은 46입니다. 자 그럼 아래와 같이 써주세요.

add 버튼을 눌러주세요.

네 이것으로 문제풀이를 마치겠습니다.




'Webhacking' 카테고리의 다른 글

webhacking - 46번 문제  (0) 2015.08.01
webhacking - 36번 문제  (0) 2015.07.30
webhacking - 32번 문제  (0) 2015.07.29
webhacking - 56번문제  (1) 2015.07.19
webhacking - 47번 문제  (0) 2015.07.17
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 32번 문젤플 풀어보겠습니다. 홈페이지로 들어가 32번 문제를 눌러주세요.

순위 이름 히트가 나오네요. 밑으로 쭉 내려봅시다.

내리시면 조인버튼이 있습니다. 한 번 눌러봅시다.

자신의 id가 나오고 그다음 원상태로 돌아갑니다. 음.. 목록에 제 아이디가 생긴걸로 보아 가입하는 버튼이었던 것 같습니다. 무슨 문제일까요? 이번엔 목록에 있는 아이디를 눌러봅시다.

아니라는군요... 그러면? 자신의 id를 한 번 눌러봅시다.

그래도 no가 뜨는군요. 음 어떻게 푸는 걸까요?

오른쪽에 보시면 0/100인 부분이 보입니다. hit라고 하는데 hit가 누르다 또는 밟다 라는 뜻도 있습니다. 아무래도 저 횟수는 아이디를 누른횟수인 것 같습니다. 그런데 아무리 눌러도 no만 뜨면서 카운트가 되지 않습니다. 소스보기를 눌러 소스를 보았지만 별다른 함수는 찾지 못했습니다. 소스에서 별다른 것을 찾지 못했을 경우에는 쿠키를 한 번 찾아봐야 합니다. 쿠키를 눌러봅시다.

다른 건 전부 값이 못알아먹는 값이나 숫자로 되있는데 이 쿠키 혼자만 ok가 값이

나와있군요. 만약 hit가 안되는 이유가 이 값때문이라면 이 값을 지우고 한번 자기 id를 눌러보겠습니다.

오호 no칸이 안뜨고 0/100에서 1/100이 되는 것을 알 수 있습니다. 쿠키값을 확인해보니 다시 또 값이 ok가 되어있습니다. 그래서 지우고 또 해보았습니다.

하나가 더 증가되는 것을 볼 수 있습니다. 다른 값을 넣어도 되는 걸로 보아 ok가 아닌 값만 넣어도 hit가 증가하는 모양이더군요. 이제 히트수를 100 채우면 됩니다(...)

일일이 쿠키창에 들어가 값을 바꾸기 귀찮으니 주소창에 적어서 값을 바꿉시다.

javascript:alert(document.cookie="vote_check=0")

이러고 다시 누르면 hit가 채워집니다.

그냥 쿠키에디터에서 바꾸는것이 빠르겠네요. 주소창에는 javascript가 복사가 안됩니다.ㅜㅜ

12퍼 정도 했구요

절반 했습니다.헉헉

조금만 더..

100을 다 채우니 문제가 해결됐다고 하는군요. 

이것으로 문제풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

webhacking - 36번 문제  (0) 2015.07.30
webhacking - 35번 문제  (0) 2015.07.29
webhacking - 56번문제  (1) 2015.07.19
webhacking - 47번 문제  (0) 2015.07.17
Webhacking - 33번 문제  (2) 2015.07.11
Posted by englishmath
,