Skip to content

Commit e27783f

Browse files
author
gsbp
committed
update
1 parent 436af94 commit e27783f

File tree

15 files changed

+853
-10
lines changed

15 files changed

+853
-10
lines changed

content/post/d3ctf2025.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
+++
2-
date = '2025-06-1T21:00:00+08:00'
2+
date = '2025-06-01T21:00:00+08:00'
33
draft = false
44
title = 'D3CTF 2025-WP'
55
author='GSBP'
@@ -382,4 +382,6 @@ list_objects()
382382
download_file("flag", "downloaded_example.txt")
383383
```
384384

385-
## tidy quic
385+
## tidy quic
386+
387+
在写了在写了

public/about/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<title>About Me | GSBP&#39;s Blog</title>
88
<meta name="description"
99
content="一名大二在读学生
10-
Syclover主力成员
10+
Syclover核心成员,主力成员&amp;Nu1L成员
1111
对各种安全感兴趣,目前主要学习的还的是Web安全(Java 安全、偶然也会学点云安全,等)
1212
最爱吃,最喜欢吃的是🍉,最喜欢干的事情就是大夏天抱着半个西瓜拿勺子挖着吃然后看视频
1313
什么都想学,但什么都不会
@@ -23,7 +23,7 @@
2323
<meta property="og:site_name" content="GSBP&#39;s Blog">
2424
<meta property="og:title" content="About Me">
2525
<meta property="og:description" content="一名大二在读学生
26-
Syclover主力成员
26+
Syclover核心成员,主力成员&amp;Nu1L成员
2727
对各种安全感兴趣,目前主要学习的还的是Web安全(Java 安全、偶然也会学点云安全,等)
2828
最爱吃,最喜欢吃的是🍉,最喜欢干的事情就是大夏天抱着半个西瓜拿勺子挖着吃然后看视频
2929
什么都想学,但什么都不会
@@ -38,7 +38,7 @@
3838
<meta name="twitter:card" content="summary">
3939
<meta name="twitter:title" content="About Me">
4040
<meta name="twitter:description" content="一名大二在读学生
41-
Syclover主力成员
41+
Syclover核心成员,主力成员&amp;Nu1L成员
4242
对各种安全感兴趣,目前主要学习的还的是Web安全(Java 安全、偶然也会学点云安全,等)
4343
最爱吃,最喜欢吃的是🍉,最喜欢干的事情就是大夏天抱着半个西瓜拿勺子挖着吃然后看视频
4444
什么都想学,但什么都不会
@@ -161,7 +161,7 @@ <h1>GSBP&#39;s Blog</h1>
161161
<h1 class="title is-1">About Me</h1>
162162
<div class="content about-content">
163163
<p>一名大二在读学生</p>
164-
<p>Syclover主力成员</p>
164+
<p>Syclover核心成员,主力成员&amp;Nu1L成员</p>
165165
<p>对各种安全感兴趣,目前主要学习的还的是Web安全(Java 安全、偶然也会学点云安全,等)</p>
166166
<p>最爱吃,最喜欢吃的是🍉,最喜欢干的事情就是大夏天抱着半个西瓜拿勺子挖着吃然后看视频</p>
167167
<p><strong>什么都想学,但什么都不会</strong></p>

public/categories/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ <h1>Categories</h1>
156156
<a class="title is-5 is-size-6-mobile" href="http://localhost:1313/categories/wp/">WP</a>
157157

158158
<strong>
159-
<sup style="font-size:16px;">5</sup>
159+
<sup style="font-size:16px;">6</sup>
160160
</strong>
161161
</div>
162162
</div>
@@ -172,7 +172,7 @@ <h1>Categories</h1>
172172
<a class="title is-5 is-size-6-mobile" href="http://localhost:1313/categories/java%E5%AE%89%E5%85%A8/">Java安全</a>
173173

174174
<strong>
175-
<sup style="font-size:16px;">4</sup>
175+
<sup style="font-size:16px;">5</sup>
176176
</strong>
177177
</div>
178178
</div>

public/categories/java安全/index.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,16 @@ <h2 class="archive-title">Category: Java安全</h2>
185185

186186

187187

188+
<article class="archive-item">
189+
<a href="http://localhost:1313/post/d3ctf2025/" class="archive-item-link hover-underline-animation">D3CTF 2025-WP</a>
190+
<span class="archive-item-date">
191+
January 1, 0001
192+
</span>
193+
194+
</article>
195+
196+
197+
188198
</div>
189199

190200
</main><footer class="footer">

public/categories/java安全/index.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,12 @@
3636
<guid>http://localhost:1313/post/jdk17%E6%89%93jackson&#43;ldapattruibute%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/</guid>
3737
<description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;&#xA;&lt;p&gt;本月五号的时候打了个软件攻防赛,里面有道java当时没做出来,用的ldapAttribute+Jackson死活没通,后面自己调试了一下,这里做个记录&lt;/p&gt;&#xA;&lt;h2 id=&#34;题目分析&#34;&gt;题目分析&lt;/h2&gt;&#xA;&lt;p&gt;题目名叫&lt;code&gt;JDBCParty&lt;/code&gt;,jdk版本是17,里面给了个接口源码如下&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; @PostMapping({&amp;#34;/dbtest&amp;#34;})&#xA; public ResponseEntity&amp;lt;String&amp;gt; dbtest(String data) {&#xA; try {&#xA; User credentials = (User)Utils.deserialize(data);&#xA; Class.forName(this.driverClassName);&#xA;&#xA; try (Connection connection = DriverManager.getConnection(this.url, credentials.getUsername(), credentials.getPassword())) {&#xA; if (connection.isValid(5)) {&#xA; return ResponseEntity.ok(&amp;#34;connect success&amp;#34;);&#xA; } else {&#xA; return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(&amp;#34;connect failed&amp;#34;);&#xA; }&#xA; }&#xA; } catch (Exception e) {&#xA; e.printStackTrace();&#xA; return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(&amp;#34;connect failed &amp;#34; + e.getMessage());&#xA; }&#xA; }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;表面上是给了个JDBC的入口,但是我们能控的只有username和password,打不了jdbc。&lt;/p&gt;&#xA;&lt;p&gt;实际入口是那个反序列化,从这个反序列化里面做文章&lt;/p&gt;&#xA;&lt;p&gt;然后看看题目给的依赖&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- &amp;#34;BOOT-INF/lib/spring-boot-3.3.5.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-boot-autoconfigure-3.3.5.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/logback-classic-1.5.11.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/logback-core-1.5.11.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/log4j-to-slf4j-2.23.1.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/log4j-api-2.23.1.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jul-to-slf4j-2.0.16.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jakarta.annotation-api-2.1.1.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/snakeyaml-2.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-databind-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-annotations-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-core-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-datatype-jdk8-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-datatype-jsr310-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/jackson-module-parameter-names-2.17.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/tomcat-embed-core-10.1.31.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/tomcat-embed-el-10.1.31.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/tomcat-embed-websocket-10.1.31.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-web-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-beans-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/micrometer-observation-1.13.6.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/micrometer-commons-1.13.6.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-webmvc-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-aop-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-context-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-expression-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/thymeleaf-spring6-3.1.2.RELEASE.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/thymeleaf-3.1.2.RELEASE.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/attoparser-2.0.7.RELEASE.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/unbescape-1.1.6.RELEASE.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/slf4j-api-2.0.16.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-core-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-jcl-6.1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/ojdbc11-21.14.0.0.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/tomcat-jdbc-10.1.31.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/tomcat-juli-10.1.31.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-swing-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-anim-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-parser-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-svg-dom-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-awt-util-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/xmlgraphics-commons-2.6.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/commons-io-1.3.1.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/commons-logging-1.0.4.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-bridge-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-xml-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-css-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-dom-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/xalan-2.7.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/serializer-2.7.2.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/xml-apis-1.4.01.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-ext-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-gui-util-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-gvt-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-script-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-shared-resources-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-util-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-constants-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/batik-i18n-1.14.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/xml-apis-ext-1.3.04.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/fastjson2-2.0.37.jar&amp;#34;&#xA;- &amp;#34;BOOT-INF/lib/spring-boot-jarmode-tools-3.3.5.jar&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;有tomcat-jdbc,snakeYaml,EL,Jackson和fastjson2等等,题目指向性很强,就是让我们用一个JNDI通过Tomcat-JDBC打EL,snakeYaml表达式注入的操作&lt;/p&gt;</description>
3838
</item>
39+
<item>
40+
<title>D3CTF 2025-WP</title>
41+
<link>http://localhost:1313/post/d3ctf2025/</link>
42+
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
43+
<guid>http://localhost:1313/post/d3ctf2025/</guid>
44+
<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;跟着Syc打的,web方向差一题ak,算是有点可惜了&lt;/p&gt;&#xA;&lt;h2 id=&#34;d3model&#34;&gt;d3model&lt;/h2&gt;&#xA;&lt;p&gt;题目内就一个app.py&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import keras&#xD;&#xA;from flask import Flask, request, jsonify&#xD;&#xA;import os&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;def is_valid_model(modelname):&#xD;&#xA; try:&#xD;&#xA; keras.models.load_model(modelname)&#xD;&#xA; except Exception as e:&#xD;&#xA; print(e)&#xD;&#xA; return False&#xD;&#xA; return True&#xD;&#xA;&#xD;&#xA;app = Flask(__name__)&#xD;&#xA;&#xD;&#xA;@app.route(&amp;#39;/&amp;#39;, methods=[&amp;#39;GET&amp;#39;])&#xD;&#xA;def index():&#xD;&#xA; return open(&amp;#39;index.html&amp;#39;).read()&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;@app.route(&amp;#39;/upload&amp;#39;, methods=[&amp;#39;POST&amp;#39;])&#xD;&#xA;def upload_file():&#xD;&#xA; if &amp;#39;file&amp;#39; not in request.files:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;No file part&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; file = request.files[&amp;#39;file&amp;#39;]&#xD;&#xA; &#xD;&#xA; if file.filename == &amp;#39;&amp;#39;:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;No selected file&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB&#xD;&#xA; file.seek(0, os.SEEK_END)&#xD;&#xA; file_size = file.tell()&#xD;&#xA; file.seek(0)&#xD;&#xA; &#xD;&#xA; if file_size &amp;gt; MAX_FILE_SIZE:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;File size exceeds 50MB limit&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; filepath = os.path.join(&amp;#39;./&amp;#39;, &amp;#39;test.keras&amp;#39;)&#xD;&#xA; if os.path.exists(filepath):&#xD;&#xA; os.remove(filepath)&#xD;&#xA; file.save(filepath)&#xD;&#xA; &#xD;&#xA; if is_valid_model(filepath):&#xD;&#xA; return jsonify({&amp;#39;message&amp;#39;: &amp;#39;Model is valid&amp;#39;}), 200&#xD;&#xA; else:&#xD;&#xA;&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;Invalid model file&amp;#39;}), 400&#xD;&#xA;&#xD;&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xD;&#xA; app.run(host=&amp;#39;0.0.0.0&amp;#39;, port=5001)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;代码也没啥好审的,很明显就只有一个keras.models.load_model(modelname)能当作sink点,去网上搜一下相关漏洞就能找到现成的payload,题目不出网,外带到index.html即可&lt;/p&gt;</description>
45+
</item>
3946
</channel>
4047
</rss>

public/categories/wp/index.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,16 @@ <h2 class="archive-title">Category: WP</h2>
195195

196196

197197

198+
<article class="archive-item">
199+
<a href="http://localhost:1313/post/d3ctf2025/" class="archive-item-link hover-underline-animation">D3CTF 2025-WP</a>
200+
<span class="archive-item-date">
201+
January 1, 0001
202+
</span>
203+
204+
</article>
205+
206+
207+
198208
</div>
199209

200210
</main><footer class="footer">

public/categories/wp/index.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,12 @@
4343
<guid>http://localhost:1313/post/2025suctf/</guid>
4444
<description>2025年的第一场XCTF</description>
4545
</item>
46+
<item>
47+
<title>D3CTF 2025-WP</title>
48+
<link>http://localhost:1313/post/d3ctf2025/</link>
49+
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
50+
<guid>http://localhost:1313/post/d3ctf2025/</guid>
51+
<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;跟着Syc打的,web方向差一题ak,算是有点可惜了&lt;/p&gt;&#xA;&lt;h2 id=&#34;d3model&#34;&gt;d3model&lt;/h2&gt;&#xA;&lt;p&gt;题目内就一个app.py&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import keras&#xD;&#xA;from flask import Flask, request, jsonify&#xD;&#xA;import os&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;def is_valid_model(modelname):&#xD;&#xA; try:&#xD;&#xA; keras.models.load_model(modelname)&#xD;&#xA; except Exception as e:&#xD;&#xA; print(e)&#xD;&#xA; return False&#xD;&#xA; return True&#xD;&#xA;&#xD;&#xA;app = Flask(__name__)&#xD;&#xA;&#xD;&#xA;@app.route(&amp;#39;/&amp;#39;, methods=[&amp;#39;GET&amp;#39;])&#xD;&#xA;def index():&#xD;&#xA; return open(&amp;#39;index.html&amp;#39;).read()&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;@app.route(&amp;#39;/upload&amp;#39;, methods=[&amp;#39;POST&amp;#39;])&#xD;&#xA;def upload_file():&#xD;&#xA; if &amp;#39;file&amp;#39; not in request.files:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;No file part&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; file = request.files[&amp;#39;file&amp;#39;]&#xD;&#xA; &#xD;&#xA; if file.filename == &amp;#39;&amp;#39;:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;No selected file&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB&#xD;&#xA; file.seek(0, os.SEEK_END)&#xD;&#xA; file_size = file.tell()&#xD;&#xA; file.seek(0)&#xD;&#xA; &#xD;&#xA; if file_size &amp;gt; MAX_FILE_SIZE:&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;File size exceeds 50MB limit&amp;#39;}), 400&#xD;&#xA; &#xD;&#xA; filepath = os.path.join(&amp;#39;./&amp;#39;, &amp;#39;test.keras&amp;#39;)&#xD;&#xA; if os.path.exists(filepath):&#xD;&#xA; os.remove(filepath)&#xD;&#xA; file.save(filepath)&#xD;&#xA; &#xD;&#xA; if is_valid_model(filepath):&#xD;&#xA; return jsonify({&amp;#39;message&amp;#39;: &amp;#39;Model is valid&amp;#39;}), 200&#xD;&#xA; else:&#xD;&#xA;&#xD;&#xA; return jsonify({&amp;#39;error&amp;#39;: &amp;#39;Invalid model file&amp;#39;}), 400&#xD;&#xA;&#xD;&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xD;&#xA; app.run(host=&amp;#39;0.0.0.0&amp;#39;, port=5001)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;代码也没啥好审的,很明显就只有一个keras.models.load_model(modelname)能当作sink点,去网上搜一下相关漏洞就能找到现成的payload,题目不出网,外带到index.html即可&lt;/p&gt;</description>
52+
</item>
4653
</channel>
4754
</rss>

public/index.html

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,84 @@ <h1 class="post-title hover-underline-animation"><a class="post-link" href="/pos
684684
</article>
685685

686686

687+
<article class="post">
688+
<div class="single-container column is-centered">
689+
<div class="archive" id="post-container">
690+
<header class="post-header">
691+
<h1 class="post-title hover-underline-animation"><a class="post-link" href="/post/d3ctf2025/">D3CTF 2025-WP</a></h1>
692+
693+
694+
</header>
695+
<div class="post-content">
696+
<div class="excerpt post-summary">
697+
<h2 id="前言">前言</h2>
698+
<p>跟着Syc打的,web方向差一题ak,算是有点可惜了</p>
699+
<h2 id="d3model">d3model</h2>
700+
<p>题目内就一个app.py</p>
701+
<pre tabindex="0"><code>import keras
702+
from flask import Flask, request, jsonify
703+
import os
704+
705+
706+
def is_valid_model(modelname):
707+
try:
708+
keras.models.load_model(modelname)
709+
except Exception as e:
710+
print(e)
711+
return False
712+
return True
713+
714+
app = Flask(__name__)
715+
716+
@app.route(&#39;/&#39;, methods=[&#39;GET&#39;])
717+
def index():
718+
return open(&#39;index.html&#39;).read()
719+
720+
721+
@app.route(&#39;/upload&#39;, methods=[&#39;POST&#39;])
722+
def upload_file():
723+
if &#39;file&#39; not in request.files:
724+
return jsonify({&#39;error&#39;: &#39;No file part&#39;}), 400
725+
726+
file = request.files[&#39;file&#39;]
727+
728+
if file.filename == &#39;&#39;:
729+
return jsonify({&#39;error&#39;: &#39;No selected file&#39;}), 400
730+
731+
MAX_FILE_SIZE = 50 * 1024 * 1024 # 50MB
732+
file.seek(0, os.SEEK_END)
733+
file_size = file.tell()
734+
file.seek(0)
735+
736+
if file_size &gt; MAX_FILE_SIZE:
737+
return jsonify({&#39;error&#39;: &#39;File size exceeds 50MB limit&#39;}), 400
738+
739+
filepath = os.path.join(&#39;./&#39;, &#39;test.keras&#39;)
740+
if os.path.exists(filepath):
741+
os.remove(filepath)
742+
file.save(filepath)
743+
744+
if is_valid_model(filepath):
745+
return jsonify({&#39;message&#39;: &#39;Model is valid&#39;}), 200
746+
else:
747+
748+
return jsonify({&#39;error&#39;: &#39;Invalid model file&#39;}), 400
749+
750+
if __name__ == &#39;__main__&#39;:
751+
app.run(host=&#39;0.0.0.0&#39;, port=5001)
752+
</code></pre><p>代码也没啥好审的,很明显就只有一个keras.models.load_model(modelname)能当作sink点,去网上搜一下相关漏洞就能找到现成的payload,题目不出网,外带到index.html即可</p>
753+
</div>
754+
755+
<div class="post-time-container">
756+
<span class="post-time"> 0001-01-01 </span>
757+
</div>
758+
</div>
759+
760+
</div>
761+
</div>
762+
</article>
763+
764+
687765
<hr>
688766
<section class="pagination" >
689767

public/index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)