[LOS] 11번 Golem 풀이

2019. 8. 6. 19:10문제풀이/los.rubiya.kr

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_golem 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_golem where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 
  highlight_file(__FILE__); 
?>

 

금지단어는 prob _ . () or and substr( =이고,

 

  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 

이 부분을 통해 문제는 brute-force attack으로 해결해야 함을 알 수 있다.

 

7번 orge 문제와 비슷하게 풀어보자!

7번 orge 문제였다면 pw으로

' || id='admin' && length(pw)<8--+
' || id='admin' && substr(pw,1,1)<9--+

와 같은 문장을 입력하였을 것이다. (&가 아니라 %26을 입력해야 하지만 보기 편하게!)

 

하지만 이번 문제는 substr( 과 = 이 필터링되므로, 다른 문자를 사용한다.

 

먼저 substr을 우회하기 위해서 사용 할 수 있는 것은 mid, left, right가 있다.

substr(pw,1,1)은 mid(pw,1,1), left(pw,1)과 같이 사용할 수 있다.

substr(pw,2,1)은 mid(pw,2,1)과 같이 쓸 수 있으며,

substr(pw,1,2)는 mid(pw,1,2), left(pw,2)와 같이 사용할 수 있다.

left와 right는 이름과 같이 해당 단어(pw)의 왼쪽에 위치한 문자를 찾는지, 오른쪽에 위치한 문자를 찾는지 차이다.

 

그리고 =을 우회하기 위해서는 like를 사용할 수 있다.

id = 'abc'은 (id) like 'abc'와 같이 쓸 수 있다.

 

코드를 돌린 결과 화면은 다음과 같다.

대소문자 구분이 안돼서 ㅠㅠㅠㅠ 대문자로 되어있는 답을 다 소문자로 변환하면 된다.

걍 다 소문자길래 대문자를 하나씩 소문자로 바꿔보는건 안 짰다.

 

비밀번호는 77d6290b

 

'문제풀이 > los.rubiya.kr' 카테고리의 다른 글

[LOS] 13번 bugbear 풀이  (0) 2019.08.07
[LOS] 12번 darkknight 풀이  (0) 2019.08.06
[LOS] 10번 skeleton 풀이  (0) 2019.07.31
[LOS] 9번 vampire 풀이  (0) 2019.07.31
[LOS] 8번 troll 풀이  (0) 2019.07.29