Pikachu:XSS

跨站脚本攻击测试流程

1.在目标站点找到攻击点,比如查询框、留言板等
2.输入一组“特殊符号+唯一识别字符”(特殊符号: < / “”+ 唯一识别字符: swny),然后点击提交,查看源码,找到插入点
,然后判断下一步的处理方法。
3.通过搜素定位到唯一字符,结合唯一字符前后语法判断是否需要闭合和查看是否存在过滤(过滤了什么需要怎么解决)
4.提交构造的脚本代码以,看是否可以执行。如果成功执行则说明存在XSS漏洞。

反射型

GET型:
按照流程我们先找到攻击点,也就是那个查询框;然后输入一组特殊字符,查看源码看插入点在哪和是否有过滤措施

这时我们可以看到我们提交的特殊字符插入了p标签并且不需要闭合且没有任何过滤措施。所以我们直接插入我们的脚本即可;
此时发现有长度限制,此时我们可以选择更改输入长度或者bp抓包进行输入即可。
POST型:
同GET

存储型

老规矩按照流程先找到攻击点,输入特殊字符,然后查看源码找到插入点在哪是否需要闭合和是否存在过滤;此时发现特殊字符被插入p标签并且是原封不动的插入所以判断这里不需要闭合且没有过滤所以我们仍是直接注入脚本即可。

此时注入后我们随便留个然后点提交的时候就可以发现我们的cookie已经泄露。但是这样还是不能够凸显我们存储型XSS的危害性,此时我们换一个浏览器登入界面,发现我们的cookie还是会弹出。

XSS盲打

XSS盲打指的是一种攻击场景,也就是说只有后台会看到前端输入的内容。从前端无法判断是否存在XSS,怎么办呢?我们仍然是往里面插XSS代码,由于是后端,可能安全考虑不太严格。当管理员登录时,就会执行我们插入的脚本。
“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,站点采用了攻击者插入了带真实攻击功能的xss攻击代码(一般是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。

这种盲打的实际应用场景还是十分的有效的,我们可以插入引用外部的XSS,当管理员登入的时候便会,管理员的cookie便会发向我们后台的管理界面,也就是说我们等于获得了管理员登入的cookie,我们便可以利用该cookie进行免密登入。

XSS之过滤

此时我们还是按照流程走一遍试一下,先输入特殊符号+唯一识别字符试一试

乍一看好像没有过滤机制和闭合机制,但是当我们输入payload时却发现script标签被过滤了,此时我们可以尝试大小写绕过或者双写绕过。经过尝试大小写可以绕过但是双写不行

XSS之htmlspecialchars

按照老流程走一趟发现尖括号被转换成HTML实体

此时我们阅读一下源码:可以看到使用了htmlspecialchars()函数对我们提交的message进行了一个重新的处理,然后再把经过处理之后的message插到a标签中;而且因为尖括号会被转换成HTML实体,所以无法利用尖括号进行闭合。

我们先来介绍一下htmlspecialchars()函数
作用:把预定义的字符转换为HTML实体。
语法:

1
2
3
4
5
6
预定义的字符是:
&(和号)成为&amp
"(双引号)成为&quot
'(单引号)成为&#039
<(小于)成为&lt
‘>’(大于)成为&gt
1
2
3
4
5
可用的引号类型:
ENT_ COMPAT -默认。仅编码双引号。
ENT QUOTES -编码双引号和单引号。
ENT NOQUOTES -不编码任何引号。
我们把插入的语句单独拿出来看看

这是我插入的语句:

1
<script>wann'""</script>

这是经过后台处理过的语句:

1
<a href='&lt;script&gt;wann'&quot;&quot;&lt;/script&gt;'>&lt;script&gt;wann'&quot;&quot;&lt;/script&gt;</a>

通过对比上面两个的区别我们可以发现单引号不会被编码,所以先引入一个单引号闭合前面的href,使后面的语句逃逸出来
wann’ onclick=’alert(document.cookie)’ 此时可以看到语句执行并且href被闭合,后面的每个引号都配对了另一个

XSS之href输出

老流程走一遍,发现尖括号,单/双引号都被过滤;所以上面使用单引号进行闭合使语句逃逸的方法不奏效了;
补充个知识点:
a标签的 href 属性用于指定超链接目标的 URL。href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript代码段。如果用户选择了a标签中的内容,那么浏览器会尝试检索并显示href属性指定的URL所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
所以我们这里可以尝试利用JavaScript协议:输入payload:javascript:alert(document.cookie) 这样就可以使href执行
javascript表达式,从而达到我们注入的效果;同理可得:上一关我们也是不需要进行单引号闭合,直接注入javascript表达式,使得href执行javascript表达式即可。
思考:
那么当用户输入由href属性输出时,该怎么防御xss呢?
仅仅html编码就不够了,本关的php源代码中给了提示(有点简略)。遇到这种情况,需要两点处理:
1、检查用户输入,必须以http或者https开头。注意,不可以仅仅是包含http和https。
(不让用户有注入javascript表达式的机会)
2、进行html实体编码

XSS之js输出

老套路输入,发现我们输入的特殊符号+字符被输入到script标签之中,并且不存在过滤,但是需要闭合一个单引号;此时有两种解决方法

方法一:先闭合script标签,在注入

1
wann'</script><script>alert(document.cookie)</script>

方法二:构造出一个新的js语句;首先要用’;闭合掉当前的语句,然后插入新语句,然后再用//注释掉老语句遗留下来的’;

1
wann';alert(document.cookie);//