黑客必修:WEB安全—XSS的原理与防范实例讲解
生活中我们经常会碰到空间领红包“中毒”自动发不良信息的现象,或者是不知不觉的被人盗取了信息的情况。通常这种情况都是XSS漏洞导致的,我们今天就来讲解一下关于XSS漏洞的原理。
XSS种类:
反射型
存储型
Dom-based型
这里面反射型跟持久型都是很常见的,也是用的最广泛的一种攻击方式。
它的主要利用原理是:
给受害者发送带有恶意代码或脚本的链接,如果你点击了链接,只要是被HTML所解析并且执行了,那无论你是否快速关闭了点开的页面,都白瞎了。
Dom这种XSS漏洞是基于文档对象模型的一种漏洞,它的特点是通过url传入参数去控制触发的。
下面我们主要来说一下反射型跟存储型XSS的原理,并附上代码。
反射型XSS:
我们平时常见XSS地方很多都是搜索框(一般网站上都会有搜索文章什么的),我们可以在这种搜索框里面输入:
<script>alert('XSS')</script>
来验证XSS的漏洞存在与否,如果存在会弹出一个编辑框“XSS”,下面我们自己构建一个这样的搜索框:
先新搭建好PHP环境,在站点新建一个xss.php文件,输入以下的代码。
代码的意思很简单:
- 先创建一个form表单,提交方式设置为GET,提交给本页面(也就是交给下面的PHP代码去执行)
- 定义一个$xss变量
- 如果变量不为空的话,输出$xss的内容。
然后在浏览器上访问的效果应该是这样的:
这个时候我们就可以输入常规的信息去搜索,输入“im liuse”显示效果如下:
现在我们改变策略,输入我们上面说的xss测试代码<script>alert('XSS')</script>然后执行,你会看到下图的效果:
事实证明,没有进行过滤,如果我们把这个地方的<script>alert('XSS')</script>改成其它的代码,如:
<script>alert(document.cookie)</script>
就可以获取用户的cookie(cookie记录了用户的登录信息),拿到cookie有什么用呢?
举个例子,比如说拿到你的QQ空间的cookie就可以不需要用户名密码登录你的空间,我们经常见到空间好友自动转发一些乱七八糟的东西的图片文字的,基本都是通过xss漏洞搞的。
说完反射型XSS我们再来说说存储型XSS。
存储型XSS:
相对于反射型XSS,存储型XSS的档次确实高了不少,不过利用难度也相对提高了。
什么是存储型XSS呢?没错就跟它的名字一样,是可以储存起恶意代码的方式。这种漏洞利用多出现在论坛评论,后台上传这些地方,可以是图片也可以是文字。相对于反射型XSS不同的是,存储型XSS可以保存在服务器端(存到数据库)下面我们用代码举例:
我们在上面的xss.php文件的基础上修改一下:
同样的代码还是很容易理解:
- 先通过mysql_connect()函数来连接mysql
- 然后自己在mysql中建一个XSS_test数据库
- 创建一个XssValue字段来收录一会提交进的恶意代码
- 如果有数据过来,保存到数据库。
下面,我们来实验一下。
在搜索框同样输入我们的XSS代码:
你会发现貌似前台没有显示,但去mysql数据库看已经存储到数据库了,以后任何人去访问某个调用这个数据库的页面都会受影响!
以上就是简单的演示说明,下面我们讲讲防范过滤。
过滤实现:
重点对象:
<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)
过滤函数:
(1)htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
(2)htmlentities() 函数,用于转义处理在页面上显示的文本。
(3)strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
(4)header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
(5)urlencode() 函数,用于输出处理字符型参数带入页面链接中。
(6)intval() 函数用于处理数值型参数输出页面中。
好,今天XSS就先介绍到这里了,希望各位一定要认识到网安的重要性!