XSS漏洞基础

概念

XSS,跨站脚本攻击 (Cross Site Scripting),是一种经常出现在 web 应用中的计算机安全漏洞,它允许恶意 web 用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括 HTML 代码和客户端脚本。

攻击者利用 XSS 漏洞旁路掉访问控制——例如同源策略 (same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的 phishing 攻击而变得广为人知。

对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的 “缓冲区溢出攻击 “,而 JavaScript 是新型的 “ShellCode”。

XSS 的分类 

反射型XSS

这种类型的 XSS 攻击是最常见的,就是把恶意脚本提交到 URL 地址的参数里。反射性 XSS 只执行一次,且需要用户触发。

这里写了一个简单的页面

<form action="" method="post">
    <input type="text" name="name">
    <input type="submit" name="submit" value="提交">
</form>

<?php
if( @ $_POST['submit'] == "提交"){
    $name=trim($_POST['name']);
    echo "hello".$name;
}

输入后下面显示hello

 这个时候我们可以输入特定的标签,由于页面未作任何过滤操作,我们可以输入一些标签,就会显示出来,比如输入<script>alert(1)</script>,就会执行,这样的代码就出现了xss漏洞

 那么这种漏洞如何修复呢?

可以在代码中加入替换函数,将<script>标签替换为' ':

$name=str_replace('<script>','',$name);

但是我们可以输入<sc<script>ript>alert(1)</script> ,弹窗就又会出现。

 第二种防护方法是利用正则替换:

$name=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t(.*)/i','',$name);

 这时再输入<sc<script>ript>alert(1)</script>就会全被替换成' ',并没有弹窗

 这时可以输入一个不存在的图片,利用onerror.输入<img src="1" οnerrοr="alert(1)">,会弹出相同的警告框,并且hello后面出现一个图片,但显然这个图片根本不存在。

 对付这种漏洞就要使用第三种方法了,把预定义字符"<",">","&"等转化为HTML实体,防止浏览器将其作为HTML元素:

$name=htmlspecialchars($name);

输入相同的内容,不再出现弹窗 

补充:常见的实体编码

存储型XSS

储存性 XSS需要服务端接收并且存入数据库,当用户访问这个页面时,这段 XSS 代码会自己触发。储存性 XSS 只执行一次,不需要有客户端去手动触发操作。

存储型漏洞涉及数据库,以MySQL为例,先写一个简单的页面,存储型漏洞一般存在于个人信息,评论留言。

先建一个表comment来存储用户评论

由于只是演示,就不再判断用户名与评论是否符合条件

<form action="" method="post">
    用户名<input type="text" name="name">
    <br>
    留言<input type="text" name="comment">
    <br>
    <input type="submit" name="submit" value="提交">
</form>

<?php
$server = "localhost";
$db_user = "root";
$db_psw = "123456";
$conn = mysqli_connect($server, $db_user, $db_psw);   //连接数据库
if (!$conn)
    die("error!" . $conn->connect_error);
mysqli_select_db($conn, "test");   //选择数据库
$rel = mysqli_query($conn, "SELECT * FROM comment");
while($row = mysqli_fetch_assoc($rel)){
    $name = $row['name'];
    $comment = $row['comment'];
    echo $name.'<br>'.$comment.'<br>';
}

if( @ $_POST['submit'] == "提交"){
    $name=trim($_POST['name']);
    $comment=trim($_POST['comment']);
    mysqli_query($conn,"INSERT INTO comment(name,comment) VALUES ('$name','$comment')");
    echo "<script>alert('添加成功');</script>";
}

先写入几条评论,打开时显示这样

 用相同的方法,我们在输入时可以输入一些标签,在该页面展示评论时即可展示出来。

输入<script>alert(1)</script>,其他用户打开即会出现提示窗口,评论的内容变成了标签,所以显示在下面是空白

 第一种解决办法是通过strip_tags(addslashes())将标签删掉

$name=strip_tags(addslashes($name));
$comment=strip_tags(addslashes($comment));

此时输入相同的语句<script>alert(1)</script>,数据库存储的只是除了标签的部分

 第二种办法也是把预定义字符"<",">","&"等转化为HTML实体:

$name=htmlspecialchars($name);
$comment=htmlspecialchars($comment);

 这种方法展示在网页上的内容没有发生改变

 当然可以在数据存储时进行防护,也可以在数据展示时进行,由于代码一样,这里就不介绍了。

DOM XSS

DOM XSS 就是出现在 javascript 代码中的 xss 漏洞,不需要服务端交互,只发生在客户端传输数据的时候,原理同反射型XSS相同。今天刚好写了一道这样的题,就拿这个题举例了,题目如下欢迎来到level2

 先随便输入看见输入的内容插入在value处,所以可以输入test" οnclick="alert(1)

 test"和前面的”构成一个闭合引号,后面加入一个事件,和后面的引号闭合。

其他类型

由于还没接触其他类型,接触到再补充。

简单漏洞绕过

01<>被过滤的情况下

假如在特殊标签下的时候,可以构造一些事件触发

"autofocus οnfοcus=alert(1)

02alert被过滤的情况下

:prompt和confirm也可以弹窗
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCqzKTwvc2NyaXB0Pq (firefox可,chrome不行)

<svg/οnlοad=prompt(1)/>
<a href=j&#x61;v&#97script&#x3A;&#97lert(13)>M

03on事件被过滤的情况下

<form><button formaction=javascript&colon;alert(1)>M

<a href="javascript:alert(document.location);">XSS</ a>
<b style="width:expression(alert(document.location));">XSS</b> (IE6以下可)

<math><a xlink:href=javascript:alert(1)>1</ a></math>(firefox可,chrome不可)

可以执行js的属性:
formaction action href xlink:href src content data

04其他

标签和属性之间并不是只能出现空格

<img/src=x οnerrοr=alert(1)>

有时候并不需要一个合法的标签 

<M/οnclick="alert(1)">M

更多可参考行长圈 | 漏洞银行(BUGBANK) | 领先的网络安全漏洞发现品牌 | 开放安全的提出者与倡导者 | 创新的漏洞发现平台漏洞银行是国内首家互联网安全服务SAAS平台,在保护企业隐私的前提下,帮助企业建立漏洞应急响应中心,并在第一时间发现最具威胁的零日漏洞https://www.bugbank.cn/q/article/598438535ecec4fe1c216740.html

各语言防御XSS的方法

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XSS (Cross-Site Scripting) 是一种常见的安全漏洞,攻击通过注入恶意脚本来攻击网站用户。为了防止XSS攻击,可以使用XSS过滤器来对用户输入的数据进行处理和过滤。 XSS过滤器的主要目标是检测和阻止恶意脚本的注入。它可以通过以下几种方式来实现: 1. 输入验证: 对用户输入的数据进行验证,确保只接受符合预期格式和类型的数据。例如,如果一个输入字段只允许数字,那么任何非数字的输入都应该被拒绝。 2. 输出转义: 对从数据库或其他来源检索到的数据进行适当的转义处理,确保在将其插入到HTML页面时不会被解释为可执行的脚本代码。常见的转义包括将特殊字符如<、>、&等替换为对应的HTML实体编码。 3. 内容安全策略(CSP): 使用CSP可以限制页面中可以加载和执行的资源,从而减少XSS攻击的可能性。CSP可以配置允许加载的外部脚本、样式表和图片等资源,同时禁止内联脚本和eval()等危险函数的使用。 4. HttpOnly Cookie: 将敏感信息存储在HttpOnly Cookie中,这样可以防止客户端的脚本访问和修改Cookie内容,减少XSS攻击的影响范围。 5. 使用安全的编程语言和框架: 选择使用经过安全性测试的编程语言和框架,它们通常提供了内置的安全机制和过滤器,帮助减少XSS攻击的风险。 综合上述措施可以加强网站的安全性,但是XSS攻击的方法和技术不断演变,所以保持对最新安全威胁的了解和及时更新防护措施也是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值