一、XSS漏洞
XSS是跨站脚本攻击(Cross Site Scripting)的缩写,分为存储型,反射型漏洞两种
1.存储型xss漏洞(风险等级:高)
漏洞危害
存储XSS把用户输入的数据存储到数据库,显示到前端页面。攻击者可进行身份验证盗取和蠕虫攻击。存储型XSS也叫做“持久型XSS”
漏洞验证
2.反射型XSS漏洞(风险等级:中)
漏洞危害
反射型XSS把用户输入的数据“反射”给浏览器。攻击者往往需要诱使用户“点击”一个恶意链接,才能攻击成功,反射型XSS也叫做“非持久型XSS”
漏洞验证
修复办法
1、使用HttpOnly有助于缓解XSS攻击,但是在部署时需要注意,如果业务复杂,则需要在所有Set-Cookie的地方,给关键Cookie都加上HttpOnly。漏掉了一个地方,都可能使得这个方案失效
2、在服务器端对输入进行格式检查,如在网站注册时填写的用户名只能为字母、数字的组合,手机号应该是不长于16位的数字;检查输入中是否包含一些特殊字符,如<、>、'、"、/等,如果发现,则进行过滤或编码;对输入进行XSS特征的匹配,如查找数据中是否包含“script”、“javascript”、“prompt”、“confirm”等敏感字符
3、一般来说,除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。针对HTML代码的编码方式是HtmlEncode,在PHP中,有htmlentities()和htmlspecialchars()两个函数可以满足安全要求。相应的,JavaScript的编码方式可以使用JavascriptEncode,JavascriptEncode与HtmlEncode的编码方式不同,它需要使用“\”对特殊字符进行转义。在对抗XSS时,还要求输出的变量必须在引号内部,以避免造成安全问题;除了HtmlEncode、JavascriptEncode外,还有很多用于各种情况的编码函数,比如XMLEncode、JSONEncode等
二、SQL注入漏洞(风险等级:高)
漏洞危害
SQL注入被广泛用于非法入侵网站服务器,获取网站控制权。它是应用层上的一种安全漏洞。通常在设计存在缺陷的程序中,对用户输入的数据没有做好过滤,导致恶意用户可以构造一些SQL语句让服务器去执行,从而导致数据库中的数据被窃取、篡改或删除甚至最终导致服务器被入侵等危害
漏洞验证
正常用户输入“admin”,密码为“password”
最终执行的SQL语句为:
select count(*) from admin where username = ' admin ' and password = ' password '
输入特殊用户" 'or 1=1-- "
最终执行SQL语句为:
select count(*) from admin where username = ''or 1=1--' and password = ''
修复办法
对所有输入/输出的参数在进入数据库调用之前,进行严格过滤和检测,要解决SQL注入漏洞,建议采取以下方式:
1、传入的参数明确类型,如果参数是数字,应检查参数输入的内容是否是数字,如果检查到其它类型,则应进行错误处理,避免进入数据库调用
2、对传入的参数中含有特殊字符,应进行转义处理,比如单引号;对数据库关键字如“select”、“update”、“insert”、“and”等进行过滤处理,同时应该具备严格匹配策略,防止攻击者通过大小写、编码等方式绕过限制
3、对传入的参数的检测,都应该在服务器端进行
4、进行异常处理,避免出错时暴露敏感信息
5、合理配置数据库连接用户的权限,应实现权限最小化原则
6、建议使用参数化查询或预编译的方式进行数据库查询
三、CSRF跨站请求伪造漏洞(风险等级:高)
漏洞危害
攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的
漏洞验证
一个典型的CSRF攻击有着如下的流程:
*受害者登录a.com,并保留了登录凭证(Cookie)
*攻击者引诱受害者访问了b.com
*b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie
*a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求
*a.com以受害者的名义执行了act=xx
*攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作 |
修复办法
CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御
1.给每个HTTP请求添加一个不可预测的令牌,并保证该令牌对每个用户会话来说是唯一性。最好的办法是将独有的令牌包含在隐藏字段中,通过HTTP请求发送,避免在URL中暴露出来
2.设定短暂的可信用户会话时间