Xpath注入问发生在网站使用用户的信息查询XML数据时,通过发送异常信息,攻击者可以获取到敏感信息。在如果是认证
报文,攻击者可能通过XML文件提升自己的网站权限。
与SQL注入类似,存在Xpath注入的原因在于对敏感字符(串)限制不严。Xpath解析器存在松散输入和容错特性,在正常表单后附加恶意查询代码,造成敏感信息的泄露。
在服务器端构造XPath查询语句之前,对提交的数据进行合法性校验,对特殊字符进行转义和替换。如进行XQuery参数化查询。
declare variable $username as xs:string extenal;
declare variable $password as xs:string extenal;
users/user[@username=$username and @password=$password]
调用XQuery,传参:
private boolean doLogin(HttpServletRequest request) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
String userName=request.getParameter("username");
String password=request.getParameter("userpass");
DocumentBuilderFactory domFactory=DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder=domFactory.newDocumentBuilder();
Document doc=builder.parse(request.getRealPath("WEB-INF")+"/users.xml");
XQuery xquery=new XQueryFactory().createXQuery(new File(request.getRealPath("WEB-INF") + "/login.xq"));
Map queryMap=new HashMap();
queryMap.put("username",userName);
queryMap.put("password", password);
Object result = xquery.execute(doc,null,queryMap).toNodes();
NodeList nodes=(NodeList)result;
return (nodes.getLength()>=1);
}
XML外部实体注入,英文XML External Entity Injection,所以又称XXE。
针对XML终端实施的攻击,漏洞产生的原因是在于XML1.0标准引入“entity”概念,而且“entity”可以在预定义的文档中进行调用,XXE漏洞的利用原理在于通过实体标识访问本地或者远程内容。
解析XML数据时,限制DTDs(doctypes)参数的解析可以解决此问题。
规范代码示例:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击
String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
dbf.setFeature(FEATURE, true);
}catch (ParserConfigurationException e) {
// This should catch a failed setFeature feature
...
}catch (SAXException e) {
// On Apache, this should be thrown when disallowing DOCTYPE
...
}catch (IOException e) {
// XXE that points to a file that doesn't exist
...
}