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 |