XSS Filtering Bypass

2024. 10. 16. 15:59·DreamHack/WEB

 

XSS에 대한 필터링을 우회하라는 거 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3개의 페이지에 존재

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/vuln 에 대한 페이지 로고를 못 불러오는 모습이다.

 

XSS를 실행시키는 페이지인 거 같다.

 

 

 

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "")  # 쿼리 파라미터에서 'param' 값 가져오기
    param = xss_filter(param)  # XSS 필터 적용
    return param  # 필터링된 파라미터 반환

 

xss_filter를 적용시켜 param를 return 시킨다.

 

 

 

def xss_filter(text):
    # 필터링할 키워드 목록
    _filter = ["script", "on", "javascript:"]
    for f in _filter:
        # 키워드가 포함되어 있다면 제거
        if f in text.lower():
            text = text.replace(f, "")
    return text  # 필터링된 텍스트 반환

 

필터를 보면 문자열 [script , on , javascript:]를 적용시킨다.

 

근데 키워드가 포함되어 있음 제거 인 방식인데 2번 이상 필터링을 시키지 않는다.

 

scr [script] ript 이런 식으로 하면 필터링된 텍스트는 script이다.

 

대문자도 포함시키지 않았다.

 

 

 

 

get을 받아 출력해 주는 용도인 거 같다.

 

 

@app.route("/memo")
def memo():
    global memo_text  # 전역 메모 변수 참조
    text = request.args.get("memo", "")  # 쿼리 파라미터에서 'memo' 값 가져오기
    memo_text += text + "\n"  # 메모에 새로운 텍스트 추가
    return render_template("memo.html", memo=memo_text)

 

그대로이다.

 

 

 

 

 

 

 

 

 

 

 

 

flag 페이지이다.

 

 

@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")  # GET 요청 시 flag.html 렌더링
    elif request.method == "POST":
        param = request.form.get("param")  # POST 요청의 'param' 값 가져오기
        # XSS 검증 및 쿠키에 플래그 설정
        if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
            return '<script>alert("wrong??");history.go(-1);</script>'  # 실패 시 알림 후 이전 페이지로 이동

        return '<script>alert("good");history.go(-1);</script>'

 

Post 요청으로 param 값을 받는데 check_xss 거친다.

 

check_xss를 한번 봐보자.

 

 

 

 

def check_xss(param, cookie={"name": "name", "value": "value"}):
    # 취약점을 테스트하기 위한 URL 생성
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)  # URL을 읽어 결과 반환

 

요청받은 param 값을 URL 인코딩을 해 read_url에 전달한다 cookie 도 같이 전달한다.

 

read_url를 한번 보자.

 

 

 

 

def read_url(url, cookie={"name": "name", "value": "value"}):
    # 기본 쿠키 정보를 설정하고, 도메인 정보를 추가
    cookie.update({"domain": "127.0.0.1"})
    try:
        # Chrome 드라이버 서비스 설정
        service = Service(executable_path="/chromedriver")
        options = webdriver.ChromeOptions()
        
        # 드라이버에 필요한 옵션 추가 (헤드리스 모드, 창 크기, GPU 비활성화 등)
        for _ in [
            "headless",  # 브라우저 UI 없이 실행
            "window-size=1920x1080",  # 가상 창 크기 설정
            "disable-gpu",  # GPU 가속 비활성화
            "no-sandbox",  # 샌드박스 모드 비활성화
            "disable-dev-shm-usage",  # /dev/shm 사용 안 함
        ]:
            options.add_argument(_)
        
        # Chrome 드라이버 인스턴스 생성
        driver = webdriver.Chrome(service=service, 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)  # 지정된 URL 요청
    except Exception as e:
        driver.quit()  # 에러 발생 시 드라이버 종료
        # return str(e)  # 오류 메시지 반환 (주석 처리됨)
        return False  # 실패 시 False 반환
    driver.quit()  # 작업 완료 후 드라이버 종료
    return True  # 성공 시 True 반환

 

url, cookie 값을 받은 토대로 Chromedriver 가지고 인스턴스를 생성한다.

 

확연히 보이는 건 쿠키에 대한 추가이다.

 

그럼 flag에 XSS 공격을 해보자.

 

공격방법은 많다.

 

<img> 태그를 이용해도 되고 하지만 script 있는데  script를 쓰도록 하자

 

우회방법은 대문자인 <SCRIPT>를 쓰면 될 거 같다.

 

memo를 이용하는 방향으로 가야 한다.

 

requet bin을 이용하는 방법도 있지만 memo 가 있으니 그걸로 쓰면 좋을 거 같다.

 

memo 가 있으니 공격은 세션 쿠키 탈취를 이용하도록 할 것이다.

 

클라이언트의 웹 브라우저에 있는 세션 쿠키를 읽어서 memo에  보낸다. <- 명령어

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<SCRIPT></SCRIPT>를 이용하였고

 

document.cookie를 이용해서 쿠키를 읽고 document.location를 이용하여 memo에게 보내게 하였다.

 

 

 

 

 

 

 

'DreamHack > WEB' 카테고리의 다른 글

simple_sqli_chatgpt  (0) 2024.10.17
php-1  (1) 2024.10.16
proxy-1  (0) 2024.10.16
web-misconf-1  (1) 2024.10.10
blind-command  (0) 2024.10.10
'DreamHack/WEB' 카테고리의 다른 글
  • simple_sqli_chatgpt
  • php-1
  • proxy-1
  • web-misconf-1
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (138)
      • 모의해킹 (7)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
        • CTF (22)
      • Android_security (5)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    lfi
    php wrapper
    drozer
    안드로이드
    워게임
    bandit20
    리눅스
    Android
    webhacking.kr
    bandit
    난독화
    wargame
    insecurebankv2
    bandit18
    overthewire
    Linux
    bandit17
    sql injection
    bandit30
    리눅스 워게임
    php
    정보보안기사
    webhacking
    url encode
    union
    cookies
    Dreamhack
    Cookie
    CTF
    Linux wargame
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
XSS Filtering Bypass
상단으로

티스토리툴바