作家
登录

【干货】Python自动化审计及实现

作者: 来源: 2017-07-21 10:22:35 阅读 我要评论


在这个语法树构造中,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中根本情况:


  推荐阅读

  SDN网络的构建及通信业务与光纤引入

【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路! 数据中间最重要的是要完美和>>>详细阅读


本文标题:【干货】Python自动化审计及实现

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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)