2019年10月4日星期五

XSS入门

XSS

综述

XSS (Cross Site Script) ,跨站脚本攻击。因为和css(层叠样式表)重名,故改名叫做xss。它指的是恶意攻击者往Web页面里插入恶意html(js)代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
接下来就结合着http://xss.fbisb.com这个网站来说明+讲解+练习(这个网站以弹窗作为完成挑战的证明,也就是说想办法让他alert就ok了)

分类

  1. 反射型xss:经后端不存数据库
  2. 存储型xss:经后端存数据库
  3. DOM型xss:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。
首先我们来举一个最简单的xss的例子(http://xss.fbisb.com/yx/level1.php?name=test):
先随便在name后面输入一个"哈哈哈",发现"欢迎用户哈哈哈"
我们可以猜测一下后端代码:
php
$name = $_GET['name'];
echo "欢迎用户".$name
那这时,我们就可以思考一个问题,如果我提交:http://xss.fbisb.com/yx/level1.php?name=<script>alert(/xss/)</script> 会不会执行我的js代码呢?
提交后:
成功弹窗,完成这次关~
现在我们再回忆一下这个过程,这个过程发生了什么?为什么我们控制了浏览器行为?
显然,在后端代码中没有做任何的判断,直接将用户提交的数据直接拼接执行了,最终导致了xss漏洞的产生。有了一个直观的理解后,我们开始系统的学习三种xss

原理

反射型

新建一个xss.php文件并加入以下代码:
\XSS反射演示

<form action="" method="get">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>

php
$xss = @$_GET['xss'];
if($xss!==null){
    echo $xss;
}
这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为xss的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果xss中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。
部署好这个文件,访问http://localhost/xss.php,直接输入一个js代码,比如<script>alert('hack')</script>
之后点击test:
我们输入的HTML代码被执行了。用Firebug查看,我们输出的内容直接插入到了页面中,解释为-->
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。

存储型

把xss.php内容改为(同时数据库中需要配置相应的表):
\\存储XSS演示
<form action="" method="post">
    <input type="text" name="xss"/>
    <input type="submit" value="test"/>
</form>
php
$xss=@$_POST['xss'];
mysql_connect("localhost","root","123");
mysql_select_db("xss");
if($xss!==null){
    $sql="insert into temp(id,payload) values('1','$xss')";
    $result=mysql_query($sql);
    echo $result;
用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。
新建show.php,内容为:

mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from temp where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
   echo $row['payload'];
该代码从数据库读取了之前插入的内容,并将其显示出来。
先创建一个数据库xss,创建temp表
然后访问xss.php,像之前一样输入 HTML 代码
点击test,点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。
当我们访问show.php查询这个值的时候,代码就会被执行。
存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:
浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
3.dom-xss
把xss.php内容改为
php
error_reporting(0); //禁用错误报告
$name = $_GET["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>
DOM-XSS 的数据流向是:URL-->浏览器
总结: 在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
注:反射型xss和dom-xss都需要在url加入js代码才能够触发。

总结

本质来说,xss产生的原因也是"代码"和"数据"产生了混淆,将用户提交的"数据"未经过滤就直接并入到代码中,当用户可控的数据被当作代码部分执行时们也就产生了xss攻击。 站在防御者的角度上,应该注意每一个用户可控的数据提交部分,严格的对数据进行"消毒",尽量避免直接将用户数据和代码进行拼接后返回。 而站在攻击者的角度,由于我们不知道哪些部分是被直接拼合的,所以需要测试所有可提交数据的地方,同时需要观察数据的返回是怎么被拼接的,具体在那个标签中,对于xss攻击者来说,需要考虑两点:怎么让js引擎解析自己的代码和怎么绕过服务器或waf的过滤机制。
今天就说一下原理部分,明天结合题来进行实践,进一步理解xss。
今日。。同样没有分享。。。

没有评论:

发表评论

XSS速查表

今天继续XSS的进一步学习,以下内容转载自Freebuf上的文章,原文章来自OWASP的xss备忘录 1.介绍 这篇文章的主要目的是给专业安全测试人员提供一份跨站脚本漏洞检测指南。文章的初始内容是由RSnake提供给 OWASP,内容基于他的XSS备忘录: http://...