XSS 跨脚本攻击
XSS(Cross Site Scripting)是跨站脚本攻击,为了区分CSS,所以缩写为XSS。XSS攻击方式是往Web页面插入恶意的 JavaScript 代码,当用户浏览网页的时候,插入的代码就是被执行,从而达到攻击的目的。
其中应用比较多的一个就是,在网页一些公用的交互区域。比如搜索的文本框,除了可以输入一些关键字,还可以输入一些 JavaScript 代码,一旦代码点击搜索,代码就会被执行,达到攻击的目的。如下例子
<script>alert(document.cookie);</script>
在文本框中输入以上代码,然后点击提交,就会把用户的cookie弹出来。
类型 | 储存区 | 插入点 |
---|---|---|
反射型XSS | URL | HTML |
存储型XSS | 后端数据库 | HTML |
DOM型XSS | 后端数据库/前端存储/URL | 前端JS |
反射型:反射型XSS只是把用户输入的数据反射给浏览器,攻击者往往需要诱使用户操作一个恶意连接,才能攻击成功。反射型XSS也叫做"非特久型XSS"
存储型:存储型XSS会把用户输入的数据"存储"在服务器,这种XSS具有很强的稳定性
比较常见的一个场景就是,黑客写下一篇包含有恶意js代码的博客文章,发表后,所有访问该博客文章的用户都会在他们的浏览器中执行这段恶意的js代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击就叫做"存储型XSS"
DOM型:通过修改页面的DOM节点形成XSS
XSS攻击要素
- 攻击者提交恶意代码
- 浏览器执行恶意代码
XSS攻击分类
XSS防范
- 将重要的cookies标记为HTTP ONLY,让js代码无法调用,只能http能调用。或者将重要的信息保存在session里面。
- 只允许用户输入我们期望的数据。如消费金额只能输入数字和小数点。
- 对数据进行加密处理。
- 过滤或者移除特殊的html标签,过滤js代码等。
- 不信赖用户输入,对特殊字符如"" <> 转义,就可以从根本上防止用户非法输入。
- 避免内联事件
CSRF 跨站请求伪造
CSRF(Cross-site request forgery)是跨站请求伪造。XSS利用站点内的信任用户,与XSS不同,CSRF是通过伪装来自受信任用户,在受信任的网站进行请求,盗取信息。其实就是攻击者盗用了受害者的身份,以受害者的名义向网站发送恶意请求。
攻击要素
- 攻击一般发起在第三方网站,被攻击的网站无法防止攻击发生
- 攻击利用受害者在被攻击网站的登录凭证,冒用受害者提交操作,而不是直接窃取数据
- 整个过程攻击者并不能获取受害者登录凭证,只是冒用
- 跨站请求可以是图片URL、超链接、CORS、Form提交等
危害:通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。
从图中可以看出,就是在一个网站里面保留了cookie,然后访问了一些危险网站,然后被危险网站盗用了用户信息。
CSRF防范
- 在表单里面增加Hash值,以认证这确实是用户发送的请求,然后在服务器端进行Hash值验证。
- 验证码:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串
- 修改,增加重要信息,比如密码,个人信息的操作,尽量使用post。避免使用get把信息暴露在url上面。
- Anti CSRF Token。目前比较完善的解决方案是加入Anti-CSRF-Token,即发送请求时在HTTP请求中以参数的形式加入一个随机的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个值,会进行校验请求当中的token和cookie当中的token值是否都存在且相当,才认为这是合法的请求。
SQL注入攻击
应用程序在向后台数据库传递SQL时,攻击者将SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
某个网站的登录验证的SQL查询代码为:
strSQL = "SELECT * FROM users WHERE (name = '" + userName +
"’) and (pw = ‘"+
passWord +"');" 恶意填入 userName =
"1’ OR ‘1’=‘1"; 与 passWord =
"1’ OR ‘1’='1"; 时,将导致原本的SQL字符串被填为 strSQL =
“SELECT * FROM users WHERE (name = ‘1’ OR ‘1’=‘1’) and (pw = ‘1’ OR ‘1’=‘1’);”
也就是实际上运行的SQL命令会变成下面这样的
strSQL = ``“SELECT * FROM users;”
因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
危害:得到管理员权限
防范
- 增加黑名单或者白名单验证(白名单验证一般指,检查用户输入是否符合预期的类型、长度、数值范围或者其他格式标准。黑名单验证是指,若在用户输入中,包含明显的恶意内容则拒绝该条用户请求。在使用白名单验证时,一般会配合黑名单验证码。)
- 完全检测,在项目完成的时候,始终检查安全检测
- 防止系统敏感信息泄露。对数据表的访问权进行严格控制,尽量限制用户不必要的访问权限
文件上传漏洞
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意后台文件,并能够将这些文件传递给解释器,就可以在远程服务器上执行任意后台脚本
防范:
- 检查服务器是否判断了上传文件类型及后缀
- 定义上传文件类型白名单,即只允许白名单里面类型的文件上传
- 文件上传目录禁止执行脚本解析,避免攻击者进行二次攻击
反爬虫
和之前的防护XSS和CSRF攻击目的不一样,反爬虫是为了防止网站重要的数据被别人拿走,比如电商的交易额,电影网站的票房统计,音乐网站的评论等。
防范:
http://litten.me/2017/07/09/prevent-spiders/