用150行python代码来做代码审计笔记

你是否觉得有时候人类的思考模式很像正则匹配?

本文包括以下几个部分:

1、为什么我觉得可以用这个工具(个人认为)

2、我为什么写这个工具

3、工具的实现思路

4、工具的升级思路

5、源代码的 github 地址

6、使用测试

7、最后说两句

为什么我觉得可以用这个工具(个人认为)

通过审计源代码,也就是查看源代码,来发现其中存在的隐患,代码审计需要对被审计的语言有充分的了解,不仅是能读懂源代码,还要了解语言本身的缺陷。很多时候代码审计的突破口就在于一些已经广为人知的有问题的代码的写法。

如果能够快速找到突破口,也就提高了审计的效率。

我为什么写这个工具

我是一个 ctf 小白,为了考 pte,正在学习怎么做 ctf 题目(个人比较感兴趣代码审计的题目,别的没啥什么感觉)。学习知识肯定是要笔记的,但是我觉得那种传统的笔记效果不是太好,记下来了也不一定记住了,到时候遇上题目万一想不起来,多尴尬。

这时我忽然想到,我让程序记住就好了,它不会背叛我,一定会忠实地对我表达他的所见所想。所以我只要让程序看到某个字眼,就来提示我一下,并且告诉我,我把笔记记在了什么地方不就行了。

工具的实现思路

程序入口: adcode.py

主程序: ADC/ADCode.py

插件目录: rules

笔记目录(可选): note

1.读取目标代码

联想平时的应用,我觉得应该让工具从剪贴板内读取待审计的代码,这样使用比较方便。

但是,偶尔也会遇到待审计的代码是一个 php 文件的场景。所以我决定支持两种读取方式,一种是从剪贴板读取,一种是从文件读取。

剪贴板读取,为了能够跨平台,这里需要用到一个 python 的库—— pyperclip,这是一个第三方的跨平台的 python 访问剪贴板的库

进入 python shell 看一下最基本的使用例子:

知道了这个库的使用,只需在代码中用其 paste() 方法,即可获取剪贴板的内容了。

从文件获取比较简单,直接用 python 的 open() 就好了。

2.运行主程序

让入口脚本调用主程序,把读取到的代码和插件的内容传递过去。

3.加载插件

主程序加载插件,借助 BeautifulSoup 来解析插件内容。

插件有三种类型:

1、vulnfunc 只要发现在程序中使用了某函数,则程序认为存在风险。

2、regmatchall 根据插件给出的一条或者多条正则表达式,只有给出的正则全部能够匹配,才认为存在风险。

3、regmatchonce 给出的一条或者多条正则表达式,只要有一条可以匹配,就认为存在风险。

4、keywords 只要在代码中发现了关键词就认为有风险,简单粗暴。

4.返回结果

根据插件的指示来分析代码,并且返回结果。

5.格式化输出

比较好看的把提示输出出来.

工具的升级思路

如果要审计大量的代码,则加入多线程机制,每个线程是一个插件,遍历指定的文件夹,挨个审计即可.

源代码的github地址(我添加了尽量详尽的注释)

https://github.com/hl0rey/ADCode

使用测试

用这个地址的题目来测试,这些题目我觉得很典型很不错

https://github.com/bowu678/php_bugs

复制这个题目到剪贴板

直接运行脚本:

输出内容如下:

最后说两句

1、我不知道这能不能算个代码审计工具,我姑且这么叫它,请各位大神轻喷

2、这个工具的功能强大与否在于插件写的怎么样,是不是准确的把代码的问题用正则概括出来是关键

3、希望能起到抛砖引玉的作用,分享思路

4、也希望刚学习 python 的新手,根据这篇文档和代码的注释能够学到东西

5、一切尽在代码中

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏aCloudDeveloper

Linux探秘之I/O效率

一、文章来由   最近看了《UNIX环境高级编程》,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对...

2307
来自专栏腾讯Bugly的专栏

QFix探索之路——手Q热补丁轻量级方案

QFix 是手Q团队近期推出的一种新的 Android 热补丁方案,在不影响 app 运行时性能(无需插桩去 preverify)的前提下有效地规避了 dalv...

3514
来自专栏NetCore

Sync Framework 词汇表

Sync Framework 词汇表 此词汇表列出和定义了 Microsoft Sync Framework 涉及的概念和术语。 术语 批处理 (batch...

1966
来自专栏py+selenium

py+selenium遇见IE,元素只有name属性【神奇解决】

IE8的问题:IE8不支持getElementByName,而属性中又没有ID,定位难度较大。

3741
来自专栏PHP在线

2018最新PHP学习路线整合

PHP是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。

3265
来自专栏阮一峰的网络日志

处理Apache日志的Bash脚本

去年一年,我写了将近100篇网络日志。 现在这一年结束了,我要统计"访问量排名",看看哪些文章最受欢迎。(隆重预告:本文结尾处将揭晓前5名。) ? 以往,我用的...

3625
来自专栏JackieZheng

Nodejs学习笔记(四)——支持Mongodb

前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs...

2155
来自专栏企鹅号快讯

Python爬虫:selenium的填坑心得

在之前的文章中说过,模拟浏览器在现在的python库中有两个选择Mechanize与Selenium:然而Mechanize不支持JavaScript,Sele...

7079
来自专栏大魏分享(微信公众号:david-share)

Java学习笔记第一篇:坦克大战游戏

一、Java学习笔记系列 笔者大学时候学的编程语言是C和汇编,毕业以后并未从事过开发工作,也没有接触过Java。但近两年的PaaS、CI/CD主要是以Java应...

6285
来自专栏自动化测试实战

《selenium2 python 自动化测试实战》(17)——几个cookies操作

3404

扫码关注云+社区

领取腾讯云代金券