<script>alert(1);</script> 를 입력할 수 있다면 성공입니다.




숫자를 입력할 때는 그대로 뿌려주는데 문자를 2개 이상 입력하면 no hack이라면서 필터링 됩니다.

무슨 문자던 2개 이상 입력할 수 없다면 시도 자체가 불가능합니다.



하지만 생각해 볼 수 있는 내용은 단순히 문자열에 대해서 ereg, eregi 함수는 특정 시스템에서 우회가 가능합니다.

%00 즉 NULL을 이용해서 문자열의 끝을 알려주는 것입니다.


문자열을 입력할 때 맨 마지막에 NULL 값이 자동으로 입력되어 문자열의 끝을 알려주는 역할을 합니다.

그렇다면 맨 처음에 %00을 입력해 문자열의 끝이라고 알려주게 된다면 ereg, eregi와 같은 함수들을 우회할 수 있습니다.


하지만 그냥 %00<script>alert(1);</script>를 입력하게 되면 잘 적용되지 않습니다.

burp suite를 통해서 중간에 값을 잡아보면 %의 값이 넘어갈 때 %25로 넘어가는 것을 알 수 있습니다.

이 값을 다시 %00으로 조정하면 성공하게 됩니다.


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

[webhacking.kr] prob 25  (0) 2018.12.13
[webhacking.kr] prob 24  (0) 2018.12.13
[webhacking.kr] prob 18  (0) 2018.12.13
[webhacking.kr] prob 58  (0) 2018.12.07
[webhacking.kr] prob 51  (0) 2018.12.07



'admin'으로 나오도록 해야 하는데 id가 'guest'로 고정되어 있습니다.



1을 입력해보면 "hi guest"라는 말이 나오고, 1을 제외한 모든 것들은 아무것도 나오지 않습니다.

유추를 해보면 1이 guest면 0이나 2가 admin이라고 생각할 수 있습니다.



그래서 생각한 방법이 order by입니다.

order by는 정렬해주는 옵션으로 결국 해당 테이블의 순서를 admin이 먼저 나오게 만들면 성공하게 될 것입니다.


그렇게 하기에 우선 무조건 참을 만들기 위해 0 or 1=1 을 했습니다.

공백을 필터링 했기 때문에 %0a(개행)을 공백 부분의 넣어주고 입력하면, "hi guest"라는 문구가 나오게 됩니다.


그럼 이제 order by를 사용해 봅시다.

admin의 no값이 2라고 추정하고 0 or 1=1 order by no desc를 입력하면 성공을 하게 됩니다.

(0%0aor%0a1=1%0aorder%0aby%0ano%0adesc)


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

[webhacking.kr] prob 24  (0) 2018.12.13
[webhacking.kr] prob 23  (0) 2018.12.13
[webhacking.kr] prob 58  (0) 2018.12.07
[webhacking.kr] prob 51  (0) 2018.12.07
[webhacking.kr] prob 54  (0) 2018.12.07


<!-- urllib may help. DON'T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough. -->


사진을 클릭하면 URL에 ?nothing=[숫자] 가 추가되면서 아래와 같은 문구가 나옵니다.

변하는 숫자를 계속 입력하면 되는데 400번 해야 된다고 알려줍니다.



힌트로 urllib를 사용하라고 알려주지만 requests가 더 익숙해서 사용해봤습니다.

400회를 다 수행하면 다음 URL을 알려주게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import re
 
number = ['0']
for i in range(400):
    url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
    payload = url+number[0]
                     
    res = requests.get(payload)
    number = re.findall("[0-9]+",res.text)
 
    print(res.text)
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12


하나의 소문자 주위에 3개의 대문자가 있다고 합니다.

소스 코드에 주석으로 나와있는 다량의 문자열들 사이에서 해당 값을 찾아내면 되는 문제입니다.



이 문제는 정규표현식을 이용해서 해결할 수 있습니다.


예를 들어, AAAaAAA 이렇게 되어 있으면 가운데에 있는 a값이 찾고자 하는 문자입니다.

정규표현식으로 만들면 [A-Z]{3}[a-z]{1}[A-Z]{3} 이렇게 되는데 해당 방식대로 하면 많은 값들이 나오게 됩니다.

[A-Z]{3}을 앞뒤로 해도 그 앞뒤로 다시 대문자가 올 수 있기 때문입니다.


그래서 [a-z]{1}[A-Z]{3}[a-z]{1}[A-Z]{3}[a-z]{1} 앞뒤로 소문자를 하나씩 넣어주면 해결이 됩니다.


python에서 정규표현식을 사용하려면 re 모듈을 이용하면 됩니다.

1
2
3
4
5
6
7
import urllib.request
import re
 
html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/equality.html").read().decode()
data = re.findall("<!--(.*?)-->", html, re.DOTALL)[-1]
 
print([ payload[4for payload in re.findall("[a-z]{1}[A-Z]{3}[a-z]{1}[A-Z]{3}[a-z]{1}",data) ])
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12

소스 코드에 읽을 수 없는 문자열이 나와있는데 해당 문자열에서 단어를 찾으면 되는 문제입니다.




payload에 대한 값을 복사해서 돌리면 특정 값이 나오게 됩니다.

해당 문자를 찾으라고 해서 ascii code값으로 계산을 해봤습니다.

1
2
3
4
5
6
7
payload=""
result =''
for i in range(len(payload)):
    if(ord(payload[i]) >= 97 and ord(payload[i]) <= 122 ):
        result += payload[i]
 
print(result)
cs



이후 다른 풀이를 확인해 보니 Dictionary를 이용해 각각의 문자들이 몇 번 발생했는지 확인하고 찾는 방법이 있었습니다.

실행해보면 특수 문자들은 1000회 이상 쓰였지만 이 특정 문자들은 1회씩만 사용되어 확인할 수 있었습니다.

1
2
3
4
5
6
payload=""
={}
for ch in payload:
    d[ch] = d.get(ch,0)+1
 
print("".join(ch for ch in payload if d[ch] ==1))
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12
[pythonchallenge] level 0  (0) 2018.12.12

읽을 수 없는 문자열이 나와있고, 사진에는 K → M, O → Q, E → G만 나타나 있습니다.

이 의미는 암호학에서 알 수 있는 전치암호를 사용한 암호문 입니다.


abcdefghijklmnopqrstuvwxyz 알파벳을 나열해서 보면 k,o,e가 m,q,g가 될 때 모두 우측으로 2칸 이동한 값을 사용했다는 것을 알 수 있습니다.



python3로 작성한 코드입니다.

모든 알파벳은 ascii code로 나타낼 수 있습니다. 해당 ascii code를 통해서 +2를 해주면 문자를 변환 시킬 수 있습니다.

하지만 'z'값 이후에는 다른 값이 들어있으므로 -26을 통해 다시 맨 앞으로 가져와야 합니다.


ord(): 문자를 ascii 값으로 변환

chr(): ascii값을 문자로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
payload  ="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. "
payload +="bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. "
payload +="sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
result =''
 
for i in range(len(payload)):
    if( ord(payload[i]) < 97 ):
        result += payload[i]
    elif( ord(payload[i])+2 <= 122 ):
        result += chr(ord(payload[i])+2)
    elif( ord(payload[i])+2 > 122 ):
        result += chr(ord(payload[i])+2-26)
print(result)
cs


i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.

손으로 번역하지 말고 python함수를 이용하라고 합니다. ^_^

그리고 URL에 적용하라고 합니다.


map.html → ocr.jvon 로 바꿔서 입력하면 해당 파일을 받을 수 있습니다.

jvon 파일을 들어본 적 있는지 물어보는데 못 들어봤습니다..


map만 적용 시킨 ocr.html로 하니 2번 문제로 이동했습니다.



문제를 해결하고 maketrans()함수를 이용해서 간단하게 풀어봤습니다.

python2에서는 from string import maketrans 를 하고 string.maketrans() 하면 되고,

python3에서는 str.maketrans() 하면 됩니다.

1
2
3
4
5
6
7
8
9
payload  ="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. "
payload +="bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. "
payload +="sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
 
intab="abcdefghijklmnopqrstuvwxyz"
outtab="cdefghijklmnopqrstuvwxyzab"
transtab = str.maketrans(intab,outtab)
 
print(payload.translate(transtab))
cs


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 0  (0) 2018.12.12

PYTHONCHALLENGE라는 문제입니다.

CTF 문제를 푸는 도중에 해당 사이트의 존재를 알게 되어 시작합니다.


좀 내려가면 URL 링크가 있는데 해당 링크를 클릭하면 문제가 시작됩니다.

총 33개의 문제가 있다고 합니다.




HINT로 URL을 변경하라고 합니다.

URL을 보시면 0.html이 있고 해당 화면 왼쪽 위에 0이라고 기록되어 있습니다.

또, 모니터 사진에 이 쓰여 있습니다.

0의 값을 해당 값으로 바꾸라는 의미겠죠?


python challenge인 만큼 python을 사용해 봅시다.

pow(밑,지수) 함수를 이용해 간단하게 값을 구할 수 있습니다.


274877906944.html로 수정하면 1번 문제로 이동할 수 있습니다.


'Code Challenge > pythonchallenge.com' 카테고리의 다른 글

[pythonchallenge] level 4 linkedlist  (0) 2018.12.13
[pythonchallenge] level 3 equality  (0) 2018.12.13
[pythonchallenge] level 2 ocr  (0) 2018.12.13
[pythonchallenge] level 1 map  (0) 2018.12.12

.swf 파일인 flash 파일만 <embed>태그로 불러오게 됩니다.

해당 파일에서 어떤 값을 입력해도 Wrong이라는 메시지만 띄워줍니다.


kk.js와 kk2.js도 확인해봤지만 해당 스크립트는 단순히 flash를 불러오기 위한 과정일 뿐이었습니다.



그래서 혹시 몰라 해당 파일을 다운로드 받아 메모장으로 열어보니 

아래 부분에 URL이 나와있었고 해당 URL에 접속하니 성공하게 되었습니다.



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

[webhacking.kr] prob 23  (0) 2018.12.13
[webhacking.kr] prob 18  (0) 2018.12.13
[webhacking.kr] prob 51  (0) 2018.12.07
[webhacking.kr] prob 54  (0) 2018.12.07
[webhacking.kr] prob 47  (0) 2018.12.07



보통 md5('value')로 hash값을 만들면 32자리 hex값으로 나오게 됩니다.

하지만 md5('value', true)로 hash값을 만들면 16자리 바이너리 형태로 나오게 됩니다.

바이너리 형태로 나오게 되면서 취약점이 발생합니다.


password='aaa'='bbb' 라는 식은 password='aaa' 부분이 false, bool 연산의 문자열은 false이기에 'bbb'도 false가 나와 

true로 query가 작동하게 됩니다.


그렇다면 md5를 한 바이너리 값 중에서 '=' 라는 문자열이 나오게 되면 false + false = true 로 된다는 것입니다.



python3 코드를 이용해 해당 값들을 구할 수 있습니다.

나오는 값중 [ '=' ] 이 값 전후로 다른 값들이 있어야 하고, 어떤 값들은 성공하지 않을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
import hashlib
 
for password in range(1,99999999):
     password = str(password).encode('utf-8')
     md5_hash = hashlib.md5(password).digest()
     if "'='" in str(md5_hash):
          print(str(md5_hash))
          print(password)
          print('──────────────────────────')
 
cs







[참고]


md5 raw hash를 이용한 sql injection: bbolmin.tistory.com/77


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

[webhacking.kr] prob 18  (0) 2018.12.13
[webhacking.kr] prob 58  (0) 2018.12.07
[webhacking.kr] prob 54  (0) 2018.12.07
[webhacking.kr] prob 47  (0) 2018.12.07
[webhacking.kr] prob 42  (0) 2018.12.06

javascript로 Password를 한개씩 출력해줍니다.

해당 값들을 모두 모아서 인증하면 성공하게 되는데 확실하게 얻기 위해서 javascript를 사용해 봤습니다.



소스를 확인해보면 answer() 함수를 통해서 i의 값이 하나씩 증가하면서 GET요청을 하게 됩니다.

이때 setTimeout() 함수로 일정 시간에 한번씩 요청하게 되는데 이점을 이용하면 됩니다.



우선 password가 저장될 수 있는 변수를 선언하고, aview.innerHTML 대신에 해당 변수를 입력합니다.

innerHTML을 통해서 화면에 띄워줬던 것입니다.

그리고 setTimeout에 시간을 1로 바꿔서 빠르게 요청하도록 수정하면 됩니다.


잠시 기다리고 password 변수의 담긴 내용을 확인해보면 값을 얻을 수 있고, ?를 제외한 값을 입력하면 됩니다.


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

[webhacking.kr] prob 58  (0) 2018.12.07
[webhacking.kr] prob 51  (0) 2018.12.07
[webhacking.kr] prob 47  (0) 2018.12.07
[webhacking.kr] prob 42  (0) 2018.12.06
[webhacking.kr] prob 38  (0) 2018.12.06

+ Recent posts