⼗⼆个常见的Web安全漏洞总结及防范措施
前⾔
本篇⽂章部分摘要⾃《OWASP Top 10 2017》。
OWASP,开放式Web应⽤程序安全项⽬(Open Web Application Security Project)是⼀个组织,它提供有关计算机和互联⽹应⽤程序的公正、实际、有成本效益的信息。其⽬的是协助个⼈、企业和机构来发现和使⽤可信赖软件。
⼀、SQL注⼊
SQL注⼊即是指web应⽤程序对⽤户输⼊数据的合法性没有判断或过滤不严,攻击者可以在web应⽤程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现⾮法操作,以此来实现欺骗数据库服务器执⾏⾮授权的任意查询,从⽽进⼀步得到相应的数据信息。
⽰例:
⽐如我们使⽤的登录接⼝:在登录界⾯包括⽤户名和密码输⼊框,以及提交按钮,输⼊⽤户名和密码,提交。
登录时调⽤接⼝/user/login/ 加上参数username、password,⾸先连接数据库,然后后台对请求参数中携带的⽤户名、密码进⾏参数校验,即sql的查询过程。假设正确的⽤户名和密码为ls和123456,输⼊正确的⽤户名和密码、提交,相当于调⽤了以下的SQL语句。
SELECT * FROM user WHERE username ='ls' AND password ='123456'
sql中会将#及–以后的字符串当做注释处理,如果我们使⽤“’ or 1=1 #” 作为⽤户名参数,那么服务端构建的sql语句就如下:
select * from users where username='' or 1=1#' and password='123456'
#会忽略后⾯的语句,因此上⾯的sql也等价于:
select * from users where username='' or 1=1
1=1属于常等型条件,因此这个sql便成为了如下,查询出所有的登陆⽤户。
select * from users
其实上⾯的sql注⼊只是在参数层⾯做了些⼿脚,如果是引⼊了⼀些功能性的sql那就更危险了,⽐如上⾯的登陆接⼝,如果⽤户名使⽤这
个“’ or 1=1;delete * from users; #”,那么在";"之后相当于是另外⼀条新的sql,这个sql是删除全表,是⾮常危险的操作,因此sql注⼊这种还是需要特别注意的。
防范措施:
1. 严格限制web应⽤的数据库的操作权限,给⽤户提供仅能满⾜需求的最低权限,从⽽最⼤限度的减少注⼊攻击对数据库的危害。
2. 严格限制变量的类型。
3. 对进⼊数据的特殊字符(‘ “ \ <> & *)进⾏转义处理(或编码转换)
4. 不要直接拼接SQL语句,所有的查询语句建议使⽤数据库提供的参数化查询接⼝,使⽤参数化的语句⽽不是将⽤户输⼊的变量嵌⼊
SQL语句中。
5. 在应⽤发布之前建议使⽤专业的SQL注⼊检测⼯具进⾏检测,及时修补被检测出的SQL注⼊漏洞。
6. 避免⽹站打印SQL错误信息,⽐如类型错误、字段不匹配等,可对异常信息做封装,给出友好提⽰,不直接打印堆栈信息到前端。⼆、失效的⾝份认证web后端是指什么
应⽤中负责认证和会话管理的部分没有正确实现,使得攻击者得以泄露密码,⼝令或令牌,进⽽可能获取其他⽤户的⾝份。
漏洞成因:
允许⾃动化的攻击,如凭据填充(credential stuffing,撞库)攻击。
允许暴⼒破解或其他⾃动攻击。
允许默认,弱,⼴为⼈知的密码, 例 “admin/admin”。
使⽤弱,或⽆效的凭据恢复和忘记密码策略。
使⽤明⽂,加密或弱hash的密码。
使⽤损坏的或⽆效的多因⼦认证。
在URL中暴露会话ID。
在成功登录后没有轮换会话ID。
没有及时把会话ID,验证令牌等信息⽆效化。
防范措施:
1. 实现多因⼦认证以组织⾃动化攻击和凭据重⽤。
2. 避免使⽤默认密码。
3. 进⾏弱密码检查。
4. 对齐密码长度,复杂度。
5. 确保注册,凭据恢复和API被加固以抵御账户枚举攻击。
6. 限制或延迟失败的登录尝试,并记录所有失败尝试并在发动攻击时报警。
7. 使⽤服务端,安全,内置的会话管理,确保对于每次登录⽣成随机会话ID。会话ID不应该在URL中,且应该及时销毁。
三、敏感数据泄露
攻击者不是直接攻击密码,⽽是在传输过程中或从客户端(例如:浏览器)窃取密钥、发起中间⼈攻击,或从服务器端窃取明⽂数据。这通常需要⼿动攻击。通过使⽤图形处理单元(GPU),早前检索的密码数据库可能被暴⼒破解。
防范措施:
1. 对系统处理、存储或传输的数据分类,并根据分类进⾏访问控制。
2. 对于没必要存放的、重要的敏感数据,应当尽快清除,或者通过PCI DSS标记或拦截。未存储的数据不能被窃取。
3. 确保存储的所有敏感数据被加密。
4. 确保使⽤了最新的、强⼤的标准算法或密码、参数、协议和密匙,并且密钥管理到位。
5. 确保传输过程中的数据被加密,如:使⽤安全传输层协议(TLS)。确保数据加密被强制执⾏,如:使⽤HTTP严格安全传输协议
(HSTS )。
6. 禁⽌缓存对包含敏感数据的响应。
7. 确保使⽤密码专⽤算法存储密码,如:Argon2 、 scrypt 、bcrypt 或者PBKDF2 。将⼯作因素(延迟因素)设置在可接受范围。
四、越权访问
越权访问(Broken Access Control,简称BAC)是Web应⽤程序中⼀种常见的漏洞,由于其存在范围⼴、危害⼤,被OWASP列为Web应⽤⼗⼤安全隐患的第⼆名。
该漏洞是指应⽤在检查授权时存在纰漏,使得攻击者在获得低权限⽤户账户后,利⽤⼀些⽅式绕过权
限检查,访问或者操作其他⽤户或者更⾼权限。越权漏洞的成因主要是因为开发⼈员在对数据进⾏增、删、改、查询时对客户端请求的数据过分相信⽽遗漏了权限的判定。越权访问漏洞主要分为⽔平越权访问和垂直越权访问
⽔平越权访问漏洞
⽔平越权访问是⼀种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务器端在接收到请求数据进⾏操作时没有判断数据的所属⼈/所属部门⽽导致的越权数据访问漏洞。
假设⽤户A和⽤户B属于同⼀⾓⾊,拥有相同的权限等级,他们能获取⾃⼰的私有数据(数据A和数据B),但如果系统只验证了能访问数据的⾓⾊,⽽没有对数据做细分或者校验,导致⽤户A能访问到⽤户B的数据(数据B),那么⽤户A访问数据B的这种⾏为就叫做⽔平越权访问。
垂直越权访问漏洞
垂直越权是⼀种“基于URL的访问控制”设计缺陷引起的漏洞,⼜叫做权限提升攻击。
由于后台应⽤没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意⽤户只要猜测其他管理页⾯的URL或者敏感的参数信息,就可以访问或控制其他⾓⾊拥有的数据或页⾯,达到权限提升的⽬的。
防范措施:
1. 前后端同时对⽤户输⼊信息进⾏校验,双重验证机制
2. 调⽤功能前验证⽤户是否有权限调⽤相关功能
3. 执⾏关键操作前必须验证⽤户⾝份,验证⽤户是否具备操作数据的权限
4. 直接对象引⽤的加密资源ID,防⽌攻击者枚举ID,敏感数据特殊化处理
5. 永远不要相信来⾃⽤户的输⼊,对于可控参数进⾏严格的检查与过滤
五、安全性错误配置
攻击者能够通过未修复的漏洞、访问默认账户、不再使⽤的页⾯、未受保护的⽂件和⽬录等来取得对系统的未授权的访问或了解。
使⽤默认账户和密码、在应⽤栈中任意⼀处没有安全加固,云服务器授权没有正确配置、应⽤服务器,应⽤框架,库,数据库中的安全设置没有被设为安全值、服务器没有发送安全头或指令等都有可能造成安全性错误配置漏洞。
防范措施:
1. ⼀个可以快速且易于部署在另⼀个锁定环境的可重复的加固过程。开发、质量保证和⽣产环境都应该进⾏相同配置,并且,在每个环
境中使⽤不同的密码。这个过程应该是⾃动化的,以尽量减少安装⼀个新安全环境的耗费。
2. 搭建最⼩化平台,不包含任何⾮必须地特性,组件,⽂档。
3. 包管理⼯具中检查并更新安全配置。
4. ⼀个能在组件和⽤户间提供有效的分离和安全性的分段应⽤程序架构,包括:分段、容器化和云安组。
5. 向客户端发送安全指令,如:安全标头。
6. 在所有环境中能够进⾏正确安全配置和设置的⾃动化过程。
六、XSS跨站脚本攻击
XSS漏洞出现在当web页⾯包含不可信的数据,却没有合适的验证⼿段来到它的时候。XSS使得攻击者能够在受害者的浏览器中执⾏脚本,从⽽劫持会话,或重定向到恶意站点。
漏洞成因:
存在三种XSS类型,通常针对⽤户的浏览器:
反射式XSS:应⽤程序或API包括未经验证和未经转义的⽤户输⼊,作为HTML输出的⼀部分。让攻击者在受害者的浏览器中执⾏任意的HTML和JavaScript。例如恶意漏洞⽹站,⼴告或类似内容。
存储式XSS:你的应⽤或者API将未净化的⽤户输⼊存储下来了,并在后期在其他⽤户或者管理员的页展⽰出来。存储型XSS⼀般被认为是⾼危或严重的风险。
基于DOM的XSS:会动态的将攻击者可控的内容加⼊页⾯的JavaScript框架、单页⾯程序或API存在这种类型的漏洞。
防范措施:
防⽌XSS需要将不可信数据与动态的浏览器内容区分开。这可以通过如下步骤实现:
1. 使⽤⾃动转义XSS的框架,⽐如React JS。学习每种框架的XSS保护,并⼿动处理⽤例没有覆盖到的部分。
2. 转义不可信的HTTP请求数据能够解决反射型和存储型XSS威胁。
3. 在客户端修改浏览器⽂档时应⽤内容敏感的编码以抵御DOM XSS。或使⽤相似的内容敏感转义技术。
4. 启⽤CSP(Content Security Policy),这是⼀种对抗XSS的纵深防御弥补控制。
七、不安全的反序列化

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。