XSS漏洞

跨站脚本攻击(XSS)分为反射型、存储型和DOM型,主要利用网站对用户输入数据处理不当,注入恶意脚本,影响其他用户。反射型XSS通过GET或POST数据触发,存储型XSS涉及数据存储在数据库,每次访问都会执行。DOM型XSS与DOM文档对象模型相关,恶意代码可能在JavaScript函数中执行。防御方案包括严格检查输入、验证数据、过滤输出和使用安全编码实践。
摘要由CSDN通过智能技术生成

漏洞原理

跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。

跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。

反射型XSS

非持久型,也叫反射型XSS。通过GET和POST方法,向服务器端输入数据。用户输入的数据通常被放置在URL的query string中,或者是form 数据中。如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS。

反射型XSS是比较普遍的XSS,其危害程度通常被认为较小。但是某些反射型XSS造成的后果会很严重,如在输入框的name中输入,服务器不加处理,将name的值直接送到浏览器,则浏览器会每5秒自动刷新一次。严重者会导致服务器崩溃。

直接输出在浏览器页面上

<?php
    //直接输出在浏览器页面上
    $content = $_GET['content'];
    echo $content;

服务器没有对用户输入的字符进行过滤,直接传送到浏览器的页面进行执行
在这里插入图片描述

直接输出在HTML标签里

<?php
    //直接输出在浏览器页面上
    $content = $_GET['content'];
    //echo $content;

?>
//直接输出在HTML标签内
<input type="text" value="<?php echo $content?>">

这个类型的攻击需要先闭合HTML标签
在这里插入图片描述

直接输出在script标签内

<?php
    //直接输出在浏览器页面上
    $content = $_GET['content'];
    //echo $content;
    
    //直接输出在HTML标签内
/*<input type="text" value="<?php echo $content?>">*/
?>

//直接输出到<script>标签内
<script>
    var xss = '<?php echo $content?>';
    document.write(xss);
</script>

这个攻击同样也需要先闭合</script>标签
在这里插入图片描述

存储型XSS

持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息。

新建了一个xss的数据库,用于实验验证
在这里插入图片描述
stored.php

<?php

    $xss = $_POST['xss'];
    $conn = mysql_connect("localhost","root","root");
    mysql_select_db("xss",$conn);
    if($xss !== null){
        $sql = "INSERT INTO xss(id,payload) VALUES('1','$xss')";
        $result = mysql_query($sql) or die(mysql_error());
    }
?>
<form action="" method="post">
    <input type="text" name="xss">
    <input type="submit" value="submit">
</form>

show.php

<?php
    $conn = mysql_connect("localhost","root","root");
    mysql_select_db("xss",$conn);
    $sql = "select payload from xss where id=1";
    $result = mysql_query($sql);
    if($row = mysql_fetch_array($result)){
        echo $row['payload'];
    }
    ?>

当我们在输入框中输入我们的恶意代码,由于数据库并没有对用户输入的东西进行过滤而直接存入数据库中,所以每次当用户访问该页面时,恶意代码都会被执行

在输入框中输入<script>alert(/xss/)</script>,并成功存入数据库中
在这里插入图片描述
访问show.php时恶意代码被执行
在这里插入图片描述

DOM型XSS

DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。

DOM型XSS其实是一种特殊类型的XSS,它是基于DOM文档对象模型的一种漏洞。

<?php
    $xss = $_GET['xss'];
    ?>
<input type="text" id="text" value="<?php echo $xss?>">
<div id="div1"></div>
<script type="text/javascript">
    var text = document.getElementById("text");
    var div1 = document.getElementById("div1");
    div1.innerHTML = text.value;
</script>

效果图
在这里插入图片描述
我们按F12查看DOM树的代码内容看出,当我们攻击成功后,我们的恶意代码写入了div的标签中
在这里插入图片描述
倘若我们对一下的JavaScript函数输入的数据不进行过滤的话,也可能会引起DOM型的XSS攻击

输入点输出点
document.URLeval
document.locationdocument.write
document.refererdocument.InnerHTML
document.formdocument.OuterHTML

修复方案

  • 对所有输入中的script、iframe等字样进行严格的检查
  • 验证数据的类型及其格式、长度、范围和内容
  • 客户端做数据的验证与过滤,关键的过滤步骤在服务端进行检查
  • 检查输出的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值