大家好,我是阿里斯,一名IT行业小白。由于工作原因停更已经好久,中间虽然也水了俩篇文章,但是个人感觉该继续水下去了,因为收到了不止一位粉丝的监督。那么就从今天开始吧,接下来的主要内容主要围绕xss展开。

什么是同源策略

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以xyz.com下的js脚本采用javascript读取abc.com里面的文件数据是会被拒绝的。

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

同源策略基本特点

如果Web世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的FreeBuf账号数据,这样的话整个WEB世界就没有 隐私而言。

同源策略中的同源指什么

协议相同

域名相同

端口相同

c00d35566db61ca93782e1caffe26dc6.png

不受同源策略限制

<script src="....">script><link><iframe><img>......<--!这种带src属性的标签,在加载时,实际是生成一条GET请求,向指定服务器申请资源。-->

什么是XSS

XSS原理

      XSS 跨网站脚本(Cross-site scripting) 是一种常见的web安全漏洞,属于代码注入。xss的主要由于攻击者在网站插入恶意的脚本后,正常用户访问该网站时脚本执行,从而导致用户被窃取cookie,被劫持会话,被强制跳转等恶意攻击。

e852e43bb93bd3b05aa56c5e3774cf65.png

XSS漏洞形成原因

  • 未对客户端输入进行严格的处理

  • 没有严格检测要输出到页面的内容,导致恶意脚本输出到网页

示例:

<html lang="en"><head>  <meta charset="UTF-8">  <title>XSS原理测试title>head><body>  <form action="#">    <input type="text" placeholder="欢迎关注公众号:小白学IT" name="xss">    <input type="submit" value="搜索">  form>body>html><?php  header("Content-type:text/html;charset=utf-8");if(!empty($_REQUEST['xss'])){  $xss = $_REQUEST['xss'];  print_r($xss);}

b6fe35d98f477f9dbea7baacd0459f96.png

xss危害

  • 网络钓鱼,包括盗取各类用户账号

  • 窃取用户Cookies,劫持用户会话

  • 网站挂马,进行恶意操作,如任意篡改页面信息、非法获取网站信息、删除文件等

  • xss蠕虫攻击

  • 结合其他漏洞打组合拳(xss+csrf=xsrf)

xss分类

反射型

反射型XSS又称非持久性XSS。反射型xss的原理就是客户端输入恶意的客户端脚本(js或其它脚本),服务端把该语句又输出到页面中,从而执行攻击。反射型xss是比较常见的web安全漏洞,一般会出现在搜索页面、输入页面、url参数等处。

其攻击流程如下图所示:(此图在杨老师的xss文章中也看到过,百度图片也有,忘记从哪弄来的,感觉不错就用了,希望不会侵权:杨老师文章跳转链接)

b29e6d1d6a36a8dec882cff0876085ed.png

注:xss原理示例其实就是反射型xss的最好示例
存储型(持久型)

存储型XSS又称持久性XSS,属于xss分类中危害最大的一种。存储型XSS漏洞的形成原因是攻击者在客户端输入恶意的客户端脚本,服务器把该恶意语句存储到数据库中,当客户端需要加载该数据时,用户就会受到相应的攻击(这里的用户如果是管理员,危害将放大)。存储型xss一般出现在评论、留言板、等与数据库交互处。

其攻击流程如下图所示:(此图在杨老师的xss文章中也看到过,百度图片也有,忘记从哪弄来的,感觉不错就用了,希望不会侵权:杨老师文章跳转链接)

51617186581840f541316dac5686f246.png

<--!存储型前端代码--><html lang="en"><head>  <meta charset="UTF-8">  <title>存储型XSS测试title>head><body>  <form action="xss_存储_h.php">    <input type="text" placeholder="欢迎关注公众号:小白学IT" name="xss">    <input type="submit" value="搜索">  form>body>html>
<?php #存储型后端代码header("Content-type:text/html;charset=utf-8");if(!empty($_REQUEST['xss'])){  #如果接收的参数不为空,执行代码  $xss = $_REQUEST['xss'];#将参数值存入变量中  $conn = mysqli_connect('localhost','root','root','xss_test');#连接数据库  mysqli_set_charset($conn,'utf8');#设置字符  $sql_insert = "INSERT INTO `xss_tab` (xss) VALUES('$xss')";#定义一个插入数据库的sql语句  mysqli_query($conn,$sql_insert);#执行sql语句  if(mysqli_affected_rows($conn)>0){#判断有没有执行成功    $sql_select = "SELECT * FROM xss_tab WHERE xss = '$xss'";#插入成功以后就执行查询语句,把数据库内容取出的SQL    $result = mysqli_query($conn,$sql_select);#执行取出数据的sql语句    if(mysqli_num_rows($result)>0){#判断有没有执行成功      $data = mysqli_fetch_assoc($result);#取出结果集      print_r($data);#打印,刚刚你输入的东西显示在页面中      mysqli_free_result($result);#释放结果集    }  }else{    print_r('faile');  }} ?>

c5289ef14ce7ced4faaa4ceadb541b18.png

DOM型

DOM型XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种web安全客户端漏洞,DOM型XSS其实也属于反射型XSS,和反射型相比它不是通过后端脚本直接输出到页面,而是使用客户端脚本处理后输出到页面而导致的一种漏洞,你可以认为DOM型XSS是不经过服务器的,这种漏洞危害相对较小。

<html lang="en"><head>  <meta charset="UTF-8">  <title>XSS-DOMtitle>head><body>  <form action="xss_dom_h.php">    <input type="text" placeholder="欢迎关注公众号:小白学IT" name="xss">    <input type="submit" value="搜索">  form>body>html>
<--!DOM接收端    文件名xss_dom_h.php    测试请不要复制这句话--><?php  $xss = $_REQUEST['xss'];    ?> <input type="text" id="xss" value="<?php  echo $xss?>"><--!显示前端输入的内容 测试请不要复制这句话--> <div id="print">   <--!DOM用来显示用户输入内容--> div> <script>   var xss = document.getElementById('xss');#获取输入框input元素,为取框中的值做准备   var print = document.getElementById('print');#获取显示框input元素,为把内容添加到显示框   print.innerHTML=xss.value;#xss.value是输入框中的值    innerHTML就是把值添加到页面中script>

9111d781ad40cd9549c0bf2efd65e079.png

xss漏洞常见paylod

<script>alert(/xss/)script><li/onclick=alert(/xss/)>ali><img/src=x onerror=alert(/xss/)><a href=javascript:alert(1)>xss<svg/onload=alert(1)>

XSS防御

XSS防御函数

htmlspecialchars()函数

该函数会把预定义的字符转为HTML实体

预定义的字符是:

  • & 和号

  • “  双引号

  • ‘   单引号

  • <   小于号

  • >   大于号

示例

$str = "this is 

标题

";echo htmlspecialchars($str);

注:该函数默认情况下不对单引号进行实体化

strip_tags()函数

该函数会剥去字符串中的HTML、XML以及PHP的标签,而且该函数会剥去HTML注释。

使用方法

strip_tags(string,allow)

参数 描述
string 必须,规定要检查的字符串
allow 可选,规定允许的标签,这些标签不会被删除

示例

echo strip_tags("hello 

world

");

htmlentities()函数

把字符串转为HTML实体

使用方法

htmlentities(string,flag)

参数 描述
string 必须,规定要转换的字符串
flags 可选。规定如何处理引号、无效的编码以及使用哪种文档类型。可用的引号类型:    ENT_COMPAT - 默认。仅编码双引号。    ENT_QUOTES - 编码双引号和单引号。    ENT_NOQUOTES - 不编码任何引号。无效的编码:    ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。    ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 FFFD; 的字符,而不是返回一个空的字符串。    ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 FFFD;。规定使用的文档类型的附加 flags:    ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。    ENT_HTML5 - 作为 HTML 5 处理代码。    ENT_XML1 - 作为 XML 1 处理代码。    ENT_XHTML - 作为 XHTML 处理代码。

示例

$str = "Bill & 'Steve'";echo htmlentities($str, ENT_COMPAT); // 只转换双引号echo "
";echo htmlentities($str, ENT_QUOTES); // 转换双引号和单引号echo "
";echo htmlentities($str, ENT_NOQUOTES); // 不转换任何引号

XSS防御之httpOnly

当我们把httpOnly的值设置为true时,document对象就不能在获取到cookie了。

设置HttpOnly

setcookie('uname',$rows['uname'],time()+3600,'/','localhost',false,true);setcookie('passwd',$rows['uname'],time()+3600,'/','localhost',false,true);setcookie('money',$rows['uname'],time()+3600,'/','localhost',false,true);

完整代码

<html lang="en"><head>  <meta charset="UTF-8">  <title>欢迎登录title>head><body>  <form action="#">    <input type="text" name="uname">    <input type="password" name="passwd">    <input type="submit" value="登录">  form>body>html><?php  if(!empty($_GET['uname']) && !empty($_GET['passwd'])){  $uname = $_GET['uname'];  $passwd = $_GET['passwd'];  $conn = mysqli_connect('localhost','root','123456','test');  mysqli_set_charset($conn,'utf8');  $sql = "SELECT * FROM `csrf` WHERE uname='$uname' and passwd='$passwd'";  $result = mysqli_query($conn,$sql);  if(mysqli_num_rows($result)>0){    $rows = mysqli_fetch_assoc($result);        setcookie('uname',$rows['uname'],time()+3600,'/');    setcookie('passwd',$rows['uname'],time()+3600,'/');    setcookie('money',$rows['uname'],time()+3600,'/');    /*    setcookie('uname',$rows['uname'],time()+3600,'/','localhost',false,true);    setcookie('passwd',$rows['uname'],time()+3600,'/','localhost',false,true);    setcookie('money',$rows['uname'],time()+3600,'/','localhost',false,true);*/    echo ";  }else{    echo "失败";  }  mysqli_free_result($result);  mysqli_close($conn);} ?>

注:将HttpOnly的值设置为true并不是万能的。

参考链接:https://www.cnblogs.com/zlhff/p/5477943.html

其它防御策略

黑名单和白名单防御

黑名单:不允许输入那些内容

白名单:只允许输入那些内容

对XSS的防御需要根据实际情况对用户的输入进行严格的过滤。

基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。

flash型xss防御

对相应的flash进行修改或升级替换,flash在2020.3月已经被弃用。

关注我或者加我微信

944dd17f87b7ac7d787ccece7e2ae3e9.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐