XSS漏洞详解

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

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

一:XSS漏洞的原理

反射型XSS:

先放出源代码

//前端 1.html:
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>反射型XSS</title>
</head>
<body>
    <form action="action.php" method="post">
        <input type="text" name="name" />
        <input type="submit" value="提交">
    </form>
</body>
</html>

//后端 action.php:
<?php
    $name=$_POST["name"]; 
	echo $name;
?>

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

所以,我们可以在输入框中提交数据: <script>alert('hack')</script>  ,看看会有什么反应

页面直接弹出了hack的页面,可以看到,我们插入的语句已经被页面给执行了。
这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是: 前端-->后端-->前端

存储型XSS:

先给出源代码

扫描二维码关注公众号,回复: 3195062 查看本文章
//前端: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代码就被执行了。

我们输入 1    <script>alert(\'hack\')</script>   ,注意,这里的hack的单引号要进行转义,不然注入不进去。提交了之后,我们看看数据库

可以看到,我们的XSS语句已经插入到数据库中了
然后当其他用户访问 show2.php 页面时,我们插入的XSS代码就执行了。
存储型XSS的数据流向是:前端-->后端-->数据库-->后端-->前端

DOM型XSS:

先放上源代码

// 前端3.html
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>DOM型XSS</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="<?php echo $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>

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

我们可以输入 <img src=1 onerror=alert('hack')>     ,然后看看页面的变化

页面直接弹出了 hack 的页面,可以看到,我们插入的语句已经被页面给执行了。
这就是DOM型XSS漏洞,这种漏洞数据流向是: 前端-->浏览器

二:XSS的过滤和绕过

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

一:区分大小写过滤<script>标签

先放上源代码

//前端 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("/<script>/","",$name);      //过滤<script>
	$name=preg_replace("/<\/script>/","",$name);   //过滤</script>
	echo $name; 
}
?>

 绕过技巧:可以使用大小写绕过  <scripT>alert('hack')</scripT>

二:不区分大小写过滤<script>标签

先放上源代码

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

$name=preg_replace("/<script>/i","",$name);    //不区分大小写过滤 <script>
$name=preg_replace("/<\/script>/i","",$name);  //不区分大小写过滤 </script>

 绕过技巧:可以使用嵌套的script标签绕过   <scr<script>ipt>alert('hack')</scr</script>ipt>

三:XSS的利用 

猜你喜欢

转载自blog.csdn.net/qq_36119192/article/details/82469035
今日推荐