----------Owasp top 10 2017----------
注入
1. SQL注入
1.Jdbc拼接不当导致sql注入
Jdbc有两种方式执行SQL语句
A.Preparestatement:会对SQL语句进行预编译,
支持?对变量位进行占位,在预编译阶段填入相应的值构造出完整的SQL语句,这样可避免SQL注入。
但开发者有时为了便利,会直接拼接SQL语句,这样则无法阻止SQL注入。
B.Statement:每次执行时都需要编译,增大系统开销
2.框架使用不当造成sql注入
对jdbc进行更加抽象封装的持久化框架,如MyBatis和Hibernate
MyBatis框架将SQL语句编入配置文件中,避免SQL语句在java程序中大量出现,方便对SQL语句的修改和配置。
#和dollor符的区别:
Mybatis使用parameterType向SQL语句传参,在sql引用传参可以使用#{Parameter}和${Parameter}两种方式。
#{Parameter}方式会使用?占位进行预编译,因此不存在sql注入问题
${Parameter}采用拼接的方式构造sql
Hibernate
是java持久化api(jpa)规范的一种实现方式,将java类映射到数据库表中,从java数据类型映射到sql数据类型。
采用hibernate查询语句(HQL)注入
Hibernate的对持久化类的对象进行操作而不是直接对数据库操作,所有hql查询语句由hibernate引擎进行解析,这意味着产生的错误可能来自数据库,也可能来自hibernate引擎。
2. 命令注入
Runtime类可提供调用系统命令的功能
Runtime.getRuntime().exec(xxx)
1.命令注入的局限
连接符
| 前面命令输出结果作为后面命令的输入内容
|| 前面命令失败猜执行后面命令
& 前面命令执行后执行后面命令
&& 前面命令执行成功后才执行后面命令
代码使用ping诊断网络,Url参数可控,用户输入www.baidu.com&ipconfig,拼接出系统命令ping www.baidu.com&ipconfig,该命令在命令行终端可成功执行,然而在java运行环境下,执行失败,因为www.baidu.com&ipconfig被当成完整的字符串而非两条命令。
Runtime.getRuntime().exec(“ping”+url)
2.无法进行命令注入的原因
要执行的命令通过字符串和数组的方式传入exec方法。
当传入的是字符串,会先经过StringTokenizer处理,针对空格及换行符等空白符进行处理,后续会分割出一个cmdarray数组保存分割后的命令参数,cmdarray的第一个元素为要执行的命令,经过处理的www.baidu.com&ipconfig成为ping命令的参数,因此连接符&并不生效,所以没法注入系统命令。
3. 代码注入
4. 表达式注入
1.EL表达式的基础
表达式语言,又称EL表达式,是一种jsp中内置的语言,作用于用户访问页面的上下文以及不同作用域的对象,取得对象属性值或执行简单的运算和判断操作。
CVE-2011-2730 spring标签el表达式漏洞
5. 模板注入
FreeMarker模板注入
失效的身份认证
错误的使用应用程序的身份认证和会话管理功能,使攻击者能破译密码,密钥或者会话令牌,或者利用其他开发漏洞暂时或长久的冒充其他用户身份,导致攻击者可以执行受害者用户的任何操作。
Webgoat8 jwt token猜解实验
根据功能点定向审计
敏感信息泄露
1.系统敏感信息:业务系统本身的基础环境信息,例如系统信息,中间件版本,代码信息
2.应用敏感信息:个人敏感信息和非个人敏感信息
Turbomail 5.2.0敏感信息泄露
开发组件敏感信息泄露:自定义错误页面
XXE
开放人员配置其xml解析功能允许外部实体引用,攻击者可利用这一引发安全问题的配置方式,实施任意文件读取,内网端口探测,命令执行,拒绝服务攻击等
读取系统文件
OpenRASP测试用例
Dos攻击
Blind XXE:数据外带
Parsexml方法
失效的访问控制
横向越权
纵向越权
安全配置错误
不安全的默认配置,不完整的临时配置,开源云存储,错误的http标头配置以及包含敏感信息的详细错误信息所造成的。
可以发生在一个应用程序堆栈的任何层面,包括网络服务,平台,web服务器,应用服务器,数据库,框架,自定义的代码,预安装的虚拟机,容器,存储等。
Tomcat任意文件写入CVE-2017-12615
tomcat处理请求时,默认有两个servlet,一个是DefaultServlet,另一个是JspServlet,配置在tomcat的web.xml中。Jspservlet只处理.jsp和.jspx的请求,其他都是defaultservlet处理。
Tomcat ajp文件包含漏洞CVE-2020-1938
Ajp定向包协议,ajp自身存在一定缺陷,导致存在可控参数,通过可控参数可以导致文件包含漏洞。
Tomcat
两个功能:1. 充当web服务器,对一切静态资源的请求做回应。2. 充当servlet容器。
常见web服务器:apache,nginx,iis
常见servlet容器:tomcat,weblogic,jboss
Spring boot远程命令执行
XSS
不安全的反序列化
在java原生的api中,序列号是ObjectOutputStream类的writeObject()方法实现,反序列化是ObjectInputStream类的readObject()方法实现。
能够被序列化的类必须实现Serializable接口或Externalizable接口。
Serializable
接口是个标记接口,不包含任何方法,Externalizable接口是Serializable的子类,包含writeExternal()和readExternal()方法。
反序列化拓展:
1.Rmi
网络传输过程中,rmi中的对象是通过序列化方式进行编码传输的。
可以通过rmi服务做反序列化利用链的触发点
2.Jndi
Java命令和目录接口,是一组应用程序接口,目的是方便查找远程或本地对象。
Apache commons collections反序列化漏洞
Fastjson反序列化漏洞
使用含有已知漏洞的组件
Weblogic中组件的漏洞
富文本编辑器漏洞
不足的日志记录和监控
Crlf注入漏洞
未记录可审计性事件