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)
- 使用escape()对传入参数进行编码:
mysql.escape(param)
connection.escape(param)
pool.escape(param)
- 使用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'
- 使用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
- 也可以通过正则或者字符串筛选来对输入内容的验证
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="alert('html编码')">
储存型
存储型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危害
- 盗取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进行验证。
网友评论