Python代码审计实战案例总结之SQL和ORM注入

Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成。目前Python代码审计思路,呈现分散和多样的趋势。Python微薄研发经验以及结合实际遇到的思路和技巧进行总结,以便于朋友们的学习和参考。

[[285489]]

SQL注入和ORM注入

这两者注入相似度较高,所以打算放在一起分析和总结。它们所用原理OWASP TOP TEN 中的描述非常合适,“将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。”。

1. SQL注入

Python 中常见存在风险SQL语句,在id或者Name可控的情况下存在安全隐患。可控参数可以将咱么期望他执行的代码按照语法进行拼接,从而执行原本预期之外的代码。

  1. sql = "select id,name from user_table where id = %s and name = %s" % (id, name) 
  2. cur.execute(sql) 

然而在实际案例中,这种执行SQL语句并不多,比较典型的案例。实例代码如下:

  1. import urllib 
  2. import MySQLdb 
  3. import SocketServer 
  4. from SimpleHTTPServer import SimpleHTTPRequestHandler 
  5. class MyHandler(SimpleHTTPRequestHandler): 
  6.     def _set_headers(self): 
  7.         self.send_response(200) 
  8.         self.send_header('Content-type', 'text/html') 
  9.         self.end_headers() 
  10.     def do_GET(self): 
  11.         print("got get request %s" % (self.path)) 
  12.         hql = urllib.splitquery(self.path)[1] 
  13.         uri_c = str(hql) 
  14.         print('cmd===%s' % (uri_c)) 
  15.         sql = "select id from user_table where id = %s" % uri_c 
  16.         db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8'
  17.         cursor = db.cursor() 
  18.         cursor.execute(sql) 
  19.         data = cursor.fetchone() 
  20.         self.wfile.write(data) 
  21. def start_server(): 
  22.     httpd = SocketServer.TCPServer(("127.0.0.1", 8090), MyHandler) 
  23.     print('Starting httpd...') 
  24.     httpd.serve_forever() 
  25. if __name__ == "__main__": 
  26.     start_server() 

这是一个简单的HTTP服务器,目前在Python2中可以正常运行。通过urllib.splitquery获取GET请求的参数,uri_c 里面为请求参数的值。用值传递到SQL语句中拼接,从而产生注入问题。这是比较简单的一种,正常情况下调用链可能会比较长,长短取决于平台的设计架构。

2. ORM注入

(1) sqlalchemy ORM注入(CNVD-2019-17301)

考虑到的理解上比较容易,用模块进行举例,并不涉及到框架。ORM注入是SQL注入的一种特殊情况,ORM模块将SQL语句进行模板化,所以找SQL语句字符串的办法不好用了。那么应该怎么办?根据模块来找寻执行方法,如果模块存在问题和未妥善过滤或转义、存在可控变量则可能会产生问题。如何去发现和查找Python ORM模块,展现朋友们搜索技能的时候到了,不再老生常谈。下面进入案例:

  1. from sqlalchemy import create_engine 
  2. from sqlalchemy.orm import sessionmaker 
  3. import sqlalchemy 
  4. print("sqlalchemy_version:",sqlalchemy.__version__) 
  5. engine = create_engine('mysql://root:[email protected]:3306/mysql?charset=utf8') 
  6. DB_Session = sessionmaker(bind=engine
  7. session = DB_Session() 
  8. session.execute('use mysql;') 
  9. print( 
  10.         session.execute( 
  11.             """ 
  12.                 select * from user where User='root' and 11=1; 
  13.             """ 
  14.     ).fetchall() 

这个是使用sqlalchemy的ORM注入,它存在任意执行SQL语句的接口。道理上讲这个是功能,实际情况大多数程序员都会认为ORM是能够防御SQL注入,这个可能会成为漏洞。通过转义可以更好的解决问题,但是官方可能并不重视。另外还有sqlalchemy几个问题利用order_by注入、利用”limit”和”offset”关键词向”select()”函数传递注入等等,方法一样利用模块过滤不严,暂不多论。

(2) Django JSON SQL注入(CVE-2019-14234)

咱们继续看来 Django JSON SQL注入,关于这个漏洞已经有前人分析过了。这个分析有些难度需要咱们了解Django和PostgreSQL,如果感觉吃力不妨先去学习一番。了解在PostgreSQL之中关于JSON数据的查询主要使用ArrayField、JSONField、HStoreField,通过Django如何进行查询PostgreSQL,Json.objects.filter()和QuerySet.filter()实现,准备工作就绪。

查询使用方法如下:

  1. # 查询方法 
  2. # 查询data数据下名称为test的内容为'user'的整个字段 
  3. Json.objects.filter(data__test='user'
  4. or 
  5. Json.objects.filter(**{"data__test":'user'}) 

通过补丁判断实现方法使用了 self.key_name ,QuerySet.filter()的调用和self.key_name传递有关。

紧接着发现类 KeyTransformFactory 调用了 KeyTransform 传入了 self.key_name ,后续是字符串拼接。这里不多详细阐述感兴趣的朋友跟下流程。

  1. class KeyTextTransform(KeyTransform): 
  2.     operator = '->>' 
  3.     ... 
  4.     # 字符串拼接 
  5.     (%s %s %s)" % (lhs, self.operator, lookup) 

结合注入的知识进行实施测试,结果如下。

  1. # 使用注入 
  2. # 拼接补全SQL语法 
  3. Json.objects.filter(**{"""data__breed'='"a"') OR 11=1 OR('d""":'x',}) 

总结

本次总结Python的SQL注入和ORM注入的挖掘方法和相关案例,SQL注入方面没有找到对应的实际案例,咱们编写简单的案例作为参考。ORM注入为两个案例,分别是关于模块和框架。综合作为实战挖掘的参考,个人之力,恐有疏漏,盼斧正。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/140761.html<

(0)
运维的头像运维
上一篇2025-03-04 02:25
下一篇 2025-03-04 02:26

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注