在这个语法树构造中,body里包含着if构造中的语句return HttpResponse("2"),type为Compare表示该构造体为断定语句,left表示左值即源码中的type,test构造体中则是用来进行if断定,test中的ops对应着源码中的not in,表示比较断定,comparators则是被比较的元素。如许源码就和Python语法树一一对应起来,有了这些一一对应的基本,就有了断定Python注入问题的原型。

Python因为其简单,快速,库丰富的特点在国内应用的越来越广泛,然则一些不好的用法却带来了严重的安然问题,本文大年夜Python源码入手,分析其语法树,跟踪数据流来断定是否存在注入点。

0x01 引言

Python注入问题是说用户可以控制输入,导致体系履行一些危险的操作。它是Python中比较常见的安然问题,特别是把python作为web应用层的时刻这个问题就加倍凸起,它包含代码注入,OS敕令注入,sql注入,随便率性文件下载等。

0x02 注入的场景

主如果在web应用处景中,用户可直接控制输入参数,并且法度榜样未做任何参数断定或者处理,直接就进入了危险函数中,导致履行一些危险的操作。重要的注仁攀类型有:

(一)OS敕令注入

主如果法度榜样中经由过程Python的OS接口履行体系敕令,常见的危险函数有

os.system,os.popen,commands.getoutput,commands.getstatusoutput,subprocess

等一些接口。例如:def myserve(request,fullname):os.system('sudo rm -f %s'%fullname),fullname是用户可控的,恶意用户只需应用shell的拼接符;就可以完成一次很好的进击。

是说袈溱注入点可以履行一段代码,这个一般是由python的序列话函数eval导致的,例如:def eval_test(request,login):login = eval(login),如不雅恶意用户大年夜外界传入import('os').system('rm /tmp -fr')就可以清空tmp目次。

【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路!

(三)Sql注入

在一般的Python web框架中都对sql注入做了防护,然则切切别认为就没有注入风险,应用欠妥也会导致sql注入。例如:

def getUsers(user_id):sql = "select * from auth_user where id =%s’%user_idres = cur.execute(sql)

(四)随便率性文件下载

法度榜样员编写了一个下载报表或者义务的功能,如不雅没有控制好参数就会导致随便率性文件下载,例如:def export_task(request,filename):return HttpResponse(fullname)

0x03 断定道理

大年夜以上四种情况来看,都有一个合营点,那就是危险函数中应用了可控参数,如system函数中应用到的('sudo rm -f %s'%fullname),如eval中应用到的login参数,如execute函数中应用到的user_id参数,如HttpResponse中应用到的fullname参数,这些参数直接大年夜函数中传进来,或者经由简单的编码,截断等处理直接进入危险函数,导致了以上危险行动。如不雅在履行危险函数前对这些可控参数进行必定断定,如必须是数字,路径必须存在,去掉落某些特别符号等则避免了注入问题。 有了这个基本理论,这个参数数据在传递的过程中到底有没有改变?怎么顺利的跟踪可控参数呢?接下来分析Python的语法树。

别的在分析的过程中还得清除下列情况,提前停止分析。第一种情况是 if语句中有os.path.exitst,isdigit带可控参数并且含有return语句,如(if not os.path.isdir(parentPath):return None);第二种情况是将可控参数锁定在某个定值范围并直接返回的,如(if type not in ["R", "B"]:return HttpResponse("2"))。

0x04 Python语法树

很显然,在参数一向传递过程中,通俗的┞俘则表达式已经力所不及了。这个时刻就可以表现Python库丰富的特点。Python官方库中就供给了强大年夜的Python语法分析模块ast。我们可以应用根据ast优化后的PySonar模块,PySonar相对于ast模块而言有机能上的晋升,别的是以Python的dict来表示的。

(一)语法树的表示-文件

一个文件中可以有函数,类,它是模块的构成单位。大年夜体构造如下:{"body":[{},{}],"filename":"test.py","type":"module"},这是文件test.py获得的语法树构造,body琅绫擎包含两个dict,实际琅绫擎会存放函数,类,全局变量或者导入等,它是递归嵌套的,type字段注解类型,在这里是模块,filename则是它的文件名。

(二)语法树的表示-函数

函数的感化就不消多说了,django的view层根本都是以函数为单位的。下面来看一个函数的语法树,如图:

我们简单分析一下这个构造,起首是type,这里是FunctionDef,解释这个构造体是一个函数,_fields中的name,args,body,decorator_list等是函数的根本构成单位。name是函数名称,上述函数名为is_this_subdomain;args是函数的参数,它包含通俗参数args,默认参数kwarg;lineno是标明该语句地点的文件的行数;decorator_list则是函数的润饰器,上述为空。

(三)语法树的表示-类

在类的语法树中,包含body,decorator_list,lineno,name,base等字段type是ClassDef,注解该构造为class,body中则包含着函数的构造体,base则是持续的父类。

(四)语法树的表示-示例

接下来我们将以一个if构造片段代码作为示例,来解释Python源码到其语法树的对应关系。片段代码:if type not in ["RSAS", "BVS"]:return HttpResponse("2"),获得的语法树如图2:

0x05 注入断定的实现

(二)代码注入

注入断定的核心就在于找到危险函数,并且断定其参数是可控的,找到危险函数这个只须要保护一个危险函数列表即可,当在语法树中发清楚明了函数调用处且其名称在危险列表中就可以标记出该行代码,接下来的可贵就在于跟踪该函数的参数,默认认为该危险函数的外层函数的参数是可控的,那就只须要分析这个外层函数参数的传递过程即可。起首分析哪些情况下,年腋荷琐参数赋值给别的一个参数其值照样可控的,下面列举了5中根本情况:

推荐阅读

【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路!

数据中间最重要的是要完美和>>>详细阅读

地址:http://www.17bianji.com/lsqh/36334.html

python在审计中的应用-【干货】Python自动化审计及实现相关推荐

  1. python在审计中的应用-基于python的自动化代码审计

    本文通过介绍在python开发中经常出现的常规web漏洞,然后通过静态和动态两种方式对python代码进行自动化审计挖掘漏洞,并且展示自动化系统在自动化审计python应用代码的成果,本文比较长,请耐 ...

  2. python在人工智能应用锁_干货 | Python人工智能在贪吃蛇游戏中的应用探索(上)...

    文案&代码 白宇啸 排版&审校 邓发珩 前言 一个月前,人工智能对我来说都是很陌生的,更不用说神经网络.强化学习.DQN等名词了.疫情期间,经过在家努力学习,我对这些概念越来越清晰了, ...

  3. python博客访问量_史诗级干货-python爬虫之增加CSDN访问量

    AI 人工智能 史诗级干货-python爬虫之增加CSDN访问量 史诗级干货-python爬虫之增加CSDN访问量 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法. ...

  4. python excel增加一列_(用Python修改excel中一列数据)python新增一列

    python怎么从excel中读取数据? ⒈ #import παέτο import xlrd #Ρύθμι διαδρής path='C:\\Users\\jyjh\\Desktop\\data ...

  5. 如何切换默认python版本_Debian中如何切换默认Python版本

    基于系统修改 Python 版本: 我们可以使用 update-alternatives 来为整个系统更改 Python 版本.以 root 身份登录,首先罗列出所有可用的 python 替代版本信息 ...

  6. python关键词提取_如何从Python格式字符串中提取关键字? - python

    我想在API中提供自动字符串格式,例如: my_api("path/to/{self.category}/{self.name}", ...) 可以替换为格式化字符串中标注的属性值 ...

  7. python 2.7中urllib 2 与python 3.5中 urllib的区别。

    python 3.x中urllib库和urilib2库合并成了urllib库. 其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Reque ...

  8. python提取cad中的文字_[python]提取PPT中的文字(包括图片中的文字)

    python是一门很强大的语言,因为有着丰富的第三方库,所以可以说Python是无所不能的. 很多人都知道,Python可以操作Excel,PDF·还有PPT,这篇文章就围绕Python提取PPT中的 ...

  9. python金融量化书籍_超强干货 | Python金融数据量化分析教程+机器学习电子书

    如今Python语言的学习已经上升到了国家战略的层面上.Python语言是人工智能的基础语言,国家相关教育部门对于"人工智能普及"格外重视,不仅将Python列入到小学.中学和高中 ...

  10. python提取json中的值,在Python中从JSON提取特定值

    从对API的调用结果(使用urllib2)中,我在Python中有一个JSON对象,如下所示: results = urllib2.urlopen(req).read() json1 = json.l ...

最新文章

  1. 时隔16年,Science再次发布“全世界最前沿的125个科学问题”!
  2. java.sql.date格式化_如何将java.sql.date格式化为这种格式:“MM-dd-yyyy”?
  3. 尚硅谷谷粒学院2020 高级篇代码_尚硅谷联合KubeSphere ,共同打造企业级云原生课程!...
  4. java面试题9 牛客:不同的服务器之间,哪种通信方式是不可行的
  5. java jdbc mysql 乱码_【求助】为什么用纯java jdbc插入mysql一直乱码
  6. DataBseDesign工作笔记005---将excel中的表导入到powerdesigner中
  7. http请求头获取 -python
  8. Style和Script中的注释问题。
  9. 从绝望中寻找希望,人生必将辉煌
  10. 牛客练习赛22C Bitset
  11. jquery实现页面提示,数据正在加载中
  12. 一文带你了解夜间灯光数据
  13. 全面的C#编码规范整理
  14. 2020,2022年全年详细工作日、周末、节假日数据表sql
  15. java实现网页结构分析列表发现
  16. mail163邮箱官网如何注册?
  17. CSS transform属性+js requestAnimationFrame函数实现旋转方块以及调整转动速度
  18. photoshp案例技巧-彭亮-专题视频课程
  19. 方孔分段的lisp_cad怎么把一条线直接分段
  20. 人工智能中的常用搜索策略

热门文章

  1. Mybaits 运行原理流程图
  2. oracle Hash Join及三种连接方式
  3. Android查询数据库问题
  4. (asp.net MVC学习)System.Web.Mvc.UrlHelper的学习与使用
  5. 8-7-Exercise
  6. a标签代替input[button]
  7. mysql bit 和 tinyint 的区别及使用场景?
  8. 计算机操作系统基础知识-2
  9. 第一篇:数据仓库概述
  10. Django 应用开发(2)