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
  • 전체
    오늘
    어제
    • 분류 전체보기 (160)
      • 모의해킹 (20)
      • CTF (22)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
      • Mobile_security (14)
        • Drozer_Android (4)
        • Frida_Android (1)
        • IOS (2)
        • tool (1)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

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

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

티스토리툴바