2025年渗透测试面试题总结-13(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。
目录
八十一、JNI 函数在 Java 中函数名为 com.didi.security.main ,C 中的函数名是什么样的?
八十二、Frida 和 Xposed 框架?
八十三、SSRF 利用方式?
八十四、宏病毒?
八十五、APP 加壳?
八十六、勒索软件 WannaCry 的特征?蠕虫、僵尸病毒
八十七、ARM32 位指令中,返回值和返回地址保存在哪个寄存器中?
八十八、HTTPS 握手过程中用到哪些技术?
八十九、Linux 中 PHP 环境,已知 disable_functions=exec,passthrupopen,proc_open,shell_exec,system,请写出两种有可能实现任意命令执行的方式?
方法一:利用 mail() 函数 + sendmail 命令注入
方法二:利用 LD_PRELOAD + 自定义共享库注入
八十一、 JNI 函数在 java 中函数名为 com.didi.security.main,C 中的函数名是什么样的?八十二、Frida 和 Xposed 框架?八十三、SSRF 利用方式?八十四、宏病毒?八十五、APP 加壳?八十六、勒索软件 Wanacry 的特征?蠕虫、僵尸病毒八十七、ARM32 位指令中,返回值和返回地址保存在哪个寄存器中?八十八、HTTPS 握手过程中用到哪些技术?八十九、Linux 中 PHP 环境,已知 disable_functions=exec,passthrupopen,proc_open,shell_exec,system,九十、请写出两种有可能实现任意命令执行的方式?
八十一、JNI 函数在 Java 中函数名为
com.didi.security.main
,C 中的函数名是什么样的?Java 中通过 JNI 调用本地方法时,其对应的 C 函数名需要遵循 JNI 的命名规则。以
com.didi.security.main
为例,假设这是一个 native 方法,其 C 函数名为:Java_com_didi_security_main_XXXX
其中:
Java_
是固定前缀。com_didi_security_main
是类名(com.didi.security.main
)中将.
替换为_
。XXXX
是方法名,例如methodName
,若方法有重载,则会附加参数签名。示例: Java 方法定义:
java
public native void test();
对应的 C 函数名:
c
JNIEXPORT void JNICALL Java_com_didi_security_main_test(JNIEnv *env, jobject obj)
深层解读:
- JNI 函数的命名规则确保类名和方法名在 C 层唯一映射,避免命名冲突。
- 函数签名中还包含
JNIEnv*
和jobject
(或jclass
)两个参数,用于与 JVM 交互。- Android 中可通过
javah
或javac -h
生成头文件,自动生成函数原型。
八十二、Frida 和 Xposed 框架?
1. Frida 框架:
Frida 是一个动态插桩工具,支持多种平台(Android、iOS、Windows、Linux 等),通过注入 JavaScript 脚本实现对运行中进程的 Hook、内存读写、函数调用等操作。
特点:
- 支持远程调试、Hook 函数、修改运行时行为。
- 支持 Python 和 JavaScript API。
- 可用于逆向工程、漏洞挖掘、动态调试、绕过反调试等。
2. Xposed 框架:
Xposed 是 Android 平台上的模块化 Hook 框架,通过修改 Zygote 初始化逻辑,使得模块可以在 App 启动前注入并 Hook 任意类和方法。
特点:
- 仅支持 Android(需 Root 权限或 Magisk)。
- 提供
XposedBridge
接口,开发者可编写模块 Hook 系统或 App 行为。- 常用于修改系统行为、去广告、功能增强、测试等。
对比总结:
特性 Frida Xposed 平台 多平台(含 Android) 仅 Android 是否需 Root 否(但功能受限) 是 语言支持 JS、Python Java Hook 粒度 更灵活,支持函数级 类级 Hook 调试能力 强大(动态执行) 静态 Hook 模块化
八十三、SSRF 利用方式?
SSRF(Server Side Request Forgery,服务端请求伪造)是指攻击者利用服务器发起请求,从而访问本应受保护的内网或其他资源。
常见利用方式:
- 探测内网资源:
- 通过伪造请求访问本地服务(如 Redis、MySQL、MongoDB、FTP 等)。
- 使用
file://
、dict://
、gopher://
协议读取文件或执行命令。- 攻击内网 Web 服务:
- 访问管理接口(如
/admin
)、内网后台服务(如 Jenkins、GitLab、Docker API)等。- 读取本地文件:
- 利用
file:///etc/passwd
等协议读取敏感配置文件。- 发起端口扫描:
- 通过不同端口返回的状态码判断是否存在开放服务。
- 利用 Gopher 协议执行命令:
- 如攻击 FastCGI、Redis、Memcached 等服务,通过构造 Gopher 请求达到远程代码执行。
- 绕过访问控制:
- 利用服务器作为跳板,访问被防火墙保护的资源。
防御建议:
- 白名单限制请求域名或 IP。
- 禁用不必要的协议(如 gopher、dict)。
- 设置访问超时、限制重定向次数。
- 对请求地址进行 URL 解析和校验。
八十四、宏病毒?
宏病毒是一种利用文档自动化脚本(如 Microsoft Office 的 VBA 宏)实现传播和攻击的恶意程序。
特征:
- 通常嵌入在
.doc
、.xls
、.ppt
等旧格式文档中。- 利用 AutoOpen、Document_Open 等自动执行宏触发恶意行为。
- 可下载远程载荷、窃取信息、加密文件、传播自身等。
传播方式:
- 钓鱼邮件附件。
- 社交工程诱导启用宏。
- 漏洞利用(如 CVE-2017-0199)。
防御措施:
- 禁用 Office 宏或设置为“通知但禁用”。
- 更新系统和 Office 补丁。
- 使用沙箱或虚拟机打开可疑文档。
- 启用宏行为监控(EDR、SIEM)。
八十五、APP 加壳?
APP 加壳是一种保护 Android 应用程序代码的技术,通过将原始 APK 包裹在另一个“壳”中,运行时解密并加载原始代码,防止反编译和静态分析。
原理:
- 原始 APK 被加密或压缩。
- 加壳程序作为启动器,启动后解密原始 APK 到内存。
- 通过自定义 ClassLoader 加载原始 Dex 文件。
- 执行原始逻辑。
常见功能:
- 防止反编译(DEX 文件加密)。
- 反调试、反 Root、检测调试器。
- 动态加载、混淆入口。
- 插入广告、收集设备信息等。
脱壳方法:
- 内存 dump(如使用 Frida、Xposed、DDMS)。
- Hook 解密函数获取原始 Dex。
- 修改加壳逻辑绕过检测。
- 使用自动化脱壳工具(如 DroidBox、Unpacker)。
八十六、勒索软件 WannaCry 的特征?蠕虫、僵尸病毒
WannaCry 勒索病毒(2017)特征:
- 利用永恒之蓝漏洞(EternalBlue):
- 利用 MS17-010 漏洞(SMB 协议缓冲区溢出)传播。
- 不需用户交互即可远程执行代码。
- 蠕虫传播机制:
- 自动扫描局域网和公网 IP,传播自身。
- 具备自我复制、感染能力,属于蠕虫型病毒。
- 加密文件并勒索比特币:
- 使用 AES+RSA 混合加密算法加密用户文件。
- 显示勒索页面要求支付比特币赎金。
- 具备“开关域名”机制:
- 病毒会尝试访问特定域名,如果能访问则不执行加密。
- 该机制被安全研究人员发现并注册域名遏制传播。
- 僵尸网络功能:
- 感染设备可被远程控制,成为僵尸节点,参与 DDoS 或其他攻击。
影响范围:
- 感染全球超过 20 万台设备,影响医院、政府、企业等关键系统。
防御措施:
- 安装 MS17-010 补丁。
- 关闭不必要的 SMB 服务。
- 定期备份重要数据。
- 使用防病毒软件和入侵检测系统。
八十七、ARM32 位指令中,返回值和返回地址保存在哪个寄存器中?
在 ARM32 架构中,函数调用遵循 ATPCS(ARM Procedure Call Standard)的调用约定。
关键寄存器作用:
寄存器 编号 用途 R0-R3 通用寄存器 用于函数参数传递(最多4个) R0 - 返回值寄存器(通常用于返回整数或指针) R1-R3 - 剩余参数或作为临时寄存器 R4-R11 通用寄存器 用于保存函数内部变量,需调用者保存 R12 IP 临时寄存器,用于中间计算 R13 SP 堆栈指针 R14 LR 链接寄存器,保存返回地址 R15 PC 程序计数器 函数调用流程中的行为:
- 调用函数时,PC 跳转到目标函数入口。
- LR(R14)保存下一条指令地址(即返回地址)。
- 被调用函数处理完成后,使用
BX LR
或MOV PC, LR
返回。特别注意:
- 如果函数嵌套调用,LR 需要压栈保存,防止覆盖。
- 返回值通常保存在 R0 中,若为 64 位整数则使用 R0+R1。
八十八、HTTPS 握手过程中用到哪些技术?
HTTPS 握手过程主要依赖 TLS(Transport Layer Security)协议,分为以下几个阶段:
1. ClientHello:
- 客户端发送支持的协议版本、加密套件、随机数(ClientRandom)等。
2. ServerHello:
- 服务器选择协议版本、加密套件,并发送随机数(ServerRandom)和证书(含公钥)。
3. 证书验证:
- 客户端验证服务器证书是否由可信 CA 签发,是否有效、是否匹配域名。
4. 密钥交换:
- 根据加密套件选择密钥交换方式:
- RSA 密钥交换: 客户端用服务器公钥加密预主密钥(Pre-Master Secret)。
- ECDHE 密钥交换: 客户端和服务器生成临时密钥,进行 Diffie-Hellman 交换,实现前向保密。
5. 生成主密钥(Master Secret):
- 双方使用 ClientRandom、ServerRandom 和 Pre-Master Secret 生成 Master Secret。
6. 会话密钥生成:
- 从 Master Secret 推导出一系列密钥,包括:
- 客户端加密密钥(ClientWriteKey)
- 服务端加密密钥(ServerWriteKey)
- 消息认证码密钥(MAC Key)
7. 客户端和服务端发送
Finished
消息:
- 使用密钥加密握手消息摘要,验证握手过程的完整性。
使用技术总结:
- 非对称加密(RSA、ECC):用于身份认证和密钥交换。
- 对称加密(AES、ChaCha20):用于加密通信数据。
- 消息认证码(HMAC):确保数据完整性。
- Diffie-Hellman(DH、ECDH、DHE、ECDHE):实现安全的密钥交换。
- 数字证书(X.509):用于服务器身份认证。
- 前向保密(PFS):即使长期密钥泄露,也不会影响历史通信安全。
八十九、Linux 中 PHP 环境,已知
disable_functions=exec,passthrupopen,proc_open,shell_exec,system
,请写出两种有可能实现任意命令执行的方式?背景: 该配置禁用了大部分 PHP 命令执行函数,但仍可能通过其他方式绕过限制。
方法一:利用
mail()
函数 + sendmail 命令注入原理: PHP 的
mail()
函数调用系统sendmail
程序发送邮件,若参数可控,可以注入 shell 命令。示例:
php
$to = 'test@example.com'; $subject = 'test'; $message = 'test'; $headers = ''; $additional_params = "-oQ/tmp -X/var/www/cache/pwn.php"; mail($to, $subject, $message, $headers, $additional_params);
说明:
-X
参数可写入日志文件,控制文件内容。- 若可写 Web 目录,可写入 Webshell。
方法二:利用
LD_PRELOAD
+ 自定义共享库注入前提条件:
- 可上传文件。
- 可利用
putenv()
和mail()
或error_log()
触发日志写入。步骤:
- 编写恶意
.so
文件,导出__attribute__((constructor))
函数,实现命令执行。- 上传
.so
到服务器。- 设置环境变量
LD_PRELOAD
指向该.so
文件。- 触发函数调用,加载恶意库,执行命令。
示例 C 代码:
c
#include <stdlib.h> #include <unistd.h> __attribute__((constructor)) void init() { system("touch /tmp/exploit"); }
PHP 利用代码:
php
putenv("LD_PRELOAD=/var/www/html/evil.so"); mail("a@localhost", "test", "test", "", "-f");
说明:
- 该方法依赖服务器配置允许
putenv()
和mail()
使用。LD_PRELOAD
是 Linux 的动态链接库加载机制,可用于注入代码。