본문 바로가기
[보안]/[LOS]

[LOS] ORGE

by Hevton 2020. 12. 13.
반응형

 

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge"); 
  highlight_file(__FILE__); 
?>

저번 문제와 형식이 같은 blind sql Injection 문제.

 

필터링 : and 

우회 : && ( = %26%26)

 

&& 를 주소창에 그대로 입력하니 문자가 없어진다. && 뒤에 다른 내용을 입력하면 해당내용도 모두 없어진다. 다시 한번 생각해보면, URL의 메타문자로써 데이터를 이어주는 연결을 하는 문자가 바로 &이다. 그렇게 때문에 &문자를 메타문자로 인식하고 $_GET[pw]가 아닌 다음 데이터로 인식하고 $_GET[pw] 밖으로 넘겨버리기때문.

 

데이터 전송

ex ) id=admin&pw=good

 

 

이럴 때, 직접 &&를 주소창에 넣어주는게 아니라 &&을 데이터 형식으로 인식시키게끔 URL Encoding하여 %26%26로 보내주면 우리의 의도대로 전달할 수 있다. (&&를 그대로 넘겨주면 &가 데이터를 구분짓는 메타문자로 인식되기 때문에, 데이터로 인식되도록 Url Encoding된 값을 넘겨준다)


query : select id from prob_orge where id='guest' and pw='1'||id='admin' && length(pw)=8 && '1'
-> true
비밀번호 8자리.

 

 

이번엔 프로그램을 사용했다.


query : select id from prob_orge where id='guest' and pw='1'||id='admin' && ascii(substr(pw,x,1))=y && '1'


query : select id from prob_orge where id='guest' and pw='7b751aec'

반응형

'[보안] > [LOS]' 카테고리의 다른 글

[LOS] VAMPIRE  (0) 2020.12.13
[LOS] TROLL  (0) 2020.12.13
[LOS] DARKELF  (0) 2020.12.13
[LOS] WOLFMAN  (0) 2020.12.12
[LOS] ORC  (0) 2020.12.11