xss,csrf

web安全

Posted by Lan on June 19, 2019

web安全,sql注入,xss,csrf web安全性主要侧重于对web服务器的攻击,这种攻击有 常见的sql注入,跨站脚本攻击(xss),跨站请求伪造(csrf)

sql注入

  • 基本概念

其本质就是,项目中把用户数据代码进行了拼接,形成了可执行的sql语句

攻击者把sql命令插入到web表单的输入或者页面请求的查询字符串(url),欺骗服务器执行恶意的sql命令

攻击者在web页面预先定义好的sql语句结尾加上额外的sql语句元素,欺骗数据库服务器执行非授权的查询,篡改命令

  • 原理

以把sql插入到web表单的输入为例:

假设的登录查询

  SELECT * FROM  users  WHERE login = 'victor' AND password = '123

  Sever端代码

  String sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";

  输入字符

  formusr = ' or 1=1

  formpwd = anything

  实际的查询代码

  SELECT * FROM users WHERE username = ' ' or 1=1  AND password = 'anything'  
  • 发现可以进行sql注入的特点:

如何知道某个网站是否能被sql注入是一个很关键的问题

在网上看到一个方法,主要是利用带有查询字符串的url,故意输错一个url中的参数,如果服务器返回的错误结果显示是sql服务器的参数没有被正确编码,则表示这个url是直接触及数据库服务器的,那么就可以进行sql注入了。

但我感觉,像这种直接把sql报错暴露出来的网站,那就是很低级的网站了,而且就是分明想让别人攻击。

  • 防范sql注入的方法

首先,可能现在大部分的后台开发,在操作数据时都会使用ORM(ORM,Object-Relationship Mapping,即对象关系映射,是把对象模型表示的对象映射到基于sql的关系模型数据库结构里去),但ORM并不意味着就避免了sql注入危害,具体orm如何被sql注入所影响,我还没有深入的了解。

  • 参数化查询方法 这个方法说白了就是利用占位符和参数,对在sql中需要填数据的位置进行限定。 目前的主流ORM框架都支持并推荐这种方式进行持久层封装。

以以下的一条数据库查询语句为例

例:           SELECT * FROM myTable WHERE myID = @myID

    INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?)

跨站脚本攻击(XSS,Cross Site Scripting,避免和css重名)

  • 特征

代码注入

就是恶意用户将代码注入到网页上,其他用户在观看网页时就会收到被注入代码的影响。

这类代码主要是html和js

  • 目的:

主要还是窃取用户数据信息或者破坏

  • 攻击举例: 如果在论坛中发布一段恶意的js代码就是脚本注入,如果这个代码内容有请求外部服务器,就是xss
  • 操作验证:

我在segmenfault网站的一个页面上留言,内容是一段js脚本,如图所示,发表评论后的确可以看到效果 在这里插入图片描述 留言页面https://segmentfault.com/a/1190000007059639?utm_source=tag-newest

  • 防范方法:

输入过滤:

即对用户输入的数据进行过滤操作,过滤其中的“<”,”>”,”/”,“”script”等脚本关键字,或者对输入数据长度进行限制等等。着重对与用户交互的每一处都进行检测和xss过滤,以有效的阻止xss攻击

输出编码:

在用户输入数据到web应用程序中时,先对数据进行编码,利用htmlEncoder等工具进行编码,然后再把数据输出到页面中,一般可以把输入编码为普通文字,这样以来脚本语言就不会成为html代码的一部分

Cookie防盗

利用xss,攻击者可以窃取用户的cookie,所以可以对cookie中的重要信息进行MD5加密,以防止xss攻击。‘’

跨站请求伪造(Cross-site request forgery)

在用户不知情的情况下,冒充用户发送请求,伪造请求,在当前已登录的网站上执行恶意操作,比如恶意发帖、修改密码等

  • 防范方法:

验证码方式, 在一些关键操作上要求输入验证码,防止伪请求

token方式, 向服务器传参数时带上token,token是服务器和用户共同持有的一个随机值。用户提交表单时带上token值,服务器就可以验证表单和session中的token是否一致

XSS和CSRF比较

简单来讲

xss是在用户请求到的html中加入恶意代码,使得用户被恶意代码影响 csrf是盗用浏览器中的登录信息,冒充用户去执行操作

xss主要是对用户数据没有进行转义,使得用户数据影响到了项目代码 csrf主要是http接口在调用上没有进行防范,对于恶意的调用也给与了授权。

xss更侧重代码实现 csrf更侧重结果,即只要是恶意或者冒牌的http请求,就是csrf

通常利用xss实现csrf,具体而言就是利用xss获得用户的cookie,然后冒充用户进行登录,发起恶意的http请求,比如删帖,改密码等