一、XSS之盲打
前端数据交互的地方,输入信息,输入后的结果不在前端显示,也就是
只有后台能看到输入的内容,从前端无法判断是否存在XSS,这种情况下,我们直接往里面插入XSS代码,然后等待
我们在pikachu平台随便输入信息,输入的内容并不会在前端显示,而是提交到了后台
如果我们输入一个JS代码,管理员登录后台管理界面,如果后台把我们的内容输出,那后台管理员可能遭受到我们的XSS攻击,我们提交以下内容
登录后台管理界面(账号密码为admin,123456)
点击Login 登陆之后会弹出小窗,说明后台受到了XSS攻击
这种就是也是存储型的,将前端的数据存储到后台,后台如果没有进行过滤的话会使攻击者嵌入恶意代码进行登录获取到后台的信息。这种漏洞属于随机性质的,刚好后台没有做处理,攻击者就可以采取这种方式进行 暗箱操作。
二、XSS之过滤
简单来说 实际中的系统,或多或少都会做一些安全措施,但是这些安全措施也能方法、逻辑不严谨,可以被绕过
转换的思路
- 前端限制绕过,直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。
- 大小写,比如<SCRIPT>aLeRT(111)</sCRIpt>。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。
- 双写(拼凑),<scri<script>pt>alert(111)</scri</script>pt>。后台可能把<script>标签去掉换,但可能只去掉一次。
- 注释干扰,<scri<!--test-->pt>alert(111)</sc<!--test-->ript>。加上注释后可能可以绕过后台过滤机制
编码的思路
核心思路:
- 后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定过滤
- 当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行
编码应该在输出点被正常识别和翻译,不能随便使用编码。
输入<script>alert(1)</script>
并没有弹窗
右键查看网页源码
可以看到我们写的那句话都不显示,说明过滤了小写字母,我们可以看一下源码,路径下图中有
接下来我们采用大写小写混合<SCrIPT>alert(1)</ScRiPt>
成功弹窗
三、XSS之htmlspecialchars
在做之前先介绍个函数
htmlspecialchars()是PHP里面把预定义的字符转换为HTML实体的函数
预定义的字符是
- & 成为 &
- " 成为 "
- ' 成为 '
- < 成为 <
- > 成为 >
可用引号类型
- ENT_COMPAT:默认,仅编码双引号
- ENT_QUOTES:编码双引号和单引号
- ENT_NOQUOTES:不编码任何引号
下面采用xss漏洞的测试方法进行操作,这个在pikachu-XSS(反射型、存储型、DOM型)中介绍过
首先我们输入带有特殊字符的和唯一标识符 '"<>6666
右键查看网页源代码
发现只有单引号没被转义,那我们就构造一个特殊字符只有单引号的句子输入 ' onclick='alert(111)' ,回车之后需要点击蓝色的记录,成功出来弹框
做完这些,可以看一眼,pikachu源码 使用函数,默认不对类型进行处理(没有指定类型)路径下图中有
四、XSS之herf输出
我们输入网址www.baidu.com
试着让它出现弹窗,发现之前常用的语句都不行,说明都被转义了
查看源代码,路径如下
这个函数我们在上一个中也介绍过,ENT_QUOTES:编码双引号和单引号
在a标签的href属性里面,可以使用javascript协议来执行js
所以我们构造语句为 javascript:alert(111) 回车之后,点击阁下自己输入的url还请自己点一下吧,成功出来弹窗
五、XSS之js输出
随意输入,进行测试
右键查看页面源码
它会把我们的输入放到js中,然后对这个变量进行判断,然后再输出
我们可以构造一个闭合,先用一个单引号和</script>闭合掉页面中的<script>,然后再插入自己的js代码
于是构造如下payload:'</script><script>alert('xss')</script> 成功弹窗
这里讲输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
这里如果进行html的实体编码,虽然可以解决xss的问题,但是实体编码后的内容,在js里面不会进行翻译,这样会导致前端的功能无法使用。
所以在JS的输出点应该使用对特殊字符进行转义。