2.[第三章][3.3.4 案例分析]BUU XSS COURSE 11(XSS跨站脚本知识点)

打开发现页面怎么有点熟悉呀,这不就是刚才做过的那道题吗qyq

这里就整理一下XSS注入的知识点吧,详细做题步骤可以看看上一篇文章,链接附上

1.【BUUCTF】BUU XSS COURSE 11及XSS知识点-优快云博客

web安全之XSS跨站脚本知识点

网站应用程序安全漏洞,代码注入的一种,允许将代码注入网页,其他用户观看网页时会受到影响

通常包含HTML和JS(用户端脚本语言)

通过利用网站开发时留下的漏洞,巧妙注入恶意旨令代码到网页,使用户加载并执行恶意制造的网页程序。

这些恶意的网页程序通常是Java script,Java,Vb Script,Active X,Flash或者普通的HTML

可能得到更高的权限,私密的网页内容,会话和Cookie等


按触发特征分类

反射型XSS

指恶意代码未被服务器储存,每次触发漏洞时,都将恶意代码通过GET/POST的方式提交,用户输入的内容被直接输出在HTML中,然后触发漏洞

注入点在标签外部

提交这样的URL

name=<script>alert('xss')</script>

效果:弹窗xss

就实施了一次XSS注入

查看网站源代码

在url中输入的script标签,直接嵌入了HTML中,被浏览器识别,执行,弹窗xss

注入点在标签内部

不需要在注入的时候插入标签

如果是script标签内部,直接插入JavaScript语句

比如有这样的代码

<html>

<body>

<script>

var name ='<?=$_GET['name']?>';

document.write('hello '+name);

</script>

</body>

</html>

这种情况下的XSS跟SQL注入很像

先闭合引号

写入代码

再将后面的引号注释掉

如果是在其他标签的属性字段内,可以采用先闭合引号,再插入可以执行JavaScript代码的属性进行XSS

name=';alert('xss');//

;用于结束上一个语句

查看HTML源代码

先用一个单引号闭合了前面的字符串,用分号结束该语句,后面插入了alert('xss')用于弹窗,用双斜杠注释掉了最后剩余的单引号

存储型XSS

与反射型XSS的基本思路相同,都是后端未对用户输入进行过滤所导致的漏洞

存储型XSS是将用户输入保存在数据库或者其他的服务器存储中,只要服务保存了XSS代码,便可造成持续性的影响

比如下面的PHP代码,将用户输入直接保存在文件中

<?php

$name = $_GET['name'] ?? '';

if($name != '')

file_put_contents('data.txt', $name);

$name=file_get_contents('data.txt');

echo "hello $name";

用户输入被保存起来,每次访问这个页面时,都读取之前输入过的name

name=<script>alert(%27xss%27)</script>

/*URL 编码

%20 为空格

%23 为# (注释符)

%27 为单引号

–+ 注释后面的语句*/

payload与最开始的无差异 但下次访问时无需输入name参数即可造成XSS

在实际的环境中,这种存储型XSS最常见于用户发的贴子,用户的的个人信息等页面

这种数据会被保存在服务器中,当其他用户访问到含有恶意代码的帖子或个人信息页面时,便受到XSS

DOM XSS(文档对象模型)

njexs、apache托管的静态文件

不需要PHP、JSP后端语言

区别于前两种,漏洞位置发生在前端而非后端

前端将用户输入直接写入到HTML中

比如下面的HTML文件

<!DOCTYPE html>

<html>

<body>

<script>

var url = new URL(window.location.href);

var name = url.searchParams.get("name");

    //5、6行将name这个文件取出来

document.write('hello! '+name);

    //将'hello! '+name直接写到HTML中

</script>

</body>

</html>

JavaScript具有操作DOM的功能,可以提取用户的输入,直接插入到DOM中,造成XSS

payload与反射/存储型XSS无异

name=<script>alert('xss'</script>

!!!只有document.write()函数才会执行script标签签内的代码,而通过修改DOM属性

inner HTML来插入HTML内容,是不会执行其中的script标签内代码。但是可以通过插入

<img src=x onerror='alert(1)'>

的方法来执行类似onerror属性中的JavaScript代码。

eg:

<!DOCTYPE html>

<html>

<body>

<p></p>

<script>

var url = new URL(window.location.href);

var name = url.searchParams.get("name");

var p = document.querySelectorAll("p")[0]

p. innerHTML = 'hellol'+name;

 </script>

 </body>

 </html>

用来执行XSS的标签

1.基本上几乎所有的标签on事件来执行JavaScript代码,比如:

<h1\textcolor{red}{%20}onmousemove="alert(1)">hello</h1>//用户交互,需移动鼠标移动才执行

另一个比较常见的是img标签的onerror属性

<img src=x onerror="alert(1)">

还有

<iframe src="javascript:alert(1)"></iframe>//使用伪协议

<svg onload="alert(1)">

这些用于XSS的标签和属性,可以在

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet查找

2.HTML5特性的XSS

利用HTML5特性进行XSS可以参考,http://www.html5sec.org/

很多标签的on属性需要用户交互才能完成触发,比如

<input onfocus='alert(1)'>

需要输入框获得焦点后才能触发alert(1)

HTML5有一个属性

autofocus可以自动实现聚焦

就将需要交互的XSS变成了无需交互的XSS

<input onfocus='alert(1)' autofocus>

3.javascript伪协议

浏览器中常见的协议有http、https

有些a标签的href属性值为javascript:void(0)

"javascript:",就是javascript伪协议,它是由javascript引擎执行的

eg:

<a href="javascript:alert(1)">click here</a>

click here

点击之后,就alert(1)

iframe标签也可以使用JavaScript伪协议,实现自动触发,比如

<iframe src="javascript:alert(1)">

XSS过滤和绕过过滤

WAF层(web应用防火墙)

外部,在主机或网络硬件上

对HTTP请求进行过滤拦截

代码层

编写web应用过程中,直接实现或引用第三方库,对用户输入进行过滤

JavaScript语法非常灵活,对于普通的正则匹配,字符串比较,很难拦截XSS


1.富文本过滤绕过

如果过滤器本身存在缺陷,比如将黑名单内容替换为空,采用双写绕过

eg:

服务端代码

<?php

function filter($payload){

$data = str_replace("script","", $payload);//过滤掉了script,替换成了空格

return $data;

}

$name = filter($_GET['name']);

echo "hello $name";

输入name=<scriscriptpt>alert('xss')</scriscriptpt>

2.注入点在标签属性中

如果没有过滤"<"和">",可以直接引入新的标签

如果尖括号被过滤,可以插入新的事件属性

eg:onload,onmousemove等

而且标签的属性字段支持HTML编码,可以通过这个绕过过滤

eg:

<img src=x onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">

alert(1)

这里onerror的内容就是对alert(1)进行HTML编码之后的结果,最后仍然可以成功触发弹窗。

3.注入点在script标签中

注入点被引号包裹,可以向绕过SQL注入,先闭合引号再用分号结束语句之后插入代码

如果引号被过滤,且一行存在两个注入点的情况下:

var url= 'http://xxxx/?name=<?=$name?>'+'<?=$address?>'

用反斜杠使得第一个引号被转义,从第二个引号插入代码

var url= 'http://xxxx/?name=\'+';alert(1);\\'

红色部分是name的值,蓝色部分是address的值

如果存在单词黑名单,比如不允许出现eval等字符,可以使用unicode编码(只能输入函数名)绕过

\u0065\u0076\u0061\u006c('alert(1)')

undefined

4.CSP过滤及其绕过

CSP(内容安全策略)

一个额外的安全层

用于检测并缓解某些特定类型的注入,包括XSS和数据注入等

CSP被设计成完全向后兼容

不支持CSP的浏览器会忽略相关策略,并正常运行,采用默认的同源策略

为了使CSP可用,需要配置HTTP头部配置Content-Security-Policy字段

除此之外还可以使用Meta标签来配置该策略

XSS防御绝非易事,CSP应运而生

CSP看作是为了防御XSS,额外添加的一些页面渲染,javascript执行的规则

策略文档https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy找到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值