在Python中查找和修复不安全的直接对象参考
#python #applicationsecurity #opensourcesecurity #codesecurity

不安全的直接对象引用(idor)是一个安全漏洞,当系统实现允许攻击者无需授权检查即可直接访问和操纵敏感对象或资源时,就会发生。例如,当应用程序基于用户提供的输入提供对对象的直接访问时,可能会出现立法师,从而允许攻击者绕过授权。

了解双子座的漏洞

我们必须处理文献,以保持您的Python应用程序处理的敏感数据的机密性,完整性和可用性。开发人员必须了解树立脆弱性,以防止未经授权的访问,维持用户信任并避免潜在的严重财务和法律后果。

族裔的类型

didors根据应用程序实施和功能采取不同的表格。

fior to to to tococts

当攻击者可以访问或修改未经授权的对象时,就会发生这种形式。一个常见的示例是,当Web应用程序允许通过简单请求(例如example.com/accounts?id={account_id})访问敏感数据(例如银行帐户)。如果该应用程序没有有效验证请求者的许可,则未经授权的用户可以查看或操纵帐户信息。

fior to file files

这种类型的书架涉及未经授权的文件检索。例如,如果聊天应用程序将机密对话存储为编号文件,则攻击者可以通过进行类似编号的请求访问私人对话。

盲人

盲目的书架是指在服务器响应中直接可见的剥削的情况,即使可能发生了未经授权的修改。使用盲人,攻击者可以在不查看其他用户的私人数据上更改另一个用户的私人数据。例如,如果Web应用程序允许用户通过API调用来修改其配置文件设置,例如example.com/users/update?id={user_id},则攻击者可以在请求中操纵user_id,从而在不直接查看其数据的情况下更改用户的配置文件。

共同的模式,以帮助我们在代码中发现子公司漏洞

检测代码中的正子漏洞需要保持警惕和对常见模式的理解:

  • 缺乏访问控制:将用户输入直接访问资源的应用
  • 可猜测的标识符:易于猜测的标识符,例如顺序整数(user_id=99001)或短字符串(user_id=user1) - 在应用程序中增加了婚外脆弱性的风险。使用难以猜测的标识符,例如通用唯一标识符(UUIDs),可以降低这种风险。
  • 直接访问文件:通过URL或请求参数可直接访问任何资源的应用程序,例如图像或CSV文件。我们必须确保有适当的控制机制,以避免使用户直接访问文件。

使用fastapi创建一个使用fastapi的python应用程序

在本节中,我们将使用Python Framework FastAPI创建一个容易受IDOR的Web API。然后,我们将研究如何补救漏洞。

要跟随此动手教程,请确保您在计算机上安装了Python 3.x。

入门

首先,我们需要一个新的应用程序。为您的项目创建一个新目录并进入目录:

mkdir fastapi-app; cd fastapi-app

然后,使用以下命令安装FastAPISQLAlchemySQLAlchemySQLite

pip install fastapi uvicorn sqlalchemy

最后,在项目目录中创建一个名为main.py的文件。

使用FastAPI创建脆弱的API

现在,我们已经设置了我们的目录结构和要求,让我们编写包含婚外漏洞的代码。首先,将下面的代码复制到main.py

from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

app = FastAPI()

# SQLite database configuration
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# User model
class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    uuid = Column(String, unique=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String, unique=True, index=True)

Base.metadata.create_all(bind=engine)

# Dependency for database session
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users/{user_id}")
async def get_user_by_id(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

bude9端点中的属性漏洞。由于该应用程序没有访问控件,因此任何用户都可以通过更改URL中的user_id来查看其他用户数据。

识别和修复子公司漏洞

现在,让我们在我们的fastapi应用程序中查找并修复了IDOR安全漏洞。

寻找漏洞

要识别依恋漏洞,我们必须在代码中寻找特定模式。在FastAPI应用程序中,我们应该检查/users/{user_id}端点,该端点代表了潜在的书架漏洞,其原因是:

  • 未受保护的直接对象引用:在get_user_by_id函数中,user_id参数直接涉及数据库中的User对象。任何客户端都可以在请求中操纵user_id值以访问其他用户的数据,因为没有访问控制机制保护此直接参考。
  • 缺乏授权:在相同的get_user_by_id功能中,没有检查请求用户是否被授权访问请求的用户数据。任何用户都可以通过操纵user_id参数访问任何其他用户的数据。

修复脆弱的代码

要修复子公司漏洞,我们需要更新/users/{user_id}端点以具有正确的访问控制检查。

让我们模拟身份验证的用户,只有在URL中的user_id匹配身份验证的用户的ID时,才允许访问。出于演示的目的,让我们假设身份验证的用户具有1的ID。这是更新的代码:

@app.get("/users/{user_id}")
async def get_secure_user(user_id: int, db: Session = Depends(get_db)):
    # Assume user authentication and authorization are performed here
    authenticated_user_id = "hbecec-edeek-wxwexe-cdcece" # better to use UUIDs

    if authenticated_user_id != user_id:
        raise HTTPException(status_code=403, detail="Not authorized to access this user")

    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

在此代码块中,我们添加了一个访问控制检查,将user_id从URL与authenticated_user_id进行了比较。如果IDS不匹配,则该应用程序会增加HTTP 403禁止错误。此错误可防止未经授权的用户访问其他用户信息,修复了婚外的漏洞。

检测和解决SNYK的安全问题

Snyk是一种安全解决方案,具有软件组成分析(SCA)和静态应用程序安全测试(SAST)功能。让我们使用Snyk来帮助我们在FastApi应用程序中查找和解决安全问题。

安装和身份验证SNYK CLI

要开始,请按照documentation的安装指南在计算机上安装SNYK CLI。

安装CLI后,您需要对SNYK帐户进行身份验证。在终端中运行snyk auth命令,该命令将打开一个浏览器窗口,您可以在其中使用GitHub或Google帐户登录。

扫描依赖性漏洞

要扫描项目中的第三方库中的漏洞,我们需要一个requirements.txt文件。使用以下命令创建requirements.txt

pip freeze > requirements.txt

接下来,通过在终端中执行以下命令来扫描您的项目依赖性:

snyk test --file=requirements.txt --skip-unresolved

此命令分析您的依赖性,然后识别并描述漏洞,详细说明其严重性并提供补救指导。例如,您可能会发现starlette@0.14.2中的中等程度denial of service (DoS)漏洞。

注意:如果缺少所需的软件包,Snyk可以扫描项目。 –skip-unresolved标志覆盖了此行为。

用snyk修复漏洞

SNYK还可以帮助我们修复漏洞。 snyk fix命令可以自动解决一些检测到的问题。 Snyk将升级或修补受影响的依赖项以保护版本,使应用程序保持最新和安全。

使用SNYK代码进行静态代码分析

SNYK还具有功能强大的静态应用程序安全测试(SAST)解决方案。 snyk code命令可以分析您的应用程序代码,确定安全问题,并提供有关如何修复它们的详细信息。

要使用snyk code,在终端中运行以下命令:

snyk code test

SNYK代码将对您的代码库进行深入分析,突出显示目前的任何安全漏洞。它还为这些问题提供补救建议,帮助您维护安全可靠的应用程序。

双子脆弱性解释了

作为开发人员,我们必须确保应用程序安全。 IDORS威胁Web应用程序,因此我们必须学习如何查找和修复它们。有了很好的了解,您可以构建既具有性能又安全的Python应用程序。

在本教程中,您了解了如何在Python应用程序中查找和修补婚言的漏洞。我们还研究了SNYK如何帮助您识别和纠正项目依赖性和应用程序代码本身中的安全风险。 Snyk是一种强大的安全工具,将其集成到您的开发例程中,提供了一层装甲,以保持您的代码坚固。

free trial仔细看看Snyk在引擎盖下面的东西。