当前位置:首页 > 综合

代码审计思路有哪些

去年帮一个朋友看ThinkPHP站,代码发现他数据库配置文件里写着root/123456,审计思路而那个数据库端口3306直接对公网开放。代码我问他为什么不改,审计思路他说改了怕连不上。代码这种“怕”就是审计思路代码审计里最常见的漏洞源头——开发者为了省事,把安全边界一步步退让到零。代码

代码审计不是审计思路拿着扫描器跑一遍就完事。工具能告诉你这里有`eval`,代码但eval的审计思路参数是否用户可控、是代码否经过过滤、过滤能否绕过,审计思路这些工具判断不了。代码我习惯先看入口文件,审计思路比如index.php,代码看它引入了哪些核心文件、注册了哪些路由。路由是攻击面最直观的映射,一个`/api/upload`后面往往跟着文件上传漏洞,一个`/admin/`后面可能是未授权访问。

接着追参数。用户输入从`$_GET`、`$_POST`、`$_COOKIE`进来,经过哪些函数处理,最终到了哪里。我见过一个CMS,`$_REQUEST['id']`直接拼进SQL,但中间加了个`intval`,看似安全。可它用的是`intval($id, 36)`,36进制转换后仍可能带出字母,SQL注入照样成立。这种细节扫描器不会告诉你,得自己读代码。

危险函数要盯死。PHP里`eval`、`assert`、`system`、`preg_replace`带`/e`修饰符,还有`include`、`require`这类文件包含。但更隐蔽的是框架封装后的方法,比如ThinkPHP的`where`方法,如果传入数组且键名可控,可能触发SQL注入。我曾在某框架的`order`方法里找到注入点,因为开发者以为`order`只接受字段名,没做过滤。

逻辑漏洞比技术漏洞更致命。一个电商站,修改购物车数量时只校验了商品ID,没校验数量正负。把数量改成-1,总价变负数,下单后余额反而增加。这种漏洞扫描器扫不出来,得手工走业务流程。我习惯把每个功能点画成流程图,标出所有用户可控的输入点,然后逐个问:这里能不能绕过?能不能重放?能不能越权?

越权分水平越权和垂直越权。水平越权是A用户能看B用户的数据,垂直越权是普通用户能干管理员的事。很多系统在URL里直接放用户ID,比如`/user/profile?uid=123`,把123改成124就能看别人信息。垂直越权更常见于后台接口,前端隐藏了菜单,但接口没做权限校验,直接访问`/admin/deleteUser?id=1`照样执行。

文件上传是重灾区。看上传点不能只看后缀名过滤,要看文件内容是否被检查、上传后是否可访问、路径是否可控。我遇到过只允许上传jpg的,但上传后文件名是`1.jpg.php`,Apache解析成PHP执行。还有的用`move_uploaded_file`时第二个参数拼接了用户输入,导致路径穿越,能把文件写到任意目录。

审计时我常备一张表:入口、参数、过滤函数、危险函数、利用条件。每读一段代码就往表里填,填满一页基本就能找到几个洞。这方法笨,但比依赖工具靠谱。工具会漏,人会累,但代码逻辑不会骗人。你读懂了它,它就把弱点全交出来了。

最后说个习惯:看到`@`符号要警觉,它压制错误信息,但漏洞还在。看到`base64_decode`、`urldecode`、`str_rot13`这些编码函数,跟进去看解码后的内容去了哪。很多绕过WAF的payload就藏在这些编码层后面。代码审计没有捷径,就是一行行读,读到你觉得“这里不对劲”的时候,洞就在那。

分享到: