本文为一些列连载文章之一,不定期更新,计划目录如下:
OWASP介绍
SQL注入
命令注入
XML外部实体注入
XPATH注入
反射式、DOM及存储XSS
失效的身份认证和会话管理
不安全的直接对象引用
安全配置错误
敏感信息泄露
功能级访问控制缺失
跨站请求伪造
服务端请求伪造
文件上传漏洞
未验证的重定向和转发
不安全的反序列化
使用含有已知漏洞的组件
一、 注入
注入攻击漏洞,例如SQL,OS 以及 LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。
Xpath注入
漏洞利用演示
页面功能:通过用户名查询对应用户的电话号码。用户名和电话号码存储在XML文件中。XML文件内容如下:
正常查询和恶意利用结果对比如下:
漏洞危害说明
用户输入的字符被用于XPATH的查询表达式中,这些恶意编造的字符会获取XML文件中非授权数据,从而用于执行身份验证、数据使用或者其它操作等;
漏洞代码分析
publicvoiddoPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { File f= new File("D:\\Tomcat-7.0.55\\webapps\\owasp\\xml\\telphone.xml"); xpath_bad(request,response, f);} privatevoidxpath_bad(HttpServletRequest request, HttpServletResponseresponse, File f) throws ServletException,IOException { Stringlname = request.getParameter("username1"); String xpath = "/user_name_phone/user[name='" + lname + "']/phone"; SAXReadersaxReader = new SAXReader(); Documentdocument = null; try { document= saxReader.read(f); } catch(DocumentException e) { e.printStackTrace(); } Elementroot = document.getRootElement(); List> list =root.selectNodes(xpath); Iterator>iter = list.iterator(); Stringstr = ""; if(!iter.hasNext()) { str= "用户不存在!"; request.setAttribute("xname",lname.toString()); request.setAttribute("xphone",str.toString()); } else { while(iter.hasNext()) { Elementelement = (Element) iter.next(); Stringtelno = element.getText(); Stringtelname = element.getParent().elementText("name"); str= str + telname.toString() + ":" +telno.toString() + "; "; } request.setAttribute("xname",lname.toString()); request.setAttribute("xphone",str.toString()); } request.getRequestDispatcher("/jsp/xpath_sqldemo.jsp").forward(request, response);}
用户输入的数据,未进行任何合法性验证,直接代入执行了Xpath查询。如果用户输入了恶意数据,如wah’ or ‘1’=’1,则查询表达式为:/user_name_phone/user[name='wah' or'1'='1']/phone,表示查询所有用户的电话号码。漏洞代码修复
用户输入的XPATH查询数据,在服务端正式处理前,进行合法性验证;
对用户输入数据中的单引号和双引号进行转义,避免用户恶意输入的单引号或双引号被当成XPATH查询表达式的分隔符解释;
屏蔽XPATH查询时的出错信息;
参数化XPath查询:将需要构建的XPath查询表达式,以变量的形式表示,变量不是可以执行的脚本。
防止Xpath注入可使用:
a.使用ESAPI提供的方法对输入进行验证
publicvoiddoPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { File f = new File("D:\\Tomcat-7.0.55\\webapps\\owasp\\xml\\telphone.xml"); xpath_good_esapi(request,response, f);}
privatevoidxpath_good_esapi(HttpServletRequest request,HttpServletResponse response, Filef) throws ServletException, IOException { Stringlname = request.getParameter("username1"); lname = ESAPI.encoder().encodeForXPath(lname); Stringxpath = "/user_name_phone/user[name='" + lname + "']/phone"; SAXReadersaxReader = new SAXReader(); Documentdocument = null; try { document= saxReader.read(f); } catch(DocumentException e) { e.printStackTrace(); } Elementroot = document.getRootElement(); List>list = root.selectNodes(xpath); Iterator>iter = list.iterator(); Stringstr = ""; if(!iter.hasNext()) { …… } else { …… } request.getRequestDispatcher("/jsp/xpath_sqldemo.jsp").forward(request, response); }
b.自定义校验方法过滤特殊字符
privatevoidxpath_good(HttpServletRequest request,HttpServletResponse response, File f) throwsServletException,IOException { Stringlname = request.getParameter("username1"); Stringxpath = "/user_name_phone/user[name='" + lname + "']/phone"; try { if (checkValueForXpathInjection(lname)) { …… }else{ …… } } catch (Exceptione) { e.printStackTrace(); } } publicboolean checkValueForXpathInjection(String value) throws Exception { boolean isValid = true; if ((value != null) &&!"".equals(value)) { StringxpathCharList = "()='[]:,*/ "; StringdecodedValue = URLDecoder.decode(value, Charset.defaultCharset().name()); for (char c :decodedValue.toCharArray()) { if(xpathCharList.indexOf(c) != -1) { isValid= false; break; } } }
了解新钛云服
新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照
深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资
原电讯盈科中国区副总裁加入新钛云服「附专访」
新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁
新钛云服一周年,完成两轮融资,服务五十多家客户
上海某仓储物流电子商务公司混合云解决方案
新钛云服出品的部分精品技术干货
国内主流公有云VPC使用对比及总结
万字长文:云架构设计原则|附PDF下载
刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!
Ceph OSD故障排除|万字经验总结
七个用于Docker和Kubernetes防护的安全工具
运维人的终身成长,从清单管理开始|万字长文!
OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等
什么是云原生?
IT混合云战略:是什么、为什么,如何构建?