关联知识准备
如果想学习Web安全首先要了解一定的前端基础,前端目前分为HTML+CSS+JS,各自的用途是
- HTML: 网页的根本,用于设置网页哪里显示图片,哪里显示文字,哪里显示输入
- CSS: 网页样式,就是类似皮肤,同样是文字,带不带加粗变色等等
- JS: 网页脚本,一种脚本语言,用来操作网页上的节点和处理一些数据
- HTTP基础: 网络通信的基本类型
相关知识可以通过教学网站进行科普,由于是标记和脚本语言,基本就是死记硬背来入门,学习基本规则.
置于HTTP,可以去看相关教科书,或者一些BLOG的通俗化讲解
第一本书
一定要看完基础知识储备再来看书
入门第一本书被指导人推荐的是**白帽子讲Web安全**,阅读了主要是以下章节,以及重点
- 浏览器安全: 同源策略以及http机制和cookie是什么
- 跨站脚本攻击XSS: 反射性储存型以及XSS形成的根本思想!!
- 跨站请求伪造(CSRF): CSRF的实质!!
- 注入攻击: 注入的实质!!以及SQL注入概念和技巧!!
- 文件上传漏洞: 形成原理
- 认证和会话管理: 区分认证和授权的概念
- 访问控制: 注意水平权限越权问题
- Web框架安全: 看完忘记了…▄︻┻┳═一…… ☆<(= ̄□ ̄=!)>
- Web Server配置安全: 了解常见的Web Server以及注意区分和WebService不是一个东西
以上打了”!!”的三章,需要反复体会和进行实战,后续会有实战的总结
三个主要安全问题
Web安全中主要的三个问题就是,但是虽然是Web安全,但是其思想可以用于任何网络通信交互的安全考量中
- XSS(Cross Site Script): 跨站脚本注入
- CSRF(Cross Site Request Forge): 跨站请求伪造
- SQL注入(SQL injection): SQL语言注入
在进行了基础知识学习之后,先对其中具有共性的部分进行总结,然后分别对三个问题进行一些总结
总结
XSS和CSRF的共同之处
通过HTTP和HTML的基本概念我们可以知道两点:
- 所有HTTP中的网络通信都是通过Request进行的
- HTML的所有节点中,”src=”标记,如图片和Frame中都是进行了一次Request得到的数据
所以说XSS和CSRF中的”XS”与”CS”所代表的Cross Site(跨站)问题就是通过这种方式在www.A.com的域下通过脚本执行到www.B.com的域下的过程.
而CSRF中的Request Forge(请求伪造)就更加直白了,就是利用了这种Request机制.
几个术语的解释
开始看到安全的帖子或者讨论,最经常看到的是三个词语: 渗透/爆破/注入,这里说下自己的理解(可能是错的)
[爆破]和[注入]是指的两种手段,而[渗透]是指使用不同的手段获取[数据]或[权限]的过程.
爆破的本质就是穷举,就是不停的尝试,直到尝试出正确的;而注入的本质是在正常的输入中插入恶意代码,利用文本解析的机制执行非正常逻辑的操作.
除去这些之外,还有爬虫等等术语,我也刚刚入门,懂得不多.
渗透的目的
如果你是黑客,那么渗透的主要目的是数据,数据目前是可以卖钱的,如果你是白帽子,那么渗透的主要目的就是提权,看看能在渗透的过程中最高获得什么权限,从而检查安全措施是否到位.
XSS总结
XSS分为反射型和储存型,主要是通过注入的手段,在正常的网页文本中插入恶意代码,利用浏览器对HTML的文本解析机制,执行非正常逻辑的脚本.
首先来总结发生XSS的必备条件,再来区分反射型和储存型,必备条件包含:
- 网站需要有输入参数的地方
- 用户的输入会被通过某种方式再次呈现出来
条件1的所谓输入不一定是<\input>标签的文本框类型,也可以是选择栏,或者submit,只需要通过工具进行intercept修改参数,能够控制传入值就可以了.
而条件2则是区分反射型和储存型的关键,许多书上都通过”反射型需要被害者进行一次交互,而储存型被害者只要点击了链接就会触发”来区分.其实真正区分的点在于你在条件1中的输入,网站会不会通过某种储存手段再次呈现时传递给他人来区分更好.
XSS防护的手段
通过HTML或者JS的[输入检查]和[输出编码],把常见的敏感字符进行输入时筛选,或者输出时进行转义,因为HTML页面分为读取和渲染两个过程,经过转义的字符,就不会在读取的过程中被执行,而渲染的过程中会把转义过的字符反转义,不影响用户理解.
反射型XSS和储存型XSS举例
反射型
有一个输入姓名的文本框,进行按键提交后会显示你的姓名在返回的页面内容里,一旦你离开这个网页,你所有输入都无法再找回,仅在你操作的过程中能看到你输入的姓名.如果此处存在XSS漏洞,这就是反射型的.
注意,这个和响应时间没关系,即使你进行了提交过了2小时才返回结果,也是反射型的,因为他需要两个条件:
- 需要用户操作
- 一旦过程中断,输入数据无法找回
储存型
有一个输入姓名的文本框,进行提交后,你的姓名会发送到服务器储存在数据库里,返回的结果里会把所有数据库中的名字都返回到页面内容里.即使你离开这个页面,下次访问你输入的名字还在这个页面上,不仅你的二次访问可以看到,别人访问这个网站也可以看到.如果此处存在XSS漏洞,那就储存型的.
注意,这里可以是储存到数据库,也可以是其它储存手段,总之是网站的机制把你的输入作为整个HTML网页内容的一部分.常见的就是留言板,大家的留言都是保存在里面的.所以说储存型一般有这两个特点:
- 不需要用户操作,一旦解析了这个HTML页面,就会被触发
- 恶意代码不一定是你本机产生的,可能是别人产生的
CSRF总结
跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
利用HTML的Request机制,攻击者发送给被害者一个www.B.com域名下的网站,内部嵌入了恶意的"src=www.A.com"的Request指令,如果被害者打开B.com时当前浏览器正好已经登录过了A.com并且把A.com的Cookie放入了浏览器,那么在B.com下Request站点A.com时就会带走A.com的Session.服务器会错误的认为B.com的恶意请求是用户自己发出的.
这种在B.com下访问隐匿的访问A.com就是CS跨站的意思,而”src=”的这种请求方式带走了A.com的Session,就是RF请求伪造.
CSRF的防护
我们可以发现CSRF之所以能成功是因为B.com取走了A.com的Session,所以说大多数浏览器采用了HttpOnly标记,防止Cookie被另外一个域通过JS脚本取走.但是在B.com中伪造请求,攻击者并不直接拿到Session,只是先诱导受害者登录A.com让Session存在于浏览器中.
CSRF一般的主要目的是攻击网站的管理员,并且用管理员新建一个管理员用户作为后门,从而进行更多的操作.而上述这种CSRF冒充行为,防护的手段是CSRF+Token的方式,每次请求都增加一个为Token字段进行验证是否是用户本人的操作,还是Request Forge.
SQL注入总结
注入攻击是指以注入作为手段的攻击方法,其中最出名和常见的就是SQL注入,其实除去SQL注入,任何基于文本解析的机制都可以进行注入攻击,如
- 命令行注入
- XML注入
- CRLF换行符注入(Carriage Return Line Feed Injection)
其发生的本质,是基于文本解析的机制无法分辨代码是否是恶意代码,仅仅是顺序读取和执行,因为通常文本解析的语言并不会进行编译.
SQL注入的基本手段
锁定SQL语句值
通过or始终为True,或者通过and始终为False
number OR 1=1
number AND 1=2
string' OR '1'='1
string' AND '1'='2
SQL盲注
首先猜测某个SQL语句,然后通过执行的反馈结果判断猜测是否准确,假设输入某个value值,系统给出正确返回结果,此时进行写出自己的SQL猜测语句judge
value AND judge
进行输入,如果返回结果与value相同,说明judge的猜测正确,如果错误说明judge的猜测错误
SQL注入的防护
既然可以看到注入类攻击的核心原因是因为很多语言的顺序执行机制,和文本解析的本质,那么我只需要打破这种机制就可以防止注入攻击的发生.
以SQL注入为例,可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行.