XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决

https://blog.csdn.net/qq_35393693/article/details/86597707

XSS(跨站脚本)漏洞详解

XSS的原理和分类
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

XSS分为:存储型 、反射型 、DOM型XSS
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第1张图片
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第2张图片

存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie
反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面
DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

document.referer
window.name
location
innerHTML
documen.write

如图,我们在URL中传入参数的值,然后客户端页面通过js脚本利用DOM的方法获得URL中参数的值,再通过DOM方法赋值给选择列表,该过程没有经过后端,完全是在前端完成的。所以,我们就可以在我们输入的参数上做手脚了。
在这里插入图片描述
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第3张图片
XSS的攻击载荷
,看看会有什么反应
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第6张图片
页面直接弹出了hack的页面,可以看到,我们插入的语句已经被页面给执行了。
这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是: 前端–>后端–>前端

存储型XSS:
先给出源代码

//前端:2.html
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>存储型XSS</title>
</head>
<body>
    <form action="action2.php" method="post">
        输入你的ID<input type="text" name="id" /> <br/>
        输入你的Name:<input type="text" name="name" /> <br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>
//后端:action2.php
<?php
	$id=$_POST["id"];
	$name=$_POST["name"];
	mysql_connect("localhost","root","root");
	mysql_select_db("test");
	
	$sql="insert into xss value ($id,'$name')";
	$result=mysql_query($sql);
?>
//供其他用户访问页面:show2.php
<?php
	mysql_connect("localhost","root","root");
	mysql_select_db("test");
	$sql="select * from xss where id=1";
	$result=mysql_query($sql);
	while($row=mysql_fetch_array($result)){
		echo $row['name'];
	}
?>

这里有一个用户提交的页面,数据提交给后端之后,后端存储在数据库中。然后当其他用户访问另一个页面的时候,后端调出该数据,显示给另一个用户,XSS代码就被执行了。
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第7张图片
我们输入 1 和 ,注意,这里的hack的单引号要进行转义,因为sql语句中的$name是单引号的,所以这里不转义的话就会闭合sql语句中的单引号。不然注入不进去。提交了之后,我们看看数据库

XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第8张图片
可以看到,我们的XSS语句已经插入到数据库中了
然后当其他用户访问 show2.php 页面时,我们插入的XSS代码就执行了。
存储型XSS的数据流向是:前端–>后端–>数据库–>后端–>前端
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第9张图片
DOM型XSS:
先放上源代码

// 前端3.html
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>DOMXSS</title>
</head>
<body>
    <form action="action3.php" method="post">
        <input type="text" name="name" />
        <input type="submit" value="提交">
    </form>
</body>
</html>
// 后端action3.php
<?php
  $name=$_POST["name"];
?>
<input id="text" type="text" value="$name; ?>"/>
<div id="print"></div>
<script type="text/javascript">
  var text=document.getElementById("text");
  var print=document.getElementById("print");
  print.innerHTML=text.value;  // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>

这里有一个用户提交的页面,用户可以在此提交数据,数据提交之后给后台处理

我们可以输入 ,然后看看页面的变化
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第10张图片
页面直接弹出了 hack 的页面,可以看到,我们插入的语句已经被页面给执行了。
这就是DOM型XSS漏洞,这种漏洞数据流向是: 前端–>浏览器

XSS的过滤和绕过
前面讲sql注入的时候,我们讲过程序猿对于sql注入的一些过滤,利用一些函数(如:preg_replace()),将组成sql语句的一些字符给过滤,以防止注入。那么,程序猿也可以用一些函数将构成xss代码的一些关键字符给过滤了。可是,道高一尺魔高一丈,虽然过滤了,但是还是可以进行过滤绕过,以达到XSS攻击的目的。

一:区分大小写过滤标签

先放上源代码

//前端 1.html:
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>反射型XSS</title>
</head>
<body>
    <form action="action4.php" method="post">
        <input type="text" name="name" />
        <input type="submit" value="提交">
    </form>
</body>
</html>
 
//后端 action4.php:
<?php
$name=$_POST["name"]; 
if($name!=null){
	$name=preg_replace("/
	echo $name; 
}
?>

绕过技巧:可以使用大小写绕过
XSS(跨站脚本)漏洞详解之XSS跨站脚本攻击漏洞的解决_第11张图片
二:不区分大小写过滤标签

先放上源代码

这个和上面的代码一模一样,只不过是过滤的时候多加了一个 i ,以不区分大小写

$name=preg_replace("/

绕过技巧:可以使用嵌套的script标签绕过 ipt>alert(‘hack’)ipt>

三:不区分大小写,过滤之间的所有内容

先放上源代码

这个和上面的代码一模一样,只不过是过滤的时候过滤条件发生了变化

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); //过滤了
                    
                    

你可能感兴趣的:(网站安全)