Day2_J2EE安全开发.ppt_第1页
Day2_J2EE安全开发.ppt_第2页
Day2_J2EE安全开发.ppt_第3页
Day2_J2EE安全开发.ppt_第4页
Day2_J2EE安全开发.ppt_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

J2EE安全开发杭州安恒信息技术有限公司 Java代码编码安全代码框架安全 2 一 开发中常见漏洞介绍及示例说明和可参考的解决方法 Web通用 XSS CSRF SQL注入 文件上传等J2EE特点所致 组件信息泄露 安全目录绕过等 4 Web通用 XSS描述 攻击者对应用的页面注入恶意脚本 通常是指html脚本 然后在页面执行这个恶意脚本 到达攻击目的 通常类型 反射型 存储型两大类 还有些如 所谓的DOM型等 示例 一个用户输入并在页面输出的简单功能在jsp里的实现 servelt或框架实现同理 Nebula jsp伪代码 demo 注入的Javascript脚本被解析执行 形成一个反射型XSS 危害 对于一般应用 用户cookie盗取 普通用户及管理员登录cookie 非法登录应用 例如 tomcat与浏览器身份验证的sessionid是已cookie的形式存储浏览器客户端 对于大量用户交互的大型应用 如 SNS站点 可形成蠕虫 严重影响业务 如 1 历史第一个XSS蠕虫是针对网站MySpace的Samy 20小时内感染了100万个账户 2 Sina微博XSS蠕虫攻击事件的HelloSamy 16分钟受影响用户就达到将近33000个 Java开发中 可参考的解决方法示例 针对 输入 与 输出 方式 如输入 Stringinput request getParameter input 输出 out print 我的输入 input 对Input参数的Html标签进行转义一般的业务逻辑代码流程 输入 数据存储 如 存入DB 输出存储型XSS 如 存入DB 同一应用一般情况 危害性存储型大于反射型XSS 特点 隐蔽性强 数据的流向不确定 如 数据可能被其他应用调用 等 一般选择 输入 处理方式 伪代码 输入 Stringinput request getParameter input 对html标签转义的逻辑代码 其他业务逻辑 如 数据存储 输出 out print 我的输入 input 参数值转义html标签的伪代码示例 publicstaticStringfilter Stringstr if str null return null charcontent newchar str length str getChars 0 str length content 0 StringBuilderresult newStringBuilder content length 50 for inti 0 i result append 14 但可能有些标签在实际开发需要显示输出 如 标签 影响到正常业务 就可以使用HTTPOnly方式防御 jsp显示模版示例伪代码 response setHeader Set Cookie cookiename value Path Domain domainvalue Max Age seconds HTTPOnly 设置HTTPOnly后 js域就无法获取cookie了 缓解危害 16 17 18 建议 对于java开发者 在java代码层面防御基本够了 如果想要更深层次的防御 就要做应用整体的安全架构或者使用防护系统 那不是java开发者该考虑的问题 19 Web通用 CSRF跨站请求伪造 意思就是迫使被攻者的浏览器向一个容易攻击的Web应用发送请求 最后达到攻击者所需要的操作行为 劫持用户操作 20 示例 某个添加管理员的功能 只要管理员访问下面的url 就可以创建一个管理员 http localhost 8080 CSRF user ah logo create user name csrf passWord csrf age 12 birthday 1970 01 01 note test攻击者 想办法让管理员访问这个地址例如 使用htmlimg标签在管理员经常访问的网站页面嵌入下面的攻击代码 22 23 24 25 实现攻击有两个基本条件 1 攻击者必须非常熟悉被攻击的应用2 被攻击应用的用户必须是登录状态 实际中 重要功能操作权限须有登录状态 危害 实际危害决定于CSRF对应用中功能操作后对业务的影响 通常情况CSRF结合XSS同时使用 才会产生更大的危害 例如 XSS蠕虫 26 Java开发中 可参考的解决方法示例 通常是使用referer或token验证访问来路的正确性 个人觉得referer是web服务器层面上的部署防御 应用代码层面应该使用token token防御原理示例 访问到添加管理员用户的页前 http localhost 8080 CSRF user ah logo add 添加一个session值 它是一个不可预测的字符串 例如 随机生成的hash值 9be5a474bec04c4db756db82c98af24a 伪代码示例 在添加页面保存这个token值 如 hidden类型的input标签 伪代码 验证失败 进入其他逻辑处理 例如 跳转CSRF攻击提示 伪代码 正常操作 CSRF 如果想全局防御 我们也可以在Filter 过滤器 实现这个功能 一些MVC模式的框架已经实现这种安全功能 例如Struts2 其实是防止重复提交的一个机制 配置及伪代码示例 struts xml csrf jsp success jsp管理员创建页面配置 添加strust2的token标签 页面会生成一个token值 并保存到session中 伪代码 提交后 配置的tokeninterceptor 拦截器 获取这个struts token名 到session中去找这个值并验证 实现与上文中原理是一样的 当然 struts2有些低版本存在这个机制安全绕过的情况 http struts apache org release 2 3 x docs s2 010 htmlstruts token name的值会作为key到session中找这个key对应值 这在与页面提交struts token值进行对比 绕过的原因是因为struts token name是可以在外部被控制 而实际开发中我们会大量使用session存储数据 且key有时是可预的 伪代码例如 建议 如果不想全局防御所有功能请求 或者一般应用 对业务功能的重要操作进行防御基本够了 如对数据的操作 我们只要考虑这些操作 C 增加 U 修改 D 删除 Web通用 SQL注射 从外部参数输入可以控制执行sql语句的结构 开发人员sql语句参数使用了拼接方式 MySqlJDBC简单示例 http localhost 8080 demo mysql jsp id 1 使用 单引号让程序报sql异常 说明外部传入的参数可以直接控制sql语句的结构 http localhost 8080 demo mysql jsp id 1 20 20union 20select 201 2 current user 28 29 构造sql语句获取数据库信息 如 读取数据库当前用户信息 读取其他表的数据 http localhost 8080 demo mysql jsp id 1 20 20union 20select 201 2 20 28select 20load file 28 22c BOOT INI 22 29 29 根据权限读取系统文件 http localhost 8080 demo mysql jsp id 1unionselect1 2 webshell intooutfile c 1 jsp 写入文件 例如 写入一个webshell 危害 除了数据被窃取外 根据当前权限及不同的数据库类型 还可以读 写文件 执行系统命令或权限提升 在安全角度 特别是web安全 安全是以数据为中心的 所以sql注入漏洞是最接近数据的一个典型漏洞 Java开发中 可参考的解决方法示例 使用预编译占位符方式 多条件查询 可以使用占位符拼接方式 伪代码如 Stringsql select fromnewswhere1 1 if 关键字查询匹配key1 sql append andkey1 elseif 关键字查询匹配key2 sql append andkey2 J2EE持久层框架 处理示例 Hibernate使用占位符参数绑定 伪代码如 select fromnewswherekey key1或select fromnewswherekey iBatis MyiBatis 伪代码如 select fromnewswherekey key1 Web通用 文件上传 文件上传服务器端验证 存在问题代码的伪代码示例 我们知道容器能够解析的脚本文件的后缀名 是不能上传的 黑名单验证 绕过问题一 如果StringfileName 1 rar jsp fileName indexOf 截取的第一个点开始字符串 截取后值为 fileType rar jsp 绕过黑名单列表 正确应该使用fileName lastIndexOf 绕过问题二 fileType equals suffix i 比如 有时候一些web容器解析文件名时 可能忽略大小写后缀名 比如 多个容器类型映射一个应用目录时 同时能够解析php文件 StringfileName 1 PHP 后缀名全部大写 从而绕过黑名单 因为equals严格大小写的 正确方式 使用equalsIgnoreCase 忽略大小写校验 Web通用 任意文件下载 J2EE伪代码示例 File类文件输出流实现方式 filepath request getParameter path Filefile newFile filepath 文件输出流逻辑代码 使用 关键字进行路径回溯 伪url示例如 上面是可以控制绝对路径 可下载任意文件 伪url示例 如果filepath限制了路径 如 filepath xxx filepath request getParameter path 可参考处理方式 尽量不使用外部参数传入方式 如果开发时 需要使用外部参数传入方式 逻辑代码增加一层 使用key去找value 示例如 J2EE特点所致 组件信息泄露 看到这段异常 从sql信息到使用的框架信息及web服务器信息全部暴露了 编码时 养成截取异常信息并存储到日志文件里的好习惯 不要在页面显示出来 Java抛异常的特点 可能导致攻击者的攻击成本降低 J2EE特点所致 安全目录绕 META INF及WEB INF是Java的WEB应用的安全目录 客户端无法访问 只有服务端可以访问的目录 比如 我们使用servlet是可以访问到的 在一个页面跳转功能servlet实现的伪代码示例 Stringpath request getParameter path RequestDispatcherrd request getRequestDispatcher path rd forward request response 比如 我们使用servlet是可以访问到的 在一个页面跳转功能servlet实现的伪代码示例 Stringpath request getParameter path RequestDispatcherrd request getRequestDispatcher path rd forward request response 读取容器启动时加载的配置文件 WEB INF web xml 根据配置web xml读取其他配置文件 包括数据库配置文件 及class文件 class文件反编译就是业务逻辑的源代码了 Java代码编码安全代码框架安全 64 J2EE框架安全这里主要介绍外层流行框架Struts2MVCframework Springframework 1 OGNL使用安全 3 Struts2的动态方法调用 DynamicmethodInvocation 及方法命名习惯 4 Struts2标签使用 与基础漏洞原理一样 5 spring信息泄露及远程代码执行相关示例 2 struts2远程代码执行相关示例 1 OGNL使用安全 Struts2 核心代码webWork核心代码 核心Xwork OGNL ObjectGraphNavigationLanguage对象图导航语言 OGNL有这几个危险机制 例如 new一个对象执行系统命令 OGNL存对象时 例如 调用静态方法执行系统命令 OGNL取对象时 所以使用OGNL存储对象时 如 Ognl setValue 外部参数 执行的参数是由外部传入 那这样是危险的 造成远程代码执行漏洞 Struts2一系列远程代码执行漏洞 都是在功能设计时 安全过滤不严格及OGNL滥用造成的 所以 你们在使用OGNL设计功能的时候千万不能学习Struts2官方 2 struts2远程代码执行相关示例 第一个是2010年7月14号 Struts2 XWork 2 2 0远程执行任意代码漏洞 POC示例 u0023 memberAccess allowStaticMethodAccess meh true asdf u0023rt exit 1 u0023rt u003d java lang Runtime getRuntime 1 OgnlContext的属性 xwork MethodAccessor denyMethodExecution 默认为真 SecurityMemberAccess私有字段 allowStaticMethodAccess 默认为假 Struts2安全限制 allowStaticMethodAccess 是否开启静态方法调用 xwork MethodAccessor denyMethodExecution 是否禁用方法调用 需要使用 调用这些字段或属性 但外部输入是不允许使用 的 的16进制编码 u0023 也包括8进制编码 绕过安全限制 最终调用静态方法执行命令 java lang Runtime getRuntime exit 1 终止当前正在运行的Java虚拟机 第二个 ApacheStrutsS2 016 S2 17 远程代码执行及url跳转漏洞 xxx action action xxx action redirect xxx action redirectAction action redirect redirectAction 这三个关键字 是设计出来做短地址导航的 但在设计功能时滥用OGNL 只要带这样的关键字 OGNL表达式代码 框架就会把中间的代码作为OGNL表达式执行 执行系统命令添加用户示例 S2 17url跳转漏洞 可其利用钓鱼 3 Struts2的动态方法调用 DynamicmethodInvocation 及方法命名习惯 三种方式 第一种方式 设置method属性 如 LoginAction类 publicStringlogin xml配置文件 success jsperror jsp第二种方式 改变action的设置在使用action后面使用 感叹号调用action中的login方法 如 userLogin login 第三种方式 使用通配符 success jsp error jsp 开发人员习惯了使用struts2的感叹号方式的动态方法调用 进行业务逻辑编码 如 add user 例如 注册功能的实现 在同一类中实现 一个数据表对象的CRUD操作 C 增加即注册 及U 修改 用户权限 而R List查询 D 删除 管理员权限 为代码 根据特征 J2EE开发者在学习之初 特别是框架学习 对add getList delete等类型关键字产生依赖 马上就能猜解 当然 它本质是没有做权限处理 struts2可以使用拦截器 Interceptor 对每个要执行方法做权限验证 如果开发人员觉得这样的要求太高 对于类似的CRUD有权限要求的业务逻辑 最好不要在同一类中实现代码 并且不要使用有规则的方法命令 4 Struts2标签使用 与基础漏洞原理一样 Incl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论