SQL注入漏洞
在设计程序时,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。SQL注入攻击通过构造巧妙的SQL语句,同网页提交的内容结合起来进行注入攻击。比较常用的手段有使用注释符号、恒等式(如1=1)、使用union语句进行联合查询、使用insert或update语句插入或修改数据等,此外还可以利用一些内置函数辅助攻击。被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。
- SQL注入的位置包括:
- 表单提交,主要是POST请求,也包括GET请求;
- URL参数提交,主要为GET请求参数;
- Cookie参数提交;
- HTTP请求头部的一些可修改的值,比如Referer、User_Agent等;
- 一些边缘的输入点,比如.mp3文件的一些文件信息等。
- 防范措施:
- 所有的查询语句都使用数据库提供的参数化查询接口
- 对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换
- 确认每种数据的类型
- 数据长度应该严格规定
- 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过
- 严格限制网站用户的数据库的操作权限
- 避免网站显示SQL错误信息,比如类型错误、字段不匹配等
XSS漏洞
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以XSS漏洞关键就是寻找参数未过滤的输出函数。常见的输出函数有: echo、printf、print、print_r、sprintf、die、var-dump、var_export.
分类:
- 反射型XSS(非持久化):若输出函数并未对用户输入进行任何过滤,则当输入javascript代码时就会被执行。如果输入攻击性语句,如
document.cookie
等就会造成用户的cookie信息、用户浏览器信息等泄露。 - 存储型XSS(持久化):通过未过滤的输入点将恶意脚本上传写入数据库,当有用户访问时就会读取恶意脚本,然后在本地浏览器加载执行。一次提交之后,每当有用户访问这个页面都会受到XSS攻击。
- DOM型XSS:基于文档模型造成的XSS攻击
- 反射型XSS(非持久化):若输出函数并未对用户输入进行任何过滤,则当输入javascript代码时就会被执行。如果输入攻击性语句,如
防范措施:
PHP直接输出html的,可以采用以下的方法进行过滤:
- htmlspecialchars函数
- htmlentities函数
- HTMLPurifier.auto.php插件
- RemoveXss函数
PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:
- 尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
- 必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤
其它的通用的补充性防御手段
- 在输出html时,加上Content Security Policy的Http Header
(作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
(缺陷:IE或低版本的浏览器可能不支持) - 在设置Cookie时,加上HttpOnly参数
(作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全) - 在开发API时,检验请求的Referer参数
(作用:可以在一定程度上防止CSRF攻击)
(缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)
- 在输出html时,加上Content Security Policy的Http Header
CSRF攻击
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。即攻击者盗用了你的身份,在你不知情的情况下,以你的名义发送恶意请求。
攻击过程:
- 用户通过浏览器正常登录某网站,在通过验证后,网站产生Cookie信息并返回给浏览器
- 用户未退出该网站之前,在同一浏览器中,打开了具有攻击性的链接
- 该链接让浏览器发送Get请求,由于用户已经登录,因此它将携带正确的cookie并以其权限发送请求,从而导致来自黑客请求恶意代码被执行
防范措施:
- 添加csrf_token
- 验证Refere(js无权动Referer)
- 加验证码
SSRF
服务器端请求伪造