pikachu-XSS(跨站脚本攻击)

发布于:2022-11-09 ⋅ 阅读:(10) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

XSS(跨站脚本攻击)

1、反射型XSS(get)

3、存储型XSS

4、DOM型XSS

5、DOM型XSS-X

6、XSS之盲打

7、XSS之过滤

8、xss之htmlspecialchars

9、XSS之href输出

10、XSS之JS输出


XSS(跨站脚本攻击)

         全称跨站脚本(Cross Site Scripting)是web中最为常见的漏洞之一,也是危害特别大的一种漏洞,一直高居漏洞排行榜的前几名。XSS漏洞的成因是没有对WEB前端的输入边界尽心严格的过滤,造成攻击者可以通过构造脚本语言使得输入的内容 被当成正常的HTML来执行(类似于SQL注入),从而产生危害。xss漏洞危害的对象主要是前端用户,并且可以用来进行钓鱼、前端js挖矿、用户cookie获取、甚至可以结合浏览器自身的漏洞对主机进行远程控制等

XSS(窃取cookie)攻击流程

    攻击者发现存在xss漏洞的站点插入js脚本等待用户访问

    用户访问xss页面,触发脚本,返回带有恶意js的页面

    执行脚本,发送窃取数据(cookie)到攻击者

    伪造用户登录,造成破坏

XSS漏洞常见类型

    反射性

    交互的数据一般不会被存在数据库里,一次性所见即所得,一般出现在查询类页面等

    存储型

交互的数据被存储在数据库里,永久性存储,一般出现在留言板、注册等页面

DOM型

    不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性。也属于反射型的一种

XSS漏洞测试流程

    1、在目标站点上找到输入点,比如查询接口、留言板等;

    2、输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是都有对应的处理

    3、通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造js的条件(构造闭合)

    4、提交构造较稳的代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在xss漏洞

    5、一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS

    6、由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器)

    7、通过变化不通的script,尝试绕过后台过滤机制

1、反射型XSS(get)

首先尝试输入代码, 发现只能输入20个字符

F12可以打开网页的代码

修改为更大的数值,然后继续输入代码:

<script>alert("www.baidu.com")</script>

直到弹窗出现,可以构造带有payload的URL来进行诱导用户的点击。

  1. 反射型XSS(post)

首先输入admin/123456登录

输入脚本攻击的代码(用来获取用户的cookie):

<script>alert(document.cookie)</script>

3、存储型XSS

存储型XSS和反射型XSS形成的原因是一样的,不同的是存储型XSS下攻击者的可以将脚本注入到后台存储起来,构成更加持久的危害

直接输入payload:

<script>alert(document.cookie)</script>

再插入payload以后,每次刷新都会出现cookie值,所以是存储型XSS,已经生成数据库了。

4、DOM型XSS

造成DOM型XSS的原因是前端的输入被DOM给获取到了,通过DOM又在前端输出,跟反射型和存储型比起来,它是不经过后台交互的。

HTML-DOM

查看源码分析:

需要闭合<a>标签,

直接输入构造的payload代码:

#' οnclick=alert("www.baidu.com")>

然后点击下面的链接what do you see:

5、DOM型XSS-X

构造一样的payload进行攻击:

#' οnclick=alert("www.baidu.com")>

出现下方的文字链接,点击即可出现诱导性的弹窗。

6、XSS之盲打

首先在留言框输入payload:

<script>alert(document.cookie)</script>

通过URL进入管理后台

点击登录即可看见弹窗

7、XSS之过滤

常见过滤绕过方法:

前端限制绕过,直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。

大小写,例如<SCRIPT>aLeRT(“jwt”)</sCRIpt>。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。

双写,例如<scri<script>pt>alert(“jwt”)</scri</script>pt>。后台可能把<script>标签去掉,但可能只去掉一次。

注释干扰,例如<scri<!--test-->pt>alert(“jwt”)</sc<!--test-->ript>。加上注释后可能可以绕过后台过滤机制。

编码,后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定过

输入payload(使用大写的方式绕过):

<SCRIPT>alter("www")</SCRIPT>

弹窗出现

8、xss之htmlspecialchars

htmlspecialchars()PHP里面把预定义的字符转换为HTML实体的函数,这个函数默认情况下是不会编码单引号的

$value = htmlspecialchars($_GET['value'], ENT_COMPAT);

# 2个参数规定了如何处理引号

ENT_COMPAT   # 默认,仅对双引号进行编码

ENT_QUOTES   # 推荐,编码单双引号

ENT_NOQUOTES # 不编码任何引号

单引号闭合<a>标签

键入payload:

' οnclick='alert(111)'

' οnclick='alert(1399)

' οnclick=alert('jwt') '

点击

9、XSS之href输出

使用了都htmlspecialchars函数,><"'&都被HTML实体化,且用户输入的在href标签里,可以使用javascript协议来执行js代码

防御href :

  • 输入的时候只允许 http https 开头的协议,才允许输出
  • 其次再进行htmlspecialchars处理

输入payload

Javascriptalert’www’

点击

10XSSJS输出

用一个单引号和</script>闭合掉页面中的<script>,然后再插入自己的JS代码

直接输入payload:

'</script><script>alert('www')</script>

其他:

'; alert(1); //

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

修复需要注意的问题:

1.这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。

2.所以在JS的输出点应该使用\对特殊字符进行转义

XSS防范

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

部分内容借鉴于:简言之