python 自动化审计

基于python的自动化代码审计

代码审计 逢魔安全实验室 

2018-02-11  10,539

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

从python常规漏洞来看都有一个共同点,那就是危险函数中使用了可控参数

  1. 如system函数中使用到的(‘mv %s’% filename),
  2. 如execute函数中使用到的username参数,
  3. 如HttpResponse中使用到的nickname参数,

这些参数直接从第一层入口函数中传进来,或者经过简单的编码,截断等处理直接进入危险函数,导致了以上危险行为。

静态分析的核心是什么?

注入判断的核心就在于找到危险函数,并且判断其参数是可控的,找到危险函数这个只需要维护一个危险函数列表即可。

当在语法树中发现了函数调用并且其名称在危险列表中就可以标记出该行代码,接下来的难点就在于跟踪该函数的参数,默认认为该危险函数的外层函数的参数是可控的,那就只需要分析这个外层函数参数的传递过程即可

在python中,参数的处理过程大概总结如下这些情况:

直接赋值:GET参数直接赋值

属性赋值:request.POST.get(‘name’)赋值,排除META中的内容

字符串拼接:字符串拼接

列表解析式:

元组、列表、字典数据处理:元素相加,赋值value等

Subscript分片取值:通过下标索引取值

函数调用后赋值:字符串操作的系统函数str,strip,split,encode等,未过滤的自定义函数,危险函数

With操作:

For循环:

If判断:

排除特殊情况:

判断是否合法:os.path.exitst,isdir等

锁定范围:Type in [xxx,xxx]

如果存在此文件中导入了其他非系统模块,继续递归解析此模块文件

如果存在此文件中导入了其他非系统模块,继续递归解析此模块文件

如果存在类的话,继续递归类里面方法的内容

Body的内容是嵌套的,一个body里面可能还有很多个body

循环body体中的元素,然后取出body中的body,orelse,test,handlers元素,继续递归查找可控参数

以行为单位解析出来的结构和内容

Name为被赋值的变量名

然后value里面就是具体的内容

从右往左一次嵌套,所以request在最里层的value

以Python文件为入口,解析成语法树,格式化为json格式

取出语法树中的函数体内容

然后遍历函数体中的代码行:

如果有危险函数调用,并且有可控参数进入此危险函数,则报出漏洞

所以这里的核心就是:

1、递归全部代码查找可控参数,生成可控参数列表

2、维护危险函数列表

最早的版本已经开源,大家可以借鉴,可以阅读代码了解python的语法树

静态分析的缺陷:

漏报误报高

可控参数分析覆盖不够全

外部导入函数对可控参数判断的影响

python 是一种动态类型语言,python 中一切皆对象

所以换句话说每个对象可以在程序里任何地方改变它

这就意味着我们可以劫持我们认为危险的函数

拦截进入函数的参数,判断是否有恶意参数进入,从而判断是否存在漏洞

Python的广泛使用,很大部分是因为开发效率高,模块使用方便

所以就劫持就针对:

1、模块的直接方法

2、模块的类,已经类方法进行了

举例:

模块的方法可以直接被劫持

首先通过imp导入os模块,然后在覆盖到其中的system方法

在调用system方法时,就是这里的__call__方法了

判断进入system方法的参数是否有恶意内容,从而可以判断是否真正触发了漏洞

元类:

元类就是用来创建类的类,函数type实际上是一个元类

元类的主要目的就是为了当创建类时能够自动地改变类。

__metaclass__:

你可以在写一个类的时候为其添加__metaclass__属性, Python就会用它来创建类

__metaclass__可以接受任何可调用的对象,你可以在__metaclass__中放置可以创建一个类的东西

__new__:是用来创建类并返回这个类的实例

__call__:任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用,用callable来判断是否可被调用

__getattribute__:定义了你的属性被访问时的行为

你首先写下class Foo(object),但是类对象Foo还没有在内存中创建。

Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类

定义test类,使用metaclass来创建tesk类

这时在metaclass中就可以动态修改这个类

这里使用upperattr,在创建test类时,将属性名称全部大写

在test类实例化的时候就会执行上述操作,达到动态修改类的效果

举例:

模块的类的劫持

在当前pythonpath路径下创建socket.py文件

然后劫持_fileobject类,使用_installclshook动态修改此类

变量_fileobject的属性方法时,返回_hook_writelin 和 _hook_readline

写好的劫持脚本,放到当前的工作根目录下即可

然后正常启动项目,劫持脚本就会自动生效,劫持特定的方法

但是内建函数方法,built-in method无法直接覆盖劫持

这时也可以通过monkey path来实现:

Monkey patch就是在运行时修改代码,实现hot patch的一种手段

将patch脚本import到应用里面,在功能函数入口通过装饰器的方式应用patch即可

动态审计的优点:

  • 准确性高
  • 可以平台化
  • 但是使用和扩展需要了解具体模块的结构,pyhton的魔术方法等基础知识
  • 因为需要部署到目标系统代码中,所以动态修改后的类和方法会对系统造成未知的影响,(不过目前测试来看还没出现)

这里这个开源的项目是使用动态hook来制作python后门的例子,可以参考

动态检测和静态检测相结合,相辅相成,相互补助,才能达到更好的效果,最后才能自动化检测

对于,git和svn这种版本控制的,可以不用每次都扫描全部代码,可以根据版本号扫描范围之间的代码,节省资源,速度快

下载agent安装包后,根据右边的部署说明,部署agent到需要检测的服务器上即可

成功部署agent后,会在平台上显示主机是否在线

并且agent会自动hook功能代码入口:

比如django开发的系统,根据url整理views中的方法,然后自动劫持这些方法即可,不用全部劫持,尽量减少对系统代码的改动

用户设置代理,正常访问系统

代理替换参数内容为payload,到系统后,漏洞检测系统自动检测漏洞然后显示信息到控制台

欢迎阅读,关于此自动化审计系统开源情况请关注FormSec官方公众号,谢谢!

本文作者:逢魔安全实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/68344.html

Tags: csrfPythonSql注入SSRFSSTIweb漏洞XSS代码审计动态分析危险函数可控参数命令执行基于python的自动化代码审计注入防御自动化自动化应用静态分析

原文地址:https://www.cnblogs.com/csnd/p/12221349.html

时间: 2024-11-13 15:05:44

python 自动化审计的相关文章

Python自动化审计及实现

Python语言由于其简单,快速,库丰富的特点在国内使用的越来越广泛,但是一些不好的用法却带来了严重的安全问题,本文从Python源码入手,分析其语法树,跟踪数据流来判断是否存在注入点. 0x01 引言 Python注入问题是说用户可以控制输入,导致系统执行一些危险的操作.它是Python中比较常见的安全问题,特别是把python作为web应用层的时候这个问题就更加突出,它包括代码注入,OS命令注入,sql注入,任意文件下载等. 0x02 注入的场景 主要是在web应用场景中,用户可直接控制输入

Python自动化运维课程学习--Day3

本文为参加老男孩Python自动化运维课程第三天学习内容的总结. 大致内容如下: 1.文件操作 2.字符编码转码相关操作 3.函数 0.关于本文中所有运行Python代码的环境: --操作系统:Ubuntu 16.10 (Linux 4.8.0) --Python版本:3.5.2 python2.7.12 --Python IDE: PyCharm 2016.3.2 一.文件操作: 1.文件操作流程:以只读.写(覆盖写).追加写.读写.追加读写.二进制读写等模式打开文件 ==> 得到文件句柄,并

python全栈和python自动化课程的区别在哪?

老男孩算是国内组早的做python培训的机构了,下面小编对于python自动化课程及全栈课程做了一个总结,希望能帮到你们: python全栈开发: 适合人群:应届本科生,专科,及零基础学员学习基础:0基础上课形式:脱产5个月,周一至周五上课课程内容:linux基础知识,python基础知识,网络编程,数据库应用,web开发,算法设计模式项目实战:博客系统开发,CRM系统开发,CMDB开发,主机开发管理,爬虫开发,金融量化交易项目开发未来发展方向:python全栈开发工程师就业方向:python爬

Selenium2+python自动化59-数据驱动(ddt)

前言 在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的.如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成. 一.环境准备 1.安装ddt模块,打开cmd输入pip install ddt在线安装 >>pip install ddt 二.数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt.data() 4.运

Python自动化运维课程学习--Day2

本文为参加老男孩Python自动化运维课程第二天学习内容的总结. 大致内容如下: 1.python模块初识 2.python程序运行流程 3.python数据类型(只讲了numbers, bool, strings, bytes, list, tuple, dict, set) 4.python数据运算 0.关于本文中所有运行Python代码的环境: --操作系统:Ubuntu 16.10 (Linux 4.8.0) --Python版本:3.5.2 --Python IDE: PyCharm

Selenium2+python自动化39-关于面试的题

前言 最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下, 回答不妥的地方欢迎各位高手拍砖指点. 一.selenium中如何判断元素是否存在? 首先selenium里面是没有这个方法的,判断元素存在需要自己写一个方法了. 元素存在有几种形式,一种是页面有多个元素属性重复的,这种直接操作会报错的:还有一种是页面隐藏的元素操作也会报错 判断方法参考这篇:Selenium2+python自动化36-判断元素存在 二.selenium中hidden或者是displa

Python自动化面试必备 之 你真明白装饰器么?

装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多小白来讲,这个功能 有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都 不会,别跟人家说你会Python, 看了下面的文章,保证你学会装饰器. 1.先明白这段代码 #### 第一波 #### def foo():     print 'foo'   foo     #表示是函数 foo()   #表示执行foo函数   #### 第二波 

Python自动化环境搭建

安装配置 Eclipse + PyDev + Robotframework 集成开发环境 1.安装JDK安装目录下的jdk-7u17-windows-i586.exe文件(JAVA开发.运行环境)安装完毕后,在系统变量(右键点击计算机->属性->高级系统设置->环境变量->)中找到path变量,在变量值最后面添加“C:\Program Files\Java\jre7;”,点击保存打开CMD,输入JAVA -version 若显示当前JDK版本,则表示安装成功 2.安装python在

python自动化管理mysql主从同步

mysql 多实例 1.my.cnf 通过定义mysqldconfig类   mysqld_vars = {}  从里面获得很多配置文件相关参数写入字典 mysql.py 2.init DB 初始化数据库 3.修改权限 4.rc脚本启动 5.check 检查一下配置文件,配置文件与mysql变量同步 6.值其实一样,不让显示 7.Popen 调用 mysql -e 命令 SQL IO Seconds_Behind_Master:0    看这个阀值.大于两秒 8.mysql主从 主配置文件: b