web安全。 简述SQL注入、XSS、CSRF

SQL注入

SQL注入攻击就是攻击者把SQL语句写入到表单的输入框或者页面get请求的查询字符串,来达到欺骗服务器去执行写入的SQL语句命令。
SQL语句能绕过防火墙直接访问数据库。
SQL注入实现
比如简单的用户登录查询

SELECT * FROM users WHERE username = 'abc' AND password = '123'

服务端代码(node)

const SQL = `SELECT * FROM user WHERE username = '${username}' AND password = '${passwpord}'`

表单输入

username = ' or 1=1
password = angthing

实际的查询代码

SELECT * FROM users WHERE username = ''or1=1 AND password = 'anything'

或者去通过url的get请求去发起
比如url带有查询字符串(例如,?id=123),向这个网站发起请求,改变其中的id参数, 使它带一个额外的单引号(?id=123') ,可以查看返回信息得知这个网站是否可以被SQL注入。
SQL注入防范方法(node-mysql)

  1. 使用escape()对传入参数进行编码:

mysql.escape(param)
connection.escape(param)
pool.escape(param)

  1. 使用connection.query()的查询参数占位符
    可使用 ? 做为查询参数占位符。在使用查询参数占位符时,在其内部自动调用 connection.escape() 方法对传入参数进行编码。
    例如:

var userId = 1, name = 'test';
var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) {
   // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
  1. 使用mysql.format()转义参数
    准备查询,该函数会选择合适的转义方法转义参数 mysql.format()用于准备查询语句,该函数会自动的选择合适的方法转义参数。
    例如:
var userId = 1;
var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1
  1. 也可以通过正则或者字符串筛选来对输入内容的验证

XSS(跨站脚本攻击)

XSS指的是跨站脚本攻击,是web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。比如获取用户的cookie通过ajax发送到攻击者的服务器,导航到恶意网站等。

XSS攻击原理
分类:
反射型

注入脚本从网站服务器被反弹回来,比如错误消息、搜索结果、或者任何其他响应(这些响应完全或部分包含了用户在浏览器输入的内容)。反射型攻击通过其他途径传递到受害者,比如邮件、或其他网站。当用户被引诱点击恶意链接,提交一个特别构造的表单、或浏览一个恶意站点,注入脚本传送到了脆弱站点并反射给用户的浏览器,浏览器认为该链接来自一个可信的服务器就执行了它。反射型XSS也称为非持久型。

简单的举个栗子:
html

<textarea id='text'/>
<button type='button' id='btn'></button>
<script>
  const btn = document.queryselector('#btn')
  const text = document.queryselector('#text')
  btn.addEventListener('click', async () => {
      try{
          const result = await axios.get(`/test?test=${text.value}`)
          const { success, text } = result
          if(success){
                document.body.insertAdjacentHTML('beforeend', text)
          }
      }catch(e){
          //
      }
  })
</script>

express

const express = require('express')
const router = express.Router()

router.get('/test', (req, res, next) => {
 //
 res.json({
   success:true,
   test:req.query.test
 })
})

现在我们通过文本框添加一段代码

<img src="null" onerror='alert(document.cookie)' />

通过click事件, 把这段代码提交到服务端,并进行了相应,就会获得到用户的cookie。
实际上我们只是进行了模拟攻击。如果是攻击者的话,会注入一段第三方的js代码(各种编码形式的unicode编码,html十进制、十六进制编码),然后将获取到的cookie储存到他们的服务器上,这样的话攻击者就可以拿身份认证做一些有害于我们的事情了。

<img src="x" onerror="\u0061\u006c\u0065\u0072\u0074('js-unicode-encoded')">
<img src="x" onerror="alert(1)">
 <img src="x" onerror="&#x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x68&#x74&#x6d&#x6c&#x7f16&#x7801&#x27&#x29">

储存型

存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了

最典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。
DOM XSS

DOM XSS攻击不同于反射型XSS和存储型XSS,DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。这完全是客户端的事情。

DOM XSS代码的攻击发生的可能在于我们编写JS代码造成的。我们知道eval语句有一个作用是将一段字符串转换为真正的JS语句,因此在JS中使用eval是很危险的事情,容易造成XSS攻击。避免使用eval语句。
再举下🌰:

test.addEventListener('click',  () => {
  const node = window.eval(txt.value)
  window.alert(node)
}, false)

//txt中的代码如下
<img src='null' onerror='alert(123)' />

通过eval语句就造成了XSS攻击。

XSS危害

  1. 盗取cookie
    通过XSS攻击,由于注入代码是在被攻击者客户端执行的,因此盗取到cookie信息,从而冒充被攻击者。
    2.钓鱼攻击
    所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。

XSS预防
1.输入过滤
对用户输入的内容进行检测, 比如<、>、/ 等可能导致脚本注入的特殊字符,或者过滤 script 、javasript 等脚本关键字。同时我们也要验证16进制的字符。 只要对每个输入点进行验证,保证对所有用户的输入进行检测,就能有效的阻止XSS攻击。
2.输出编码
对输出的内容进行编码和解码,就能保证所有的都是当做文本来进行处理。
3.cookie加密
对于cookie来说, 尽量的不去存储敏感信息,如用户名,密码等。其次我们对其进行MD5加密之后再进行算法的处理,来截取cookie来达到加密效果,或者也可以和ip进行绑定。

CSRF

跨站请求伪造

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
原理  
网站A :为恶意网站。
网站B :用户已登录的网站。
当用户访问 A站 时,A站 私自访问 B站 的操作链接,模拟用户操作。
假设B站有一个删除评论的链接:http://b.com/comment/?type=delete&id=81723
A站 直接访问该链接,就能删除用户在 B站 的评论。
CSRF防御
1.验证码
一些关键的操作都可以伴随着验证码的确认。
2.token
CSRF能被攻击成功,根本原因是所有的参数都被攻击者猜到。
既然知道原因,那我们可以对症下药。每次请求都携带着token去服务器和session进行验证。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容