문제: This lab has an admin panel at /admin, which identifies administrators using a forgeable cookie.
Solve the lab by accessing the admin panel and using it to delete the user carlos.
You can log in to your own account using the following credentials: wiener:peter
쿠키/세션을 이용하여 admin계정 탈취 후 admin panel을 접속하여 카를로스라는 계정 삭제
풀이: 마음대로 로그인창에 입력을 하여 로그인을 시도해보면 쿠키창에 그 세션값이 나온다.
하지만 제공된 계정 wiener:peter로 접속을 해보면
name: Admin
value: false
라고 뜨는 것을 볼 수 있다

이때 벨류값을 false->true로 고치고
다시 페이지로 돌아가보면

admin panel이 활성화 되어있는 화면을 볼 수 있다
패널로 들어가 카를로스 계정을 삭제하면 완료
문제 :
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
파이썬코드:
#!/usr/bin/python3
from flask import Flask, request, render_template
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import urllib
import os
app = Flask(name)
app.secret_key = os.urandom(32)
//FLAG: 애플리케이션에서 사용할 플래그 값을 flag.txt 파일에서 읽어옵니다. 파일이 없으면 기본적으로 "[FLAG]" 값이 사용됩니다.
try:
FLAG = open("./flag.txt", "r").read()
except:
FLAG = "[FLAG]"
URL 읽기 함수: read_url
def readurl(url, cookie={"name": "name", "value": "value"}):
cookie.update({"domain": "127.0.0.1"})
try:
service = Service(executable_path="/chromedriver")
options = webdriver.ChromeOptions()
for in [
"headless",
"window-size=1920x1080",
"disable-gpu",
"no-sandbox",
"disable-dev-shm-usage",
]:
options.addargument()
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)
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
주어진 URL을 브라우저로 로드하는 함수입니다.
도메인 "127.0.0.1"에 대한 쿠키를 설정한 후, 해당 URL을 브라우저에서 자동으로 로드합니다.
XSS 검사 함수: check_xss
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)
전달받은 param 값이 XSS 공격에 취약한지 검사하는 함수입니다.
URL 인코딩: urllib.parse.quote()를 통해 URL에 포함될 수 있는 문자를 인코딩하여
XSS를 유발할 수 있는 특수 문자를 변환합니다.
read_url 함수를 사용해 해당 URL을 로드하고, vuln의 엔드포인트 접속
@app.route("/")
def index():
return render_template("index.html")
/vuln (취약 페이지):
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return param
param이라는 GET 매개변수를 받아 그대로 출력하는 취약 페이지입니다.
이 페이지는 사용자가 입력한 데이터를 제대로 검증하지 않고 그대로 반환하므로 XSS 공격에 취약합니다.
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param")
if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
return ''
return '<script>alert("good");history.go(-1);</script>'
memo_text = ""
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", "")
memo_text += text + "\n"
return render_template("memo.html", memo=memo_text)
app.run(host="0.0.0.0", port=8000)
flag값은 서버 로컬 경로에 flag.txt파일로 존재, /flag 페이지에 파라미터 값을 입력하면 쿠키값을 생성해 flag로 저장한다


vuln(xss) page 페이지를 통해서 문으로 alert창을 실행한 것을 확인,
memo 페이지를 통해 memo?memo= 뒤에 오는 입력값이 메모장에 출력되는 것을 확인
이 메모창을 통해 flag값을 출력해야한다

플래그값은 쿠키로 저장되어 있기때문에 쿠키를 /memo 경로에 출력하도록
파라미터를 통해 요청을 보낸다
<script>location.href="http://127.0.0.1:8000//memp?memo="+document.cookie;</script>
이때 http://127.0.0.1:8000/와 같이 루프백 주소를 이용해야지
서버로컬주소에서 생성된 플래그 값을 가져올 수 있다

style>@keyframes x{}</style><xss style="animation- name:x"onanimationend="alert(1)"></xss>
코드 분석:
@keyframes x{}
onanimationend="alert(1)"
XSS 공격 위험성:
onanimationend 이벤트는 자바스크립트 코드가 실행될 수 있도록 하는 공격 벡버이다.
특정 이벤트가 발생하면(이 경우에는 애니메이션이 끝났을 때), 브라우저에서 해당 이벤트에 연결된 자바스크립트 코드를 실행
만약 이 코드를 악의적인 사이트나 사용자 입력에서 불러온다면, 악의적인 자바스크립트를 주입하여 사용자 정보를 탈취하는 등의 공격을 할 수 있다
이 코드의 alert(1)은 단순히 경고창을 띄우는 예시일 뿐이지만, 실제 공격에서는 훨씬 더 위험한 작업(예: 쿠키 정보 탈취, 세션 하이재킹 등)을 수행할 수 있다
"'`><\x3Cimg src=xxx:x onerror=javascript:alert(1)>
코드 분석:
"'>
<\x3Cimg
src=xxx:x
onerror=javascript:alert(1)
XSS 공격 가능성:
웹 애플리케이션에서 사용자 입력을 제대로 검증하지 않고 HTML로 출력할 경우 발생할 수 있는 반사형 XSS 공격의 예이다.
공격자는 이 코드를 웹사이트의 입력 필드에 넣거나, URL에 포함시켜 브라우저에서 악성 스크립트를 실행하도록 유도할 수 있습니다.
onerror 이벤트를 사용한 방식은 이미지 로드 실패 시 자바스크립트 코드를 실행할 수 있게 함으로써 XSS 공격을 가능하게 합니다.
또한 \x3C(16진수), <(10진수), %3C(URL 인코딩) 과 같이 아스키코드를 통해 필터링을 우회하여 악성 스크립트문을 성공적으로 삽입할 수 있게한다.
<svg><script>//
confirm(1);</script </svg>
코드 분석:
< svg >
// & NewLine;confirm(1);
confirm(1);
XSS 공격 가능성:
이 코드는 SVG 태그 내부에서 스크립트를 실행하는 방법을 사용합니다.
//& NewLine;을 사용하여 자바스크립트 구문 사이에 특수 문자를 추가함으로써 필터링을 우회 가능
불완전하게 닫힌 태그 (</script)는 브라우저가 자동으로 완성해 주기 때문에 필터링 우회 가능
웹 애플리케이션이 < svg > 태그나 < script > 태그에 대한 검증을 제대로 하지 않으면, 공격자가 악의적인 스크립트를 삽입해 실행할 수 있습니다.