Skip to content

Commit b28139e

Browse files
committed
docs: add more docs
1 parent 5b2ce2e commit b28139e

File tree

9 files changed

+78
-47
lines changed

9 files changed

+78
-47
lines changed

web/bun.lock

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
"fumadocs-ui": "16.2.4",
2020
"i18next": "^25.7.2",
2121
"isbot": "^5.1.32",
22-
"lucide-react": "^0.560.0",
22+
"lucide-react": "^0.561.0",
2323
"motion": "^12.23.26",
2424
"radix-ui": "^1.4.3",
25-
"react": "^19.2.1",
25+
"react": "^19.2.3",
2626
"react-copy-to-clipboard": "^5.1.0",
27-
"react-dom": "^19.2.1",
27+
"react-dom": "^19.2.3",
2828
"react-hook-form": "^7.68.0",
29-
"react-i18next": "^16.4.1",
29+
"react-i18next": "^16.5.0",
3030
"react-medium-image-zoom": "^5.4.0",
3131
"react-syntax-highlighter": "^16.1.0",
3232
"sonner": "^2.0.7",
@@ -37,17 +37,17 @@
3737
"devDependencies": {
3838
"@biomejs/biome": "^2.3.8",
3939
"@react-router/dev": "^7.10.1",
40-
"@tailwindcss/vite": "^4.1.17",
40+
"@tailwindcss/vite": "^4.1.18",
4141
"@types/mdx": "^2.0.13",
42-
"@types/node": "^25.0.0",
42+
"@types/node": "^25.0.1",
4343
"@types/react": "^19.2.7",
4444
"@types/react-copy-to-clipboard": "^5.0.7",
4545
"@types/react-dom": "^19.2.3",
4646
"@types/react-syntax-highlighter": "^15.5.13",
4747
"react-router-devtools": "^6.0.0",
4848
"rimraf": "^6.1.2",
4949
"serve": "^14.2.5",
50-
"tailwindcss": "^4.1.17",
50+
"tailwindcss": "^4.1.18",
5151
"typescript": "^5.9.3",
5252
"vite": "^7.2.7",
5353
"vite-plugin-devtools-json": "^1.0.0",
@@ -490,7 +490,7 @@
490490

491491
"@types/ms": ["@types/[email protected]", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
492492

493-
"@types/node": ["@types/[email protected].0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew=="],
493+
"@types/node": ["@types/[email protected].1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg=="],
494494

495495
"@types/parse-json": ["@types/[email protected]", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="],
496496

@@ -866,7 +866,7 @@
866866

867867
"lru-cache": ["[email protected]", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
868868

869-
"lucide-react": ["lucide-react@0.560.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NwKoUA/aBShsdL8WE5lukV2F/tjHzQRlonQs7fkNGI1sCT0Ay4a9Ap3ST2clUUkcY+9eQ0pBe2hybTQd2fmyDA=="],
869+
"lucide-react": ["lucide-react@0.561.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A=="],
870870

871871
"magic-string": ["[email protected]", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
872872

@@ -1072,19 +1072,19 @@
10721072

10731073
"rc": ["[email protected]", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
10741074

1075-
"react": ["[email protected].1", "", {}, "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw=="],
1075+
"react": ["[email protected].3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
10761076

10771077
"react-copy-to-clipboard": ["[email protected]", "", { "dependencies": { "copy-to-clipboard": "^3.3.1", "prop-types": "^15.8.1" }, "peerDependencies": { "react": "^15.3.0 || 16 || 17 || 18" } }, "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A=="],
10781078

10791079
"react-d3-tree": ["[email protected]", "", { "dependencies": { "@bkrem/react-transition-group": "^1.3.5", "@types/d3-hierarchy": "^1.1.8", "clone": "^2.1.1", "d3-hierarchy": "^1.1.9", "d3-selection": "^3.0.0", "d3-shape": "^1.3.7", "d3-zoom": "^3.0.0", "dequal": "^2.0.2", "uuid": "^8.3.1" }, "peerDependencies": { "react": "16.x || 17.x || 18.x || 19.x", "react-dom": "16.x || 17.x || 18.x || 19.x" } }, "sha512-E9ByUdeqvlxLlF9BSL7KWQH3ikYHtHO+g1rAPcVgj6mu92tjRUCan2AWxoD4eTSzzAATf8BZtf+CXGSoSd6ioQ=="],
10801080

1081-
"react-dom": ["[email protected].1", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.1" } }, "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg=="],
1081+
"react-dom": ["[email protected].3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="],
10821082

10831083
"react-hook-form": ["[email protected]", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q=="],
10841084

10851085
"react-hotkeys-hook": ["[email protected]", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-xbKh6zJxd/vJHT4Bw4+0pBD662Fk20V+VFhLqciCg+manTVO4qlqRqiwFOYelfHN9dBvWj9vxaPkSS26ZSIJGg=="],
10861086

1087-
"react-i18next": ["react-i18next@16.4.1", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "i18next": ">= 25.6.2", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-GzsYomxb1/uE7nlJm0e1qQ8f+W9I3Xirh9VoycZIahk6C8Pmv/9Fd0ek6zjf1FSgtGLElDGqwi/4FOHEGUbsEQ=="],
1087+
"react-i18next": ["react-i18next@16.5.0", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "i18next": ">= 25.6.2", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-IMpPTyCTKxEj8klCrLKUTIUa8uYTd851+jcu2fJuUB9Agkk9Qq8asw4omyeHVnOXHrLgQJGTm5zTvn8HpaPiqw=="],
10881088

10891089
"react-is": ["[email protected]", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
10901090

web/content/docs/memshell/meta.json

Lines changed: 0 additions & 3 deletions
This file was deleted.

web/content/docs/meta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"changelog",
1010
"---内存马生成器---",
1111
"memshell-core-config",
12-
"memshell",
12+
"servlet",
1313
"custom-memshell",
1414
"---内存马工具---",
1515
"...(shelltool)",
File renamed without changes.

web/content/docs/servlet/index.mdx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
title: Java Servlet 规范内存马
3+
---
4+
5+
Java SE 中我们可以创建 socket 服务端为用户提供服务,但需要用户使用 socket 客户端,当然也可以基于 socket 实现 HTTP 协议,WebFlux 就是这样子的存在。而在 Java EE 中,Java 制定了 Servlet 规范,来规范在 Java 中提供 HTTP 服务的编写方式,其中有两个重要的概念,Servlet 与 Servlet Container。Servlet 是基于 Java 的 Web 组件,由容器进行管理,提供动态内容。Servlet 容器用于提供基于请求/响应发送模式的服务,必须支持 HTTP,并且管理 Servlet 的生命周期,使 Servlet 在一个受限的安全环境中执行。
6+
7+
Servlet 规范旨在让开发者基于规范开发的应用,可以部署在任意满足规范的 Web 容器上。每个 Servlet 规范版本都引入了一些新的东西,Servlet 4.0 前的版本变更可查看 [java-servlet-version-history](https://www.codejava.net/java-ee/servlet/java-servlet-version-history)
8+
9+
目前常见的 Servlet 规范就是 [Servlet 3.1](https://github.com/waylau/servlet-3.1-specification/blob/master/docs), Tomcat 8.x 版本就是 Servlet 3.1 版本,从 Servlet 5.0 开始,Java EE 更名为 Jakarta EE,包路径从 **javax** 改为 **jakarta**。目前最新 Servlet 规范为 Jakarta Servlet 6.1,可前往 https://jakarta.ee/specifications/servlet/ 查看。
10+
11+
这也是为什么我们有两种版本,Servlet/JakartaServlet、Filter/JakartaFilter、Listener/JakartaListener。
12+
13+
## Servlet 三大 Web 组件
14+
15+
<Cards>
16+
<Card
17+
href="/docs/servlet/servlet"
18+
title="Servlet 内存马"
19+
>创建独特的 entrypoint 访问路径</Card>
20+
<Card
21+
href="/docs/servlet/filter"
22+
title="Filter 内存马"
23+
>过滤器,遇事不决写点特别的东西然后中断请求</Card>
24+
<Card
25+
href="/docs/servlet/listener"
26+
title="Listener 内存马"
27+
>监听器,请求创建时触发,拿请求体和响应体做不该做的事情</Card>
28+
</Cards>
29+
30+
## ServletContext
31+
32+
> [Servlet 3.1 规范 - 4.1 ServletContext 接口介绍](https://github.com/waylau/servlet-3.1-specification/blob/master/docs/Servlet%20Context/4.1%20Introduction%20to%20the%20ServletContext%20Interface.md)
33+
34+
ServletContext 定义了 Servlet 运行的 Web 应用视图,一个 Web 应用对应一个 ServletContext。
35+
36+
ServletContext 必须支持编程式添加 Servlet、Filter 和 Listener,对框架开发者有用处。但是规定了这些方法只能在 ServletContextListener.contexInitialized 或 ServletContainerInitializer.onStartup 应用初始化的时候调用。
37+
38+
```java
39+
addServlet(String servletName, String className);
40+
addServlet(String servletName, Servlet servlet);
41+
addServlet(String servletName, Class <? extends Servlet> servletClass);
42+
addFilter(String filterName, String className);
43+
addFilter(String filterName, Filter filter);
44+
addFilter(String filterName, Class <? extends Filter> filterClass);
45+
void addListener(String className);
46+
void addListener(T t);
47+
void addListener(Class <? extends EventListener> listenerClass);
48+
```
49+
50+
这就是在注入内存马时我们需要先拿 Context 的原因(已经写在了 Servlet 规范里面啦),所以针对实现了 Servlet 规范的 Web 容器都是一个套路,并且该反射调用哪些方法也写在里面了。不过在实现的时候却写了那么多代码的原因就是,其规定了这些方法只能在应用初始化的时候调用,我们注入内存马的时候已经是应用运行时了,那些代码实际上就是将方法内的具体实现重新用反射实现一遍。

web/content/docs/servlet/meta.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"title": "Java Servlet 规范内存马",
3+
"pages": [
4+
"servlet",
5+
"filter",
6+
"listener"
7+
]
8+
}
Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,9 @@
22
title: Servlet 内存马
33
---
44

5-
Java SE 中我们可以创建 socket 服务端为用户提供服务,但需要用户使用 socket 客户端,当然也可以基于 socket 实现 HTTP 协议,WebFlux 就是这样子的存在。而在 Java EE 中,Java 制定了 Servlet 规范,来规范在 Java 中提供 HTTP 服务的编写方式,其中有两个重要的概念,Servlet 与 Servlet Container。Servlet 是基于 Java 的 Web 组件,由容器进行管理,提供动态内容。Servlet 容器用于提供基于请求/响应发送模式的服务,必须支持 HTTP,并且管理 Servlet 的生命周期,使 Servlet 在一个受限的安全环境中执行。
5+
> [Servlet 3.1 规范 — 什么是 Servlet](https://github.com/waylau/servlet-3.1-specification/blob/master/docs/Overview/1.1%20What%20is%20a%20Servlet.md)
66
7-
Servlet 规范旨在让开发者基于规范开发的应用,可以部署在任意满足规范的 Web 容器上。每个 Servlet 规范版本都引入了一些新的东西,Servlet 4.0 前的版本变更可查看 [java-servlet-version-history](https://www.codejava.net/java-ee/servlet/java-servlet-version-history)
8-
9-
目前常见的 Servlet 规范就是 [Servlet 3.1](https://github.com/waylau/servlet-3.1-specification/blob/master/docs), Tomcat 8.x 版本就是 Servlet 3.1 版本,从 Servlet 5.0 开始,Java EE 更名为 Jakarta EE,包路径从 javax 改为 jakarta。目前最新的 Servlet 规范是 [Servlet 6.1](https://jakarta.ee/zh/specifications/servlet/6.1/)。另外可以 [在此](https://tomcat.apache.org/whichversion.html) 查看 Tomcat 容器支持的 Servlet 规范版本。
10-
11-
## ServletContext
12-
13-
> [Servlet 3.1 规范 - 4.1 ServletContext 接口介绍](https://github.com/waylau/servlet-3.1-specification/blob/master/docs/Servlet%20Context/4.1%20Introduction%20to%20the%20ServletContext%20Interface.md)
14-
15-
ServletContext 定义了 Servlet 运行的 Web 应用视图,一个 Web 应用对应一个 ServletContext。
16-
17-
ServletContext 必须支持编程式添加 Servlet、Filter 和 Listener,对框架开发者有用处。但是规定了这些方法只能在 ServletContextListener.contexInitialized 或 ServletContainerInitializer.onStartup 应用初始化的时候调用。
18-
19-
```java
20-
addServlet(String servletName, String className);
21-
addServlet(String servletName, Servlet servlet);
22-
addServlet(String servletName, Class <? extends Servlet> servletClass);
23-
addFilter(String filterName, String className);
24-
addFilter(String filterName, Filter filter);
25-
addFilter(String filterName, Class <? extends Filter> filterClass);
26-
void addListener(String className);
27-
void addListener(T t);
28-
void addListener(Class <? extends EventListener> listenerClass);
29-
```
30-
31-
这就是在注入内存马时我们需要先拿 Context 的原因(已经写在了 Servlet 规范里面啦),所以针对实现了 Servlet 规范的 Web 容器都是一个套路,并且该反射调用哪些方法也写在里面了。不过在实现的时候却写了那么多代码的原因就是,其规定了这些方法只能在应用初始化的时候调用,我们注入内存马的时候已经是应用运行时了,那些代码实际上就是将方法内的具体实现重新用反射实现一遍。
7+
Servlet 是基于 Java 的 Web 组件,由容器进行管理,提供动态内容。
328

339
## HttpServlet
3410

web/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@
2626
"fumadocs-ui": "16.2.4",
2727
"i18next": "^25.7.2",
2828
"isbot": "^5.1.32",
29-
"lucide-react": "^0.560.0",
29+
"lucide-react": "^0.561.0",
3030
"motion": "^12.23.26",
3131
"radix-ui": "^1.4.3",
32-
"react": "^19.2.1",
32+
"react": "^19.2.3",
3333
"react-copy-to-clipboard": "^5.1.0",
34-
"react-dom": "^19.2.1",
34+
"react-dom": "^19.2.3",
3535
"react-hook-form": "^7.68.0",
36-
"react-i18next": "^16.4.1",
36+
"react-i18next": "^16.5.0",
3737
"react-medium-image-zoom": "^5.4.0",
3838
"react-syntax-highlighter": "^16.1.0",
3939
"sonner": "^2.0.7",
@@ -46,7 +46,7 @@
4646
"@react-router/dev": "^7.10.1",
4747
"@tailwindcss/vite": "^4.1.18",
4848
"@types/mdx": "^2.0.13",
49-
"@types/node": "^25.0.0",
49+
"@types/node": "^25.0.1",
5050
"@types/react": "^19.2.7",
5151
"@types/react-copy-to-clipboard": "^5.0.7",
5252
"@types/react-dom": "^19.2.3",

0 commit comments

Comments
 (0)