shuimugan
2016-07-06 11:57:45 +08:00
不是专业的代码审计,不过也可以简单说下,下面这些方法是我刚毕业时进一个大公司后不到 1 星期挖到了多个 sql 注入与 xss 所用到的
1.先了解要审计的应用都有什么功能
2.再了解这个项目的一些编码规范,以及使用的框架,再简单看几个控制器或者什么鬼看看开发人员的大致编码习惯
3.去版本控制器里看下提交记录,根据最近提交的代码的质量,规范度来判断一下这个项目的近期动态
4.把项目搭起来,直接开扫描器扫,虽然当时扫描器扫不出什么漏洞,但起码对这个项目的安全性有一个大致的了解,而且很多扫描器对 ajax 操作是扫不了的,可以着重关注
记下来就开始找了
我是直接用 ide/编辑器全局搜代码的,基本上好点的框架都提供了一些获取请求参数的封装,那么直接使用$_GET,$_POST,$_COOKIE,$_REQUEST 的都要抓出来,用了框架还直接以$_GET,$_POST,$_COOKIE,$_REQUEST 获取数据的,都是比较 low 的行为,发生问题几率高很多
当然$_SERVER 以及$_SESSION 也要着重看下,主要看从外界获取了变量之后有没有进行防御过滤
当找完这些毫无封装的获取请求参数代码之后,就去找使用框架获取请求的代码了,项目当时用的是 CodeIgniter,那么很简单,看下文档,发现获取 get 和 post 参数的代码是
$this->input->post()
$this->input->get()
而这 2 个函数第二个参数是可选的,过滤 xss 的,但是默认是 false,也就是不过滤...所以写个正则去找一下这些代码的第二个参数不填或者是 false 的,然后去追踪看后续有没有进行防御过滤,以此类推
还有很多开发人员直接拼写 sql 语句的时候,变量名一般都会写$sql 或者包含 sql 字样的,那么就去搜非框架核心区域包含 sql 字样的 php 代码,然后去回溯这些 sql 拼接的部分是不是用参数化查询,如果不是的话是不是用户可控的,有没有进行防御过滤
csrf 这类看下框架有没有开全局防御,然后看控制器对数据更改的功能代码是不是只接收 post 的请求或者 post 的参数,从这里入手去排查
至于任意文件上传下载都得先找到对应功能的代码,然后去看上传文件类型有无限制,下载有无判断用户权限,下载路径是否用户可控等,很多书都有说
我觉得与业务相关性高的比较麻烦,因为业务类型不同,很多复杂的业务前置就有一堆复杂的操作,所以比较繁琐,要黑盒白盒一起上,先无脑改参数看返回结果,再去代码里审计比较好
还有很多常见的
爆破类的:登录爆破,验证码爆破,重置密码爆破,改手机号爆破,各种爆破...
边界值:负数价格,负数商品数,真是什么都有
猥琐的:传参数给你一个数组
比如 yii2 框架的代码:
$id = Yii::$app->request->get('id');
$articel = Article::findOne($id);
看样子很正常对不对,直接传 id=1'这样也发现不了注入
但是仔细看框架文档,findOne 函数是可以接数组的,提交 id[column1'] = 1 注入就出来了,真是巨坑
还有一些坑,比如危险函数的,也要去找,能执行系统命令的地方,要看是不是完全不能被用户控,被用户控制的参数有没有过滤
找一些 web shell 里常见的,比如 preg_replace 里正则放个 /e 就能执行代码,eval 就更不用说了...
找多几个 php 一句话木马就知道了,要多猥琐有多猥琐
比如我之前无聊时写着玩的一个
// 利用:
// $_GET['x'] = 'eval($_GET["code"]);';
// $_GET['m'] = 'create_function';
// $_GET['code'] = 'echo 123;';
// $_GET['d'] = 'call_user_func_array'
$_GET['d']($_GET['m'], '', $_GET['x'])();
总的来说,对项目的架构熟悉程度越高,审计起来就越轻松