赞
踩
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
(1).攻击者对某含有漏洞的服务器发起XSS攻击(注入JS代码)
(2)诱使受害者打开受到攻击的服务器URL(邮件、留言等,此步骤可选项)
(3)受害者在Web浏览器中打开URL,恶意脚本执行。
(1)反射性:
非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
(2)存储型:
持久化,代码是存储在服务器中的,如在个人信息或发表文章以及留言板等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等
(3)DOM:
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
这里有在线版的:闯关地址:http://test.xss.tv
当然也可以自己搭建,怎么搭建,请自行百度。(建议自行搭建,可以分析源码)
2、再找输出点
那么,我们应该如何输出呢?来分析一波源码:
输出在标签之间,那么直接构造:<script>alert(/xss/)</script>
也可以用其他事件onload,onclick,onerror,prompt,confirm等。例如:<svg/οnlοad=alert(1)>
分析源码:
对比查看网页源代码:
我们看到第一个输入点,使用了 htmlspecialchars() 函数,它把预定义的字符转换为 HTML 实体。
预定义的字符是:
- &:转换为&
- ":转换为"
- ':转换为成为 '
- <:转换为<
- >:转换为>
例子:
这是比较典型的搜索框XSS,输出点1已经被HTML实体编码了,使用了htmlspecialchars函数。我们可以在输入点2中用事件来弹框:
" onclick=alert(1)>
需要点击一下输入框。(点击事件-JS知识点)
" onmouseover=alert(1)>
需要要鼠标滑过输入框(鼠标事件-JS知识点)
或者:
"><script>alert(/xss/)</script>
分析源码:
<input name=keyword value='".htmlspecialchars($str)."'> //可以从这个看到value值也被实体化
而且value是以单引号结束
但是htmlspecialchars默认配置是不过滤单引号。只有设置了:quotestyle,才可以
那么可以用单引号闭合并且不能包含<>则
设置payload
' οnclick='window.alert()或者:' οnclick=alert(1)%0a %0a用做换行使得input标签语法正确,主要是因为过滤了“>”。(不是很明白,但能成功)
分析源码:
与第三关相比:
可以发觉多了两行代码
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
将输入的内容分别去掉了 <,>
但是输入框没有被实体化,但是' 变为"
可以用第三关的payload稍作修改:
">οnclick="window.alert()
或者 " οnclick=alert(1)%0a
分析源码:
可以看到与第四关不同地方
$str = strtolower($_GET["keyword"]); strtolower() 函数将大写字符串转化为小写
$str2=str_replace("<script","<scr_ipt",$str); 将<script 替换为 ,<scr_ipt
$str3=str_replace("on","o_n",$str2); 将on替换为,o_n
此处没办法使用on事件了,所以我们不能利用第四关的payload了上面先转化为小写然后替换 所以将<script>大写也无用
此处重新构建payload
"><a href=javascript:alert();>test</a>
分析源码:
相比第五关,src,data,herf也被替换了,最重要的是少了strtolower()函数,而str_replace函数是区分大小写的,所以这一关测试的主要是大小写问题,可以用大小写绕过。
"><a HREF=javascript:alert()>test</a>
"><
svg
x="" Onclick=alert(1)>
分析源码:
"><a hrhrefef=javascrscriptipt:alert()>test</a>
"><scrscriptipt>alert()</scrscriptipt>
" oonnclick="window.alert()
分析源码:
没有过滤:' > < % & #,过滤了:" src on script data。输出点在a标签内,href属性中,属性中双引号被转换成HTML实体,无法截断属性,很明显,我们想到了协议绕过javascript:alert,由于script关键字被过滤,伪协议后面可以使用html的实体编码。payload:
(注:javascript:这个伪协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。)
javascript:alert(1)
javascript:alert(1)
javascript:alert(1)
字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。
这么做的目的主要有两个:
1、解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析。这时就需要将小于号和大于号写成字符实体:
小于号这样写:< 或 <
大于号这样写:> 或 >
前面的写法称为实体名称,后面的写法则是实体编号。ISO-8859-1字符集(西欧语言)中两百多个字符设定了实体名称,而对于其它所有字符都可以用实体编号来代替。
2、网页编码采用了特定语言的编码,却需要显示来自其它语言的字符。例如,网页编码采用了西欧语言ISO-8859-1,却要在网页中显示中文,这时必须将中文字符以实体形式写入HTML代码中。
平时我们见的 是html的实体字符,其实在后面 还对应一个实体编码。
有时会在HTML文档中看到形如:
&#
8721;
&#x
2211;
&
sum;
这样的字符序列,其实该序列是 HTML、XML 等 SGML 类语言的转义序列(escape sequence)。它们不是「编码」。(PS:至于是不是编码我也弄不清了,没搜到,这是抄别人的)
这三种转义序列都称为character reference(字符引用)。
&#
开头的后接十进制数字,以&#x
开头的后接十六进制数字。(其实我还发现使用Unicode转为中文,也可把r转为中文r)
分析源码:
和上一题一样,只不过多了一个自动检测url,如果发现没有带http:// 内容则会显示不合法, 那么怎么可以既有它,又不让它执行呢?只需填加个注释,(可选择多行注释和单行注释)包含http://就行了,构造payload:(强调一点构造的payload前面不要有空格,否则点击超链接会没有反应)
javascript:alert(1) /*http:// */
javascript:alert(1) //http://
分析源码:
从源代码中,我们了解到只有两个url参数是有效的,分别是keyword和t_sort,且标签input被隐藏了,而我们的渗透点在t_sort参数上,所以我们构造payload:
t_sort=" onclick="alert()" type="text
分析源码:
根据HTTP_REFERER 参数想到了HTTP头,那么我们可以在请求头进行XSS注入,这一关很显然注入点在Referer,那么我们可以使用burpsuite和火狐插件hackbar,在这一关中直接利用burpsuite抓包修改Referer,这里我用hackbar演示:
123456" οnmοuseοver=alert(1) type="text"
" type="text" οnclick="alert()
这里顺便说一下,每个源文件,前面都会有这样的代码:
这是加载下一关的代码。注意一下就好。
我们接着看源码:
根据HTTP_USER_AGENT参数还是想到了HTTP请求头中的user-agent,那么,同理可以按照第十一关的方法来做:
" type="text" οnclick="alert()
123456" οnmοuseοver=alert(1) type="text
分析源码:
看到$_COOKIE变量,自然而然的想到HTTP请求头,所以这题依然按照前面两关的方法来写:
user=" type="text" οnclick="alert(1)
user=123456" οnmοuseοver=alert(1) type="text
分析源码:
无法加载网址,这一关主要是:考察EXIF XSS 漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS。利用工具推荐exiftool。可参考讲讲EXIF Viewer XSS漏洞的来龙去脉。
分析源码:
此题用的是文件包含,那么我们可以让它调用一个evil code执行弹窗啊
payload :(htmlspecialchars()函数,把 < 和 > 还有 " 转换为实体,常用于防止浏览器将其用作 HTML 元素。)
网上的方法我都试过都不可以,而且我连最基本的跳转都完成不了,怀疑是不是环境的问题,不知道他们是如何成功的。
src='level1.php?name=<img src=x onerror=alert(1)>' src='level2.php?keyword=" onclick="alert(123)" "'
这里放一张别人成功的图
分析源码:
查看第16关的代码,发现输入的东西经过了大小写的转换并且通过四次的替换检查,分别对script,空格,/,进行了替换,但是有一点很重要,尖括号没有被替换,这给我们留下很大的利用空间。
另外script被替代,我们可以使用img标签,剩下我们就需要考虑如何把空格的影响给去掉,这时候就需要使用编码来进行绕过了,可以选择%0d
%0a
(表会回车换行)进行绕过,构造出最后的payload
<img%0dsrc=1%0dοnclick="alert(1)">
<img%0asrc=1%0aοnerrοr=alert(1)>
分析源码:
分析一下代码,发现输出点都进行了防护,对尖括号以及双引号进行了转义,但是不影响我们利用。<embed>
标签定义嵌入的内容,比如插件,所以这里我们可以使用on事件去进行触发,但是首先得用b去闭合前面的等号,
构造payload
arg01=a&arg02=b onmouseover=alert(1)
分析源码:
发现和第十七关一样:
分析源码:
这题不仔细看以为会和前两关一样实际上,实际上,难度已经提升了,已经触及到我的知识盲区了,这道题如果按照前面的写法,是无法正常闭合的:
而且他还有htmlspecialchars()函数进行过滤,这一题主要是flash xss,这里给出别人的方法:
(来自:https://www.jianshu.com/p/4e3a517bc4ea)
arg01=version&arg02=<a href="javascript:alert(1)">123</a>
这个我本地测试并没有成功:
不知道为什么别人能成功,好烦!
flash文件好像都打不开
分析源码:
后台源码与十九关一样,这一题也是flash xss,继续搬运别人的博客,莫得办法,不会,还看不懂。。。
本题也属于Flash XSS,将xsf04.swf文件分析得知分析得知是zeroclipboard.swf
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height
总结:
十五关之前没有什么问题,至于后面几关吧,有很多的问题,网上找别人写的要么类似,要么就是别人能正常运行,自己的就不行,这样的问题只能遗留下来了,作为初学者,我们现在要的是思路,这20关了解即可。
补充下一个小知识:(来自:https://www.dazhuanlan.com/2020/03/27/5e7d3fb416604/)
XSS Validator
插件这里我们还需要另外一个东西叫
PhantomJs
,这是下载地址:http://phantomjs.org/download.html,另外我们需要在xssValidator的github上下载一个小脚本(备注,链接好像失效了)
Phantomjs
同一级目录下即可,然后利用Phantomjs
打开即可,此时开始监听Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。