信息安全学习笔记(七)------OWASP top 10之一
前言:开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个组织,它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。其目的是协助个人、企业和机构来发现和使用可信赖软件。
OWASP——top10
根据OWASP的统计,由于过去几年来微服务,单页面应用程序,以及JavaScript作为网页主要语言的主导地位发生的变化导致 Top 10 发生重大更新。
现在 Top10 包括:
- 注入(Injection)
- 破坏身份认证(Broker Authentication)
- 敏感数据泄露(Sensitive Data Exposure)
- XML外部处理器漏洞(XXE)
- 失效的访问控制(Broken Access Control)
- 安全配置错误(Security Misconfiguration)
- 跨站脚本攻击(XSS)
- 不安全的反序列化(Insecure Deserialization)
- 使用含有已知漏洞的组件C(Using Components with Known Vulnerabilities)
- 记录和监控不足风险(Insufficient Logging and Monitoring)
现对sql注入,xss,csrf,命令执行,文件包含,任意文件下载/读取,文件上传,越权/未授权操作的常见的漏洞原因、原理、可利用性、风险程度等相关漏洞分析与防范做如下总结。
一.SQL注入
-
漏洞原因和原理:浏览器/服务器(B/S)结构是互联网兴起后的一种网络结构模式,这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统开发,维护和使用。许多Web程序在编写的时候没有对用户输入数据的合法性进行校验,导致应用程序通过用户输入的数据构造SQL查询语句时存在风险。SQL注入基本思想是在用户输入中注入一些额外的特殊字符或者SQL语句,使系统构造出的SQL语句在执行时改变查询条件,或者执行了攻击者注入的SQL语句。攻击者根据程序返回的结果,获得某些想要获得的知识。主要分为脚本注入攻击和恶意用户输入用来影响被执行的SQL脚本。
-
SQL注入的攻击步骤:
1)发现SQL的注入位置:
2)判断数据库的类型
3)通过SQL注入获取需要的数据
4)执行其他操作 -
SQL注入漏洞的判断:一般来说SQL注入存在于带有参数的动态页面中,这些参数可能有一个或多个。如果动态页面带有参数并且可以访问数据库,那么就有可能存在SQL注入。
1)整型参数的判断:http://localhost/show.asp?id = X,当输入的参数X为整型时,通常show.asp中的SQL语句就是
select * from 表名 where 字段= X
所以可以使用以下步骤来测试SQL注入是否存在
a.http://localhost/show.asp?id = X’(附加一个单引号),此时SQL语句变为
select * from 表名 where 字段= X'
运行异常
b.http://localhost/show.asp?id = X and 1 = 1,show.asp运行正常,而且与http://localhost/show.asp?id = X运行结果相同。
c.http://localhost/show.asp?id = X and 1 =2, show.asp运行异常。
满足上面三步,该脚本中一定存在SQL注入漏洞
2)字符串型参数的判断:当输入字段X为字符串时,SQL语句的原貌是
select * from 表名 where 字段= 'X'
,所以可以用如下步骤来测试:
a.http://localhost/show.asp?id = X’(附加一个单引号),此时SQL语句变为
select * from 表名 where 字段= X'
运行异常
b.http://localhost/show.asp?id = X ’or‘ 1 ’=‘ 1,show.asp运行正常,而且与http://localhost/show.asp?id = X运行结果相同。
c.http://localhost/show.asp?id = X ’and‘ 1’=‘ 2, show.asp运行异常。
满足上面三步,该脚本中一定存在SQL注入漏洞
3)特殊情况处理:
a.ASIIC码法:输入所用的字符全部用asiic码代替,如U = chr(85)
b.大小写混合法:ASP不区分大小写,程序员过滤时要么过滤掉全部大写字符串,要么是全部小写的字符串,如SelEcT代替select或SELECT
c.UNICODE法: -
防范与防御方法
二.跨站脚本攻击(XSS)
-
漏洞的原因和原理:XSS又叫CSS (Cross Site Script) 也称为跨站,它是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。XSS攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行,由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。如这句简单的Java脚本就能轻易获取用户信息:alert(document.cookie),它会弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记录页面中,稍做分析便获取了用户的敏感信息。
-
XSS漏洞的分类
1) Stored XSS漏洞(存储型XSS)
交互形Web应用程序出现后,用户就可以将一些数据信息存储到Web服务器上,例如像网络硬盘系统就允许用户将自己计算机上的文件存储到网络服务器上,然后与网络上的其他用户一起分享自己的文件信息。这种接收用户信息的Web应用程序由于在使用上更加贴近用户需求,使用灵活,使得其成为现代化Web领域的主导。在这些方便人性化的背后也带来了难以避免的安全隐患。
如果有某个Web应用程序的功能是负责将用户提交的数据存储到数据库中,然后在需要时将这个用户提交的数据再从数据库中提取出返回到网页中,在这个过程中,如果用户提交的数据中包含一个XSS攻击语句,一旦Web应用程序准备将这个攻击语句作为用户数据返回到网页中,那么所有包含这个回显信息的网页将全部受到XSS漏洞的影响,也就是说只要一个用户访问了这些网页中的任何一个,他都会遭受到来自该Web应用程序的跨站攻击。Web应用程序过于相信用户的数据,将其作为一个合法信息保存在数据库中,这等于是将一个定时炸弹放进了程序的内部,只要时机一到,这颗定时炸弹就会爆炸。这种因为存储外部数据而引发的XSS漏洞称为Web应用程序的Stored XSS漏洞,即存储型XSS漏洞。
2)反射型XXS:
反射型XSS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。
3)DOM-Based XSS漏洞
DOM是Document Object Model(文档对象模型)的缩写。根据W3C DOM规范,DOM是一种与浏览器、平台、语言无关的接口,使得网页开发者可以利用它来访问页面其他的标准组件。简单解释,DOM解决了Netscape的JavaScript和Microsoft的JScrtipt之间的冲突,给予Web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对象。
可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。
由于DOM有如此好的功能,大量的Web应用程序开发者在自己的程序中加入对DOM的支持,令人遗憾的是,Web应用程序开发者这种滥用DOM的做法使得Web应用程序的安全也大大降低,DOM-Based XSS正是在这样的环境下出现的漏洞。DOM-Based XSS漏洞与Stored XSS漏洞不同,因为他甚至不需要将XSS攻击语句存入到数据库中,直接在浏览器的地址栏中就可以让Web应用程序发生跨站行为。对于大多数的Web应用程序来说,这种类型的XSS漏洞是最容易被发现和利用的。 -
XSS漏洞的攻击形式
一般来讲,XSS漏洞的攻击形式有两种:一种是利用来自Web应用程序本身的代码编写不严格,导致被利用成XSS,这一种攻击形式主要集中在对Stored XSS漏洞的利用上;另一种则是利用其它存在XSS漏洞的程序或网站,设置人为制造的一个XSS网页,然后在目标程序中套嵌入链接,引诱用户单击后,间接地进行XSS攻击。
前一种攻击方式是我们最关注的XSS漏洞攻击,而后一种则因为其依赖其他非目标程序的漏洞显得非常隐蔽和难以防范,常被大多数人忽略。 -
XSS攻击常用脚本
(1)用于测试是否存在跨站。
(2)弹出一个包含浏览者cookie信息的对话框,如果用户已经通过账号登录网站,在显示cookie信息中将包含用户的账号和密码。
(3)当用户浏览该页面时,将弹出一个高200,宽200的网页窗口,在其中打开的页面是http://www.target.com/index.asp。
(4)当用户浏览该页面时,将在当前页面中出现一个高0,宽0的网页框架,也就是说这个框架是用户不可见的,但其实质是在打开的页面中访问了http://www.target.com/index.asp这个地址。
(5)刷新到另一个页面。
(6)scriptlet引入另一个页面。
(7)打开无数个浏览器,直至CPU超负荷。
(8)修改注册表(IE主页)。
-
XSS的防御
1)基于特征的防御
XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。
传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:黑客可以通过插入字符或完全编码的方式躲避检测。
(1)在javascript中加入多个tab键,得到 IMG SRC=“jav ascript:alert(‘XSS‘)” 。
(2)在javascript中加入#x09编码字符,得到 IMG SRC=“javascript:alert(‘XSS‘)” 。
(3)在javascript中加入字符,得到 IMG SRC=“javascript:alert(‘XSS‘)” 。
(4)在javascript中的每个字符间加入回车换行符,得到 IMG SRC=“j\r\na\r\nv\r\n\r\na\r\ns\r\nc\r\nr\r\ni\r\np\r\nt\r\n:alert(‘XSS‘)”
(5)对"javascript:alert(‘XSS‘)"采用完全编码,得到
IMGSRC=#x6A#x61#x76#x61#x73#x63#x72#x69#x70#x74#x3A#x61#x6C#x65#x72#x74#x28#x27
#x58#x53#x53#x27#x29。
上述方法都可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的还存在大量的误报可能:在上面的例子中,对"http://www.target.com/javascript/kkk.asp?id=2345"这样一个URL,由于包含了关键字“javascript”,也将会触发报警。
2)基于代码修改的防御
与SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
(1)对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容来提交,对其他的一律过滤。
(2)实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防被攻击。