ps:小白一名,有问题请指教
XSS训练平台点这里
XSS(cross site scripts)
是指恶意攻击者利用网站没有对用户提交数据进行转义或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码。
将敏感字符试一下检查是否存在过滤,发现没有进行过滤直接输入:
<script>alert(document.domain)</script>
直接使用challenge1中的代码试一下,发现没有弹框和提示,仅仅只有try agin;
我们打开源代码:
发现在value属性下没有使用闭合标签>使代码不能执行,我们加上闭合标签:
"><script>alert(document.domain)</script>
成功弹窗;
我们发现第三关多了一个查询功能,我们输入dj查找,给出提示我们查找失败;
现在多一个参数p2,即有p1,p2两个参数,我们试一下抓包修改p2参数来注入代码;
将p2的参数Japan修改成script代码,forward得到这个界面:
成功;
发现和关卡3一样的界面,打开源代码浏览一下,果然发现相比关卡3不一样的是多了一个隐含参数p3,如图:
forward成功;
原本想试下是不是会过滤了字母或者符号什么的,然后发现有长度限制,要去改长度限制,一般前端都可以改长度限制的,于是:
"><script>alert(document.domain)</script>
成功弹窗;
随便输入一个字符tryagain,输入payload发现页面的查询框变成了空白:
这是为什么呢?
查看源代码发现value属性后显示:
><script>alert(document.domain)<=""
发现<>符号被HTML 特殊字符代替,说明输入内容被HTML实体编码;
这里可以在input标签里添加onclick属性,点击触发弹窗;
" οnclick="alert(document.domain)"
老规矩还是先输入代码试一下发现不成功打开源代码查看:
发现并没有什么差别,我们再仔细查看一下value:
噢噢原来如此,是过滤了双引号,这就好办了,第一种方法是按照关卡6添加onclick属性照样可以弹框成功;
第二种方法是
1 onmouseover=alert(document.domain);
ps: onmouseover:事件会在鼠标指针移动到指定的元素上时发生。
发现这里是制作一个链接使其弹出一个窗口,只需要在标签中添加一个JavaScript伪链接即可:
弹窗成功;
查看源代码有隐藏属性,抓包
发现"<>字符都已经被过滤,百度一下euc-jp是什么,根据提示原来是要构造utf-7的编码;这里就需要用到IE7浏览器,但是我并没有IE7,这里就不展示弹窗结果了;
老规矩直接在search之前的payload,查看源码:
发现domain被过滤了,第一反应就是双写绕过:
"><script>alert(document.dodomainmain)</script>
首先试一下JavaScript代码发现script被过滤
行不通,换成之前的点击弹窗发现也已经被过滤( onclick和onmouseover)
果然,查看提示:
转义 script on… style 对这些字符串进行了转义
根据其错误提示可以想到用标签 制作超链接
">	ipt:alert(document.domain);">点击跳转</a>
并且对script进行了过滤,javascript那里虽然有script,但是可以用 制表符,回车符,换行符 来欺骗过滤器。payload中 script 中间插入 , ,空格等不可见字符对script进行分割,让正则匹配不到;
一样是先尝试先前的payload,发现过滤了<>", 根据提示可以知道x00-,x20,<,>,",'都被过滤了,到了这我不知道怎么办了,参考了某位博主,原来 ` 还没被过滤,利用IE浏览器特性反引号解析为引号构造payload:
``onmouseover=alert(document.domain);
弹框成功;
可以发现,style和value属性值都是输入框的内容,而且会发现这里又过滤了双引号
xss:expression(alert(document.domain));
这里也需要利用IE8,本人太懒就不再多演示;
但是这里提示是 style attribute涉及到有关CSS的知识,在CSS样式中利用expression实现javascript中的onmouseover或onmouseout事件;
我直接看了提示这里过滤了url/script/eval/expression,直接这样过滤可以插入注释符绕过:
xss:expr\0ession(alert(document.domain));
xss:expr/**/ession(alert(document.domain));
到这里我先总结引号被过滤的几种情况:
1. 添加属性(onmouseover或onmouseout事件以及expression)触发弹窗
2. "<>都被过滤时可以构造编码
3. 利用IE浏览器反引号翻译成双引号的特性
根据提示这里过滤了document.write(),两种解决办法
16进制编码 \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
Unicode编码 \\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
用上述payload先试一下:
发现\、< >被过滤了, js编码有很多种,所以这里绕过也有很多种:
Unicode编码 \u003cimg src=x onerror=alert(document.domain)\u003e
八进制 \\74img src=x onerror=alert(document.domain)\\76