什么是 OWASP TOP 10
OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。
其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
一、注入
概念
注入通常指的是攻击者在可以输入参数的地方,构造恶意代码(如恶意字符串或者语句等信息)作为参数输入,服务器在验证这个字段的时候,没有过滤,将其作为正常的值参与查询。
下面以sql注入为例,讲解相关内容。
sql注入原理
基于flask应用写了个接口,涉及数据库的查询动作行为,如果要执行的sql没有进行参数化,比方说通过字符串格式化方式接收变量,那这会存在注入的风险。
from flask import Flask, request
import sqlite3
app = Flask(__name__)
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('q')
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute(f"SELECT * FROM users WHERE name='{query}'")
results = cursor.fetchall()
return str(results)
if __name__ == '__main__':
app.run()
sql注入解决方案
为了避免SQL注入攻击,可以使用参数化查询。将用户输入的用户名和密码作为参数传递给查询,而不是直接拼接到查询字符串中。下面是修改过的代码。
from flask import Flask, request
import sqlite3
app = Flask(__name__)
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('q')
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name=?", (query,))
results = cursor.fetchall()
return str(results)
if __name__ == '__main__':
app.run()
具体表现
SQL注入漏洞的具体表现如下:
1. 应用程序返回错误信息:当输入包含恶意SQL代码的数据时,应用程序可能会返回数据库错误信息,如“SQL语法错误”或“无效的参数”。
2. 数据泄露:攻击者可以通过SQL注入漏洞获取数据库中的敏感信息,如用户名、密码、电子邮件地址等。
3. 数据篡改:攻击者可以通过SQL注入漏洞修改数据库中的数据,如更改用户密码、删除数据等。
二、跨站脚本
概念
跨站脚本攻击(XSS)的概念是恶意攻击者在Web页面中插入恶意的Script代码,当用户浏览该页面时,嵌入的Script代码会被执行,从而达到对用户进行恶意攻击的目的。
XSS攻击的类型主要分为以下三类:
存储型XSS:这种类型的XSS攻击持久化,恶意脚本被存储在服务器上,例如在用户的个人信息或发表的文章等地方。如果这些脚本没有被适当过滤,它们将存储在服务器中,并在其他用户访问该页面时触发执行。存储型XSS相对较危险,可能导致蠕虫攻击或Cookie盗窃。
反射型XSS:也称为非持久型XSS,恶意脚本不是存储在服务器端,而是通过用户提供的数据作为参数嵌入到动态生成的网页链接中。当其他用户点击此链接时,恶意脚本会在他们的浏览器中执行。
DOM型XSS:这种类型的XSS攻击是通过修改页面的DOM结构来实现的,例如通过JavaScript操作DOM元素的属性,插入恶意脚本。
XSS攻击的原理是利用了服务器对用户输入缺乏适当的验证和过滤机制。攻击者通过正常的输入手段夹带恶意的HTML脚本代码,当受害者的浏览器访问目标服务器上的页面时,由于对服务器的信任,这段恶意脚本会顺利执行。
接口层存在xss漏洞的表现
向接口输入一些特殊的字符或脚本代码,如<script>alert("XSS");</script>,然后观察接口的输出。如果接口将这些特殊字符或脚本代码原样输出,并且浏览器执行了这些脚本代码,那么接口就可能存在XSS漏洞。
解决方案
为了防御XSS攻击,可以采取以下措施:
对输入和URL参数进行过滤,检查用户输入的数据中是否包含特殊字符,如<、>、'、"等,并进行过滤或编码。
使用HTML实体编码,将字符串js编码转换成实体html编码的方法来防范XSS攻击。
对输出内容进行编码,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。
三、敏感数据泄露
概念
敏感数据泄漏通常指的是不当公开或泄漏应用程序的敏感数据,例如信用卡信息、身份证号码、密码等。这种安全风险可能导致用户隐私泄露和金融损失。
敏感数据泄漏可能发生在多个层面,包括但不限于:
数据传输层面:在客户端和服务器之间传输数据时,如果没有使用加密通信(如HTTPS),敏感数据可能被中间人攻击截获。
数据存储层面:敏感数据在存储时如果没有被适当加密,或者访问控制不严格,可能导致未授权的用户能够访问这些数据。
接口和API层面:API在对外提供服务时,如果没有正确的认证和授权机制,可能会泄露敏感信息。
日志和错误信息层面:系统日志或错误信息中可能包含敏感数据,如果没有正确处理,可能泄露给用户或第三方。
不安全的配置管理:应用程序或数据库的不安全配置可能导致敏感数据泄露。
接口层存在敏感数据泄露的表现
不使用哈希和加盐等技术存储密码。
直接以明文形式存储用户密码。
password、id_card、ps等字段明文传输
解决方案
对敏感数据进行加密处理,确保即使数据被盗也无法解读。
实施严格的访问控制策略,确保只有授权用户可以访问敏感数据。
使用安全的通信协议,如HTTPS或者自研协议,来保护客户端和服务器之间的数据传输。
定期审查和监控日志文件,确保不包含敏感信息。
对开发和运维团队进行安全培训,提高对敏感数据保护的意识。
四、不安全的设计
概念
不安全的设计漏洞主要指在系统设计和架构设计中,由于不恰当的设计导致的安全风险。不安全的设计类漏洞种类非常多,使用一句话来说就是控制机制缺失或控制机制失效。
解决方案
建立并使用安全开发流程,协同专业安全人员进行安全和隐私风险评估;
建立并使用安全设计模式库;
为系统(特别是关键的业务逻辑、访问控制逻辑、授权和鉴权等)面临的威胁建立模型,明确可能来自的攻击有哪些方面;
五、不安全的反序列化
概念
不安全的反序列化是指应用程序在处理用户可控的序列化数据时,没有采取足够的安全措施,导致攻击者可以构造恶意数据来操纵程序的行为,从而引发安全问题。
(反序列化是将数据从一种格式(如二进制)转换回其原始对象形式的过程。在许多编程语言中,如Java、Python和PHP,反序列化被用于将传输或存储的数据恢复为可以在内存中操作的对象。)
解决方案
使用安全的序列化机制:选择适合语言特性的序列化方法,并确保其安全性,避免任何发送到服务器的代码被执行,或者限制可执行代码的执行范围。
严格验证输入数据:在反序列化之前,应对所有用户输入进行严格的验证。
六、安全配置错误
概念
安全配置错误漏洞通常由于系统或应用程序的配置不当而产生,它可能导致未经授权的访问、数据泄露或其他形式的安全威胁。
这类漏洞的产生原因多种多样,以下是几个常见的原因和案例:
使用有缺陷的软件版本:没有及时更新到最新版本可能会保留已知的安全漏洞,使系统容易受到攻击。
未修改默认账户密码:许多系统和应用程序在初始设置时会使用默认的用户名和密码,如果管理员未进行更改,这些默认凭据可能被攻击者利用。
权限设置过于宽松:给予某些账户过高的权限可能导致无意的数据泄露或操作失误。
缺乏敏感资源的访问控制:没有对敏感数据或功能实施适当的访问控制,可能导致未授权访问。
示例应用程序未删除:应用服务器附带的示例应用程序若在生产环境中未删除,可能因安全缺陷被利用。
不安全的默认配置:一些系统或应用程序的默认配置可能不够安全,需要管理员手动调整以提高安全性。
错误的HTTP标头配置:错误的配置可能导致敏感信息泄露,例如,直接在响应中显示文件路径。
包含敏感信息的报错页面:报错页面可能泄露敏感信息,如数据库结构、API密钥等,应确保错误信息不会暴露过多细节。
解决方案
定期更新软件和系统到最新版本。
修改默认的用户名和密码,并实施强密码策略。
根据最小权限原则分配用户权限。
对敏感数据和功能实施严格的访问控制。
审查和删除不必要的示例应用程序和文件。
使用安全的配置选项,关闭不需要的服务和端口。
定期进行安全审计和漏洞扫描,以发现和修复潜在的安全问题。
七、访问控制不足
概念
访问控制不足的概念指的是在信息系统中,未能有效地限制用户或系统对资源的访问权限,可能导致未授权的数据访问或操作。
越权,用户存在某些隐私数据,比方说A用户可以转账B用户的余额,越权场景通常出现在接口层,如果服务未进行用户身份校验容易出现越权问题。
解决方案
实施严格的权限管理:为每个用户分配最小必需的权限,避免赋予过高的访问权限。
定期审计和测试:通过内部和外部审计以及渗透测试来发现和修复系统的弱点。
网络访问控制:使用端口级访问控制和MAC地址过滤等技术手段来限制特定端口和设备的访问权限。
多因素认证:在关键系统或数据访问时,采用多因素认证以增加安全性。
八、跨站请求伪造
概念
跨站请求伪造(CSRF)是一种网络攻击手段,它利用了用户在已登录状态下的信任关系。
原理
身份盗用:攻击者通过诱骗手段,让用户在不知情的情况下执行了攻击者预设的操作。
利用信任:这种攻击方式利用了网站对用户浏览器的信任。当用户在网站A上进行操作时,网站A会信赖来自用户浏览器的请求,认为这些请求是用户本人发起的。
攻击方式:攻击者可能在另一个网站或邮箱中构造恶意链接,当已登录的用户点击这些链接时,他们的浏览器会在不知情的情况下携带认证信息(如Cookie)向目标网站发送请求。
解决方案
使用验证码:对于敏感操作,要求用户输入验证码以验证操作确实由用户本人发起。
检查请求来源:检查HTTP请求头中的Referer字段,确保请求来自合法的源。
SameSite Cookie属性:设置Cookie的SameSite属性,以防止浏览器在跨站请求时发送Cookie。
九、使用含有已知漏洞的组件
概念
应用中使用的一些组件,比如:库文件、框架和其他软件模块,几乎总是以全部的权限运行。如果使用含有已知漏洞的组件,这种攻击可以造成更为严重的数据丢失或服务器接管。应用程序使用带有已知漏洞的组件会破坏应用程序防御系统,并使一系列可能的攻击和影响成为可能。危害比较严重
解决方案
尽量使用比较安全的组件,另外,对于组件的接口的安全性等也需要测试。
十、未验证的重定向和转发
概念
未验证的重定向和转发是指如果未被验证的重定向所指向的是带有用户输入参数的目的URL,那么攻击者可以引导用户访问他们所要用户访问的新站点。
转发,本质上转发是在同一个应用中对一个新页面发送请求。转发有时也是用参数来定义目标页面的,如果参数未被验证,攻击者可以通过它来绕过验证或者是授权检查。
重定向:客户端请求服务器后接收到服务器的重定向状态码和新地址,客户端重新请求新的地址
转发:客户端请求服务器,服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的。
解决方案
尽量避免使用重定向和转发机制,如果使用了,那么在定义目标URL的时候不要包含用户参数。
如果一定要保护用户输入的参数,那么:
对每个参数都必须进行验证以确保它的合法性和正确性,或是在服务端提供映射机制,将用户的选择参数转变为真正的白名单目标页面。