33번 문제
코드를 보자.
<hr>
Challenge 33-1<br>
<a href=index.txt>view-source</a>
<hr>
<?php
if($_GET['get']=="hehe") echo "<a href=???>Next</a>";
else echo("Wrong");
?>
?get=hehe하면
Next가 생긴다. Next를 누르면
다시 제자리로 돌아온 것 같지만? lv2.php로 왔다.
<hr>
Challenge 33-2<br>
<a href=lv2.txt>view-source</a>
<hr>
<?php
if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
else echo "Wrong";
?>
post방식으로 post와 post2변수가 hehe와 hege2이면 Next가 뜬다. 버프슈트를 이용하여 메소드방식을 post방식으로 변경 후 보냈다.
<hr>
Challenge 33-3<br>
<a href=33.txt>view-source</a>
<hr>
<?php
if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
GET방식으로 myip와 내 ip와 같으면 넘어간다. ?myip=내ip로 보냈다.
<hr>
Challenge 33-4<br>
<a href=l4.txt>view-source</a>
<hr>
<?php
if($_GET['password'] == md5(time())) echo "<a href=???>Next</a>";
else echo "hint : ".time();
?>
password 와 md5(time())한 값이 같아야한다. hint로 time()값을 알려주나 이 time()은 시간이 지날수록 계속 증가한다. 따라서 임의로 증가한 수로 md5 복호화를 진행하면 되겠다.
<hr>
Challenge 33-5<br>
<a href=md555.txt>view-source</a>
<hr>
<?php
if($_GET['imget'] && $_POST['impost'] && $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
버스 슈트를 이용해서 GET방식으로 imget을 넘기고 POST방식으로 impost를 넘긴 뒤 COOKIE도 imcookie 넣어주자.
<hr>
Challenge 33-6<br>
<a href=gpcc.txt>view-source</a>
<hr>
<?php
if($_COOKIE['test'] == md5($_SERVER['REMOTE_ADDR']) && $_POST['kk'] == md5($_SERVER['HTTP_USER_AGENT'])) echo "<a href=???>Next</a>";
else echo "hint : {$_SERVER['HTTP_USER_AGENT']}";
?>
COOKIE['test']값이 내 ip주소를 md5로 해싱한 값과 같고 POST방식으로 전송된 kk변수 값이 내 웹정보를 md5로 해싱한 값과 같아야 다음으로 간다. 버프 슈트를 이용해서 보내보자.
<hr>
Challenge 33-7<br>
<a href=wtff.txt>view-source</a>
<hr>
<?php
$_SERVER['REMOTE_ADDR'] = str_replace(".","",$_SERVER['REMOTE_ADDR']);
if($_GET[$_SERVER['REMOTE_ADDR']] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong<br>".$_GET[$_SERVER['REMOTE_ADDR']];
?>
내 ip에서 "."와 ""를 replace함수로 필터링한 것을 변수에 넣는다. 그 다음 GET방식으로 127001=127001 이런 형식으로 똑같이 보내주면 된다.
<hr>
Challenge 33-8<br>
<a href=ipt.txt>view-source</a>
<hr>
<?php
extract($_GET);
if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
if($addr == "127.0.0.1") echo "<a href=???>Next</a>";
else echo "Wrong";
?>
그냥 ?addr=127.0.0.1로 보내주면 된다.
<hr>
Challenge 33-9<br>
<a href=nextt.txt>view-source</a>
<hr>
<?php
for($i=97;$i<=122;$i=$i+2){
$answer.=chr($i);
}
if($_GET['ans'] == $answer) echo "<a href=???.php>Next</a>";
else echo "Wrong";
?>
$answer변수에 아스키코드를 문자로 변환 후 문자열을 만드는 반복문이다. 반복문을 통해 얻은 값을 ?ans=얻은 값 보내면 되겠다. 위에 반복문을 파이썬에 맞춰 변경하였다.
answer = ""
for i in range(97, 123, 2) :
answer += chr(i)
print(answer)
acegikmoqsuwy값을 얻었으니 ?ans=acegikmoqsuwy를 보낸다.
<hr>
Challenge 33-10<br>
<a href=forfor.txt>view-source</a>
<hr>
<?php
$ip = $_SERVER['REMOTE_ADDR'];
for($i=0;$i<=strlen($ip);$i++) $ip=str_replace($i,ord($i),$ip);
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
$answer = $ip*2;
$answer = $ip/2;
$answer = str_replace(".","",$answer);
$f=fopen("answerip/{$answer}_{$ip}.php","w");
fwrite($f,"<?php include \"../../../config.php\"; solve(33); unlink(__FILE__); ?>");
fclose($f);
?>
$ip 변수값에 내 ip를 넣는다. ip값의 정수를 아스키코드로 변환한 뒤에 str_replace함수를 통해서 "."과 ""를 필터링 한다. 그 후 substr함수로 필터링한 값에 앞 10자리를 담는다. 그리고 $answer 변수에 ip변수 값에 *2하고 /2를 한다? 왜이래.. 하여튼 그리고 str_replace함수를 통해 "." 과 ""를 필터링 한 뒤의 값을 $answer에 담는다. 이 값이 php의 값에 쓰인다.
https://webhacking.kr/challenge/bonus-6/answerip/27577577575_5515515515.php
해결했다.
34번 문제
들어가자마자 debug me가 뜬다.
소스 코드를 확인했는데
<html>
<head>
<title>Challenge 34</title>
<script>
var a=['RcOhTDV1Ew==','McOVwqpRBg==','c8K/w43DvcK8','SsOrTCF1CVDCgcKLEsKc','NsK/w4Bc','G1TDpwk=','AcKtwqfDlW7Dsw==','e3kkcQJfwoNFDEU9','QMOXDBo=','w5bCsWlh','eWY6bg8=','FnbDoEvDtl1LUkB7w4Q=','esOZTiPDsg==','bzfCkFfCtA==','ZmzDjHcn','PxLCm3LDvA==','IcKlVy9pw57DgMK3w6kmwpvCiUnDhcOKw4A=','LMKnwqECawEeEMOZQsK7wrLCscKpSG1AwqvDvjnDpMKhOSDCqQfDmVRowo1nwpzCh8OGc1vDv3cKVR/CgMK4w7PCukbCv8O8woNHXcK7SsOmMhHDnUEJw4lsw6g=','wrTDnltl','UMOXHRs=','Tz0lw48=','O8K0w5JcwrA=','w5DCpnx/LA==','HsKrS8KVQw==','dcKvfnkhUQ3DncOFIsOew5lHwr7CjcKYAsOuwrc3UjhfwopNwqwuWcOjw4PDrkIRWAfCnSIdw5jDtsKyWFBMwq4YMQvDhRrCrlBlw71LUR5HGMKwEBs=','w4RAw5xg','RkQSNA==','SsOsQztv','wonDvMOwwow=','wovDlMKvw5nCog==','w73Ch8K5VcK/','wpN7HsOMwpI=','w5/CuMKDacOKPcKoB3jDomQ=','wpnDvMOhwo0=','wp4xwrvDvA==','H1LDrhc=','wo86woHDm37Dow==','woY4wobDmg==','wr/CgMKQNcOo','ecOlUSF2S3fCsMKbGQ==','E3nCrcKe','w5d5w6HDnsOFw7RcRFjDosKsZ8OHEcOv','QMOXDBrCrcKLwp3DvA==','w5fDsiPDrsOf','V3c3A0Q=','E8OjwpNaP1lDTMKXcsO5','G08JPDZMw5s8w4ITw54dEMKAwps=','wo8pwoXDnmg=','wpo5wqvDoMOQw6Jd','bH4+TyM='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};var g=function(){var h={'data':{'key':'cookie','value':'timeout'},'setCookie':function(i,j,k,l){l=l||{};var m=j+'='+k;var n=0x0;for(var n=0x0,p=i['length'];n<p;n++){var q=i[n];m+=';\x20'+q;var r=i[q];i['push'](r);p=i['length'];if(r!==!![]){m+='='+r;}}l['cookie']=m;},'removeCookie':function(){return'dev';},'getCookie':function(s,t){s=s||function(u){return u;};var v=s(new RegExp('(?:^|;\x20)'+t['replace'](/([.$?*|{}()[]\/+^])/g,'$1')+'=([^;]*)'));var w=function(x,y){x(++y);};w(e,d);return v?decodeURIComponent(v[0x1]):undefined;}};var z=function(){var A=new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');return A['test'](h['removeCookie']['toString']());};h['updateCookie']=z;var B='';var C=h['updateCookie']();if(!C){h['setCookie'](['*'],'counter',0x1);}else if(C){B=h['getCookie'](null,'counter');}else{h['removeCookie']();}};g();}(a,0xa2));var b=function(c,d){c=c-0x0;var e=a[c];if(b['clOwyu']===undefined){(function(){var f=function(){var g;try{g=Function('return\x20(function()\x20'+'{}.constructor(\x22return\x20this\x22)(\x20)'+');')();}catch(h){g=window;}return g;};var i=f();var j='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';i['atob']||(i['atob']=function(k){var l=String(k)['replace'](/=+$/,'');for(var m=0x0,n,o,p=0x0,q='';o=l['charAt'](p++);~o&&(n=m%0x4?n*0x40+o:o,m++%0x4)?q+=String['fromCharCode'](0xff&n>>(-0x2*m&0x6)):0x0){o=j['indexOf'](o);}return q;});}());var r=function(s,d){var u=[],v=0x0,w,x='',y='';s=atob(s);for(var z=0x0,A=s['length'];z<A;z++){y+='%'+('00'+s['charCodeAt'](z)['toString'](0x10))['slice'](-0x2);}s=decodeURIComponent(y);for(var B=0x0;B<0x100;B++){u[B]=B;}for(B=0x0;B<0x100;B++){v=(v+u[B]+d['charCodeAt'](B%d['length']))%0x100;w=u[B];u[B]=u[v];u[v]=w;}B=0x0;v=0x0;for(var C=0x0;C<s['length'];C++){B=(B+0x1)%0x100;v=(v+u[B])%0x100;w=u[B];u[B]=u[v];u[v]=w;x+=String['fromCharCode'](s['charCodeAt'](C)^u[(u[B]+u[v])%0x100]);}return x;};b['wxbdQn']=r;b['ZjQald']={};b['clOwyu']=!![];}var D=b['ZjQald'][c];if(D===undefined){if(b['XvSLaK']===undefined){var E=function(F){this['swkpev']=F;this['DGOTpS']=[0x1,0x0,0x0];this['zlbdZJ']=function(){return'newState';};this['KCuPKs']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';this['AnZPoE']='[\x27|\x22].+[\x27|\x22];?\x20*}';};E['prototype']['DCDTIR']=function(){var G=new RegExp(this['KCuPKs']+this['AnZPoE']);var H=G['test'](this['zlbdZJ']['toString']())?--this['DGOTpS'][0x1]:--this['DGOTpS'][0x0];return this['ZjMdYn'](H);};E['prototype']['ZjMdYn']=function(I){if(!Boolean(~I)){return I;}return this['LqSTke'](this['swkpev']);};E['prototype']['LqSTke']=function(J){for(var K=0x0,L=this['DGOTpS']['length'];K<L;K++){this['DGOTpS']['push'](Math['round'](Math['random']()));L=this['DGOTpS']['length'];}return J(this['DGOTpS'][0x0]);};new E(b)['DCDTIR']();b['XvSLaK']=!![];}e=b['wxbdQn'](e,d);b['ZjQald'][c]=e;}else{e=D;}return e;};var e=function(){var c=!![];return function(d,e){var f=c?function(){if(e){var g=e['apply'](d,arguments);e=null;return g;}}:function(){};c=![];return f;};}();var Q=e(this,function(){var c=function(){return'\x64\x65\x76';},d=function(){return'\x77\x69\x6e\x64\x6f\x77';};var e=function(){var f=new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');return!f['\x74\x65\x73\x74'](c['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var g=function(){var h=new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');return h['\x74\x65\x73\x74'](d['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var i=function(j){var k=~-0x1>>0x1+0xff%0x0;if(j['\x69\x6e\x64\x65\x78\x4f\x66']('\x69'===k)){l(j);}};var l=function(m){var n=~-0x4>>0x1+0xff%0x0;if(m['\x69\x6e\x64\x65\x78\x4f\x66']((!![]+'')[0x3])!==n){i(m);}};if(!e()){if(!g()){i('\x69\x6e\x64\u0435\x78\x4f\x66');}else{i('\x69\x6e\x64\x65\x78\x4f\x66');}}else{i('\x69\x6e\x64\u0435\x78\x4f\x66');}});Q();var q=function(){var r=!![];return function(s,t){var u=r?function(){if(b('0x0','hezG')!==b('0x1','A6hd')){if(t){if(b('0x2','G(vo')===b('0x3','K*$C')){q(this,function(){var j=new RegExp(b('0x4','$VvG'));var k=new RegExp(b('0x5','2@LG'),'i');var l=H(b('0x6','k(C)'));if(!j[b('0x7','14cN')](l+'chain')||!k[b('0x8','aEot')](l+b('0x9','ln]I'))){l('0');}else{H();}})();}else{var z=t[b('0xa','$ybZ')](s,arguments);t=null;return z;}}}else{var f=r?function(){if(t){var g=t[b('0xb','C%Xw')](s,arguments);t=null;return g;}}:function(){};r=![];return f;}}:function(){};r=![];return u;};}();(function(){q(this,function(){var D=new RegExp('function\x20*\x5c(\x20*\x5c)');var E=new RegExp(b('0xc','RLUb'),'i');var F=H(b('0xd','iWKi'));if(!D[b('0xe','ho]6')](F+b('0xf','RLUb'))||!E[b('0x10','X!$R')](F+b('0x11','RUTX'))){if(b('0x12','J[i1')===b('0x13','Pa4(')){F('0');}else{(function(){return!![];}[b('0x14','kK4Z')](b('0x15','X!$R')+b('0x16','llaF'))[b('0x17','3R^0')](b('0x18','iUmC')));}}else{H();}})();}());setInterval(function(){H();},0xfa0);if(location[b('0x19','iUmC')][b('0x1a','6]r1')](0x1)==b('0x1b','RLUb'))location[b('0x1c','4c%d')]=b('0x1d','llaF');else alert(b('0x1e','14cN'));function H(I){function J(K){if(b('0x1f','oYXf')!==b('0x20','ho]6')){return J;}else{if(typeof K==='string'){return function(M){}[b('0x21','2@LG')](b('0x22','joDm'))[b('0x23','iUmC')](b('0x24','llaF'));}else{if('thtMU'===b('0x25','Am%6')){if((''+K/K)[b('0x26','RLUb')]!==0x1||K%0x14===0x0){if(b('0x27','2@LG')!==b('0x28','bO4C')){return!![];}else{(function(){return!![];}[b('0x29','RLUb')](b('0x2a','ln]I')+b('0x2b','3R^0'))['call'](b('0x2c','c3hQ')));}}else{(function(){return![];}[b('0x2d','Am%6')](b('0x2e','14cN')+b('0x2f','$ybZ'))[b('0x30','Am%6')](b('0x31','O!T!')));}}else{H();}}J(++K);}}try{if(I){return J;}else{J(0x0);}}catch(P){}}
</script>
</head>
<body bgcolor="black">
뭐.. 이런식이다. debug me가 뜬 것을 찾기 위해 alert를 검색해봤다.
alert(b('0x1e','14cN')) 찾았다. 확인을 위해 콘솔에 넣어보니
아까 나를 반겨준 친구가 맞다. 이 alert은 else일 때 발동했으니 그 앞에 조건문을 살펴보자.
if(location[b('0x19','iUmC')][b('0x1a','6]r1')](0x1)==b('0x1b','RLUb'))location[b('0x1c','4c%d')]=b('0x1d','llaF');else alert(b('0x1e','14cN'));
음.. 이것만봐서는 잘 모르겠다. 그래서 alert안에 b('0x1e','14cN')이런 내용식으로 if절에서도 같길래 비슷한 형식을 다 콘솔에 넣어봤다.
if절이 참일 때 location.href=./?Passw0RRdd=1 로 이동하는 것을 알 수 있었다. 그래서 ?Passw0RRdd=1을 입력해보니
해결했다.
50번 문제
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 50</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value='guest'><br>
pw : <input name=pw value='guest'><br>
<input type=submit> <input type=reset>
</form>
<?php
if($_GET['id'] && $_GET['pw']){
$db = dbconnect();
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
if(preg_match("/union/i",$_GET['id'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
if($result['lv']==1) echo("level : 1<br><br>");
if($result['lv']==2) echo("level : 2<br><br>");
}
if($result['lv']=="3") solve(50);
if(!$result) echo("Wrong");
}
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>
$result['lv']=="3"이면 해결되는 문제이다. addslashes함수가 뭘까 싶어 알아보니 매개변수로 넘겨준 문자열에 싱글쿼터('), 더블쿼터("), NULL바이트가 포함되어 있으면 문자 앞에 백슬래쉬(\)를 추가해주는 함수라고 한다. mb_convert_encoding함수는 mb_convert_encoding(문자열, 바꿀 인코딩, 현재 인코딩) 이렇게 사용한다. mb_convert_encoding에서 id 값을 받고 euc-kr인코딩에서 utf-8인코딩으로 변환한다. preg_match함수로 다양한 문자들을 필터링하고 있다.
where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')구문을 이용할 것이다. 우선 md5로 pw를 암호화하는 것을 방지하기위해 md5를 주석처리해야하는데 주석 중 #이나 --을 사용하면 뒤에가 모두 주석처리 되니 /* */을 사용할 것이다. 그러면 GET으로 받는 id값 마지막에 /*을 넣고 pw값 맨 앞에 */을 넣어준다면 그 사이에 있는 ' and pw=md5는 주석처리 될 것이다.
id 부분부터 다시 보면 id에 기본적으로 싱글쿼터(')가 하나 있어서 이것을 닫아줘야하는데 addslashes함수로 싱글쿼터(')가 필터링되니 백슬래쉬(\)앞에 멀티바이트를 입력하여 \멀티바이트 를 한 문자로 취급하여주는 것을 이용하여 우회한다(magic_guotes_gpc참고함) 즉, id=%a1'/*&pw=*/까진 완성. 이제 lv=3을 참으로 하기 위하여 union select 3#을 사용한다.union select 3#에서 공백을 사용하지 못하니 평소대로 %09를 사용하고 #도 %23으로 바꿔서 적용하면 union%09select%093%23이다. 앞에와 합치면 id=%a1'/*&pw=*/union%09select%093%23 이것을 보내보자!
해결했다.
51번 문제
소스 코드를 보면
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 51</title>
<style>
table{ color:lightgreen;}
</style>
</head>
<body bgcolor=black><br><br>
<font color=silver>
<center><h1>Admin page</h1></center>
</font>
<?php
if($_POST['id'] && $_POST['pw']){
$db = dbconnect();
$input_id = addslashes($_POST['id']);
$input_pw = md5($_POST['pw'],true);
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"));
if($result['id']) solve(51);
if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>";
}
?>
<br><br><br>
<form method=post>
<table border=0 align=center bgcolor=gray width=200 height=100>
<tr align=center><td>ID</td><td><input type=text name=id></td></tr>
<tr align=center><td>PW</td><td><input type=password name=pw></td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
<font color=silver>
<div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div>
</font>
</form>
</body>
</html>
addslashes함수에 POST방식으로 id를 받는다.md5로 POST방식으로 pw를 받은 값을 암호화하는데 두 번째 인자로 true가 있다. md5에 대해 알아보니 두 번째 인자를 적지 않으면 false가 들어가서 32자리의 md5해시값을 받는다. 근데 위 소스코드는 true를 두 번째 인자로 줬다. true가 두 번째 인자에 있으면 해시값이 바이너리 형태로 생성됨을 알았다. 공격을 수행하기위해서는 =이나 or 또는 or 1#정도를 사용할 수 있다. 이 중 =을 선택해서 파이썬 스크립트를 작성해보자.
import hashlib
find = [b"'='"]
for i in range(10000000) :
value = hashlib.md5(str(i).encode()).digest()
for j in find :
if j in value :
print('num : ' + str(i))
md5 raw hash에서 '='이 포함된 값을 얻었다. id에 admin을 적고 pw에 가장 첫번째인 1839431을 입력하여 제출했더니
해결했다. 사실상 이 문제는 혼자 풀었다고 할 수 없다. 수 많은 구글링을 하며 풀었다. 다른 방법은 없을까 또 알아보니 php로 작성해서 푸는 사람들도 있었다. php로 스크립트를 혼자 짜기엔 아직 부족해서 시도해보지 못했지만 이런 문제들도 자력으로 풀 수 있는 날이 언젠간 오겠지라는 생각으로 한 발자국 더 나아갔다고 생각한다.
54번 문제
?부분이 한 글자씩 움직이다가 ?에서 멈췄다. 변할 때마다 한 글자씩 출력되는 FLAG형식을 본 것 같다. 우선 소스 코드를 보자.
<html>
<head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id=aview></font></b></h1>
<script>
function run(){
if(window.ActiveXObject){
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
return new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {
return null;
}
}
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}else{
return null;
}
}
x=run();
function answer(i){
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",20);
if(x.responseText=="") aview.innerHTML="?";
}
setTimeout("answer(0)",1000);
</script>
</body>
</html>
aview.innerHTML=x.responseText; 이 부분을 통해서 한 문자씩 출력되는 것을 알 수 있었다. 그리고 왜 마지막에 ?에서 끝나는 지를 알 수 있는 부분을 발견했다. if(x.responseText=="") aview.innerHTML="?"; 부분이다. text가 없으면 남은 것들을 모두 지우고 ?를 출력한다. 그러면 위 if절을 지운 뒤 x.responseText에 하나 하나 저장하여 보면 되지 않을까? 개발자모드를 킨 후 if절을 지우고 += x.responseText;로 바꿔봤다.
FLAG값을 얻었으니 Auth가서 입력해보면
해결했다.
'Webhacking-Write-Up > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] 24, 25, 26, 27, 32 문제 (0) | 2023.01.13 |
---|---|
[Webhacking.kr] 16, 17, 19, 20, 23 문제 (0) | 2023.01.12 |
[webhacking.kr] 10, 11, 12, 14, 15 문제 (0) | 2023.01.12 |
[Webhacking.kr] 1,4,5,6,7 문제 (0) | 2023.01.12 |