你是否觉得有时候人类的思考模式很像正则匹配?
本文包括以下几个部分:
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、一切尽在代码中