常见Web漏洞
1.SQL注入
漏洞成因
- 直接使用SQL语句拼接,将用户传入的参数通过字符串拼接的方式传入查询语句。
示例:String sql = "select * from test where id = " + id;
- 预编译使用有误,没有调用 set 方法将变量与占位符进行对应。
示例:
- String sql = "select * from test where id = ?";
- PreparedStatement pstt = conn.prepareStatement(sql);
- // pstt.setObject(1,id);
复制代码
- 对 % 和 _ 没有进行显示处理, 导致用户可以自行拼接进行模糊查询。
- 不能参数化的位置,还是有可能存在拼接的情况,如order by后面。
示例:String sql = "select * from test where id = ? order by '" + time + "' asc";
- Mybatis中,#{}是预编译处理,${}是字符串替换,使用${}就可能导致SQL注入。
示例:Select * from news where title like '%#{title}%'
审计策略
- 重点关注创建查询的函数如 createQuery()、createSQLQuery()、createNativeQuery()。
- 定位SQL语句上下文,查看是否有参数直接拼接,是否有对模糊查询关键字的过滤。
- 是否使用预编译技术,预编译是否完整,关键函数定位setObject()、setInt()、setString()、setSQLXML()关联上下文搜索set*开头的函数。
- Mybatis中搜索${},因为对于like模糊查询、order by排序、范围查询in、动态表名/列名,没法使用预编译,只能拼接,所以还是需要手工防注入,此时可查看相关逻辑是否正确。
- JPA搜索JpaSort.unsafe(),查看是否用实体之外的字段对查询结果排序,进行了SQL的拼接。以及查看EntityManager的使用,也可能存在拼接SQL的情况。
修复
正确使用预编译;无论是 SQL/HQL/JPQL,都不进行SQL语句字符串拼接;正确理解占位符、预编译、替换、参数注入等形式的使用
2.XXE
漏洞成因
- XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。文档类型定义(DTD)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。当允许引用外部实体时,恶意攻击者即可构造恶意内容访问服务器资源。
示例:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE root [
- <!ENTITY xxe SYSTEM "file:///tmp/aaa">
- ]>
- <root>&xxe;</root>
复制代码
- 使用不可信数据来构造XML会导致XML注入漏洞,如果用户被允许输入结构化的XML片段,则他可以在XML的数据域中注入XML标签来改写目标XML文档的结构与内容
Java中的XXE支持以下协议:http,https,file,ftp,mailto,jar,netdoc,可以利用file协议读取文件,利用http协议探测内网,没有回显时可组合利用file协议和ftp协议来读取文件。如果存在报错的情况下还可以尝试使用报错XXE进行敏感信息的获取。甚至是尝试递归调用造成拒绝服务攻击。
审计策略
XML解析涉及的业务功能点: WebServices接口、RESTful接口、Excel文件解析、Soap协议等。
漏洞触发点就在XML解析时,因此重点审计XML解析器是否设置了相关的安全属性,禁用DTDs或者禁止使用外部实体。还有是否使用了不安全的漏洞组件。部分解析器如下:- javax.xml.parsers.DocumentBuilder
- javax.xml.parsers.DocumentBuilderFactory
- javax.xml.stream.XMLStreamReader
- javax.xml.stream.XMLInputFactory
- org.jdom.input.SAXBuilder
- org.jdom2.input.SAXBuilder
- org.jdom.output.XMLOutputter
- oracle.xml.parser.v2.XMLParser
- javax.xml.parsers.SAXParser
- org.dom4j.io.SAXReader
- org.dom4j.DocumentHelper
- org.xml.sax.XMLReader
- javax.xml.transform.sax.SAXSource
- javax.xml.transform.TransformerFactory
- javax.xml.transform.sax.SAXTransformerFactory
- javax.xml.validation.SchemaFactory
- javax.xml.validation.Validator
- javax.xml.bind.Unmarshaller
- javax.xml.xpath.XPathExpression
- java.beans.XMLDecoder
复制代码 修复
为了防御XXE漏洞, 较为有效的处理方式是开发者在不影响系统业务的前提下做好安全配置。如果系统业务需要引用外部实体,应在后端做好参数校验。此外,有许多第三方组件曾被爆出XXE漏洞(例如,Spring-data-XMLBean、JavaMelody组件XXE、Apache OFBiz.微信支付SDK-XXE ),关注这类安全问题,避免因为使用第三方组件而引入XXE漏洞。
3.XSS
漏洞成因
对于用户传递参数,没有进行过滤,导致恶意攻击者可以插入一些恶意的js语句、标签、frame等来获取应用或用户的敏感信息。
审计策略
审计过程要点还是定位用户的输入输出,也就是梳理数据交互以及前端展示的过程。找到一条完整的利用链之后,就是结合现有的安全措施(输出编码、过滤器等)进行判断,例如是否存在绕过的可能,或者是没有任何安全防护可直接造成攻击。
下面是一些可以快速定位的关键字:
[code] |