XSS (1)

khm_studylog·2023년 2월 9일
0

문제 정보

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

플래그 형식은 DH{…} 입니다.


XSS란

XSS는 공격자가 삽입 또는 제공한 악의적인 스크립트가 사용자의 브라우저에서 실행되는 취약점이다.

종류

  • Reflected XSS : URL 접근 대상
  • Stored XSS : 불특정 다수
  • DOM Based XSS : URL 접근 대상 / 서버를 거치지 않음

xss 파라미터로 입력된 값을 전송하면, 페이지 응답 시 해당 변수가 페이지 내 삽입된다.

위 과정에서는 xss 파라미터 값으로 스크립트 구문이 삽입되어, 페이지 응답 시 해당 스크립트가 동작한다.


memo 파라미터로 입력된 값을 전송하면 페이지 응답 시, 해당 변수가 페이지 내 삽입된다.

xss 파라미터에 test 입력 후 전송 시, "good"이라는 알림창이 뜬다.


def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome("/chromedriver", options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get("http://127.0.0.1:8000/")
        driver.add_cookie(cookie)
        driver.get(url)
    except Exception as e:
        driver.quit()
        # return str(e)
        return False
    driver.quit()
    return True
    
def check_xss(param, cookie={"name": "name", "value": "value"}):
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)

read_url 함수가 실행되면

1) driver.get('http://127.0.0.1:8000/')
-> 로컬호스트 환경에서 웹 페이지를 접속한다.

2) driver.add_cookie(cookie)
-> 접속한 웹 페이지에 매개변수로 받아온 cookie를 추가한다.

3) driver.get(f'http://127.0.0.1:8000/xss?xss={urllib.parse.quote(url)}')
-> 매개변수로 받아온 xss 값을 이용하여 xss 페이지에 접속한다.


정리하면 flag 페이지에서 xss 값을 입력 후 전송하면, 로컬호스트 환경에서 웹 페이지 접속 후, FLAG 값을 쿠키로 추가하고 사용자로부터 입력받은 xss 값을 이용하여 xss 페이지를 실행한다.

따라서 flag 페이지에서 xss 파라미터를 조작하여 로컬호스트 환경에서 FLAG가 적힌 쿠키 값이 추가되면, 해당 쿠키값을 memo 페이지의 매개변수로 전달하고 memo 페이지에 FLAG를 작성하도록 한다.


공격구문

xss=<script>window.open('http://127.0.0.1:8000/memo?memo='+document.cookie)</script>

-> 'http://127.0.0.1:8000/memo?memo={현재 로컬의 쿠키 값}' 페이지를 새 창으로 여는 스크립트 구문

-> memo 페이지에 FLAG가 삽입된 로컬의 쿠키 값 인자 값으로하여 작성하는 것으로 이해하면 된다.

document.cookie 하면 현재 쿠키 정보가 나옴


memo 페이지에 접속하면 FLAG 값이 메모로 작성되어 있는 것을 볼 수 있다.


참고
https://mokpo.tistory.com/59 https://msh1307.tistory.com/21

0개의 댓글