PHP源码审计前你最好自己写一套web程序,当然最好是PHP+MySQL架构的。这样你就能理解web程序的基本构架,流程等,加深对web的理解。
看一些审计大牛的总结性文章,知识库里就有几篇不错的。看总结最好结合实际漏洞看(里的审计总结性的文章都会有实际漏洞案例,可惜现在GG了),这样对漏洞理解更深,强烈推荐雨神的总结论PHP常见的漏洞。
经过第二步的,你应该基本了解PHP常见的漏洞类型,和成因。这是有就可以去实战了,去找一下小众的cms去审计,一般小众cms漏洞特别多,特别多,特别多。很容易就能找出来,如果挖出一些漏洞很容易培养成就感和,当然也是积累经验。
积累,积累,再积累。小众的cms漏洞比较多,挖出小众cms漏洞其实没多大用,但是流行的cms,可就不是那样了。流行的cms进过无数黑客的洗礼,简单的漏洞基本不存在,想挖出这类cms的漏洞就需要积累奇技淫巧。奇技淫巧怎么积累?看大牛的总结文章,看大牛的漏洞,自己发现。
1.源码审计工具,现在我见过的自动化的白盒审计工具在PHP方面效果都不理想,包括商业化的coverity 和foritfy,开源的RIPS。这些工具能发现一些简单的漏洞,但是对审计cms来说用处不大,误报率还高。
我一般都是在Geany里写完代码,点一下PHPStan静态分析,没问题就用FileZilla上传到测试服务器(FileZilla会自动监测到文件改动并弹窗提示上传),多人编辑同一个文件时,就用Meld对比本地和测试服务器的文件,只提交差异部分.发布代码时,svn up更新后svn commit提交,然后用Meld对比svn代码和线上发布机代码,把差异部分发布到生产服务器.
0.基本检查,未知类,未知函数,在$this上调用的未知方法,传递给这些方法和函数的参数的数量错误,始终是未定义的变量.
PHP没有类似ES6的let变量声明,也就没有块级作用域,在函数中声明的变量,在整个函数中都能访问. 如果一个函数中包含的逻辑太多,后面逻辑里的变量(比如foreach循环), 可能会覆盖前面逻辑里的变量甚至函数参数,导致最终函数返回的数据不正确. 静态分析器并不能提示这种类型的逻辑错误,因此不要在一个函数中写太多逻辑. 把的逻辑封装成函数,把变量包在函数作用域里(使用匿名函数闭包),可以提高代码的可性. NetBeans会对覆写函数参数时给出提示.
接上一篇MediPro模版引擎代码审计之解密篇(1)之后,已经过去四五个月了,主要是最近一直忙于项目,近期会把所有的篇幅发出来,这个临时项目我还是做了一段时间的,给大家一些参考吧,同时希望大牛给我提提意见。
按照上一篇的解密完成后,进行安装,但是刚开始由于连接不上web开发站所以卡住,找到关键代码,经过调试,发现install.php中130行的ans值为关键,如下:
看到的if判断了吗,这个其实是关键,验证license是否正确,所以我这里删掉了这个判断,其他值都能从以下代码中大概猜到
$lic_4为授权的域名,$lic_1为开始使用的时间,设一个比较小的值,$lic_2为结束时间,设一个特别大的值就好,$lic_3则直接设为nolimit。
这个网站破解的 license 其实很简单,思就是解析 license 文件的值,然后一一对应替换即可,以后的篇章会讲如何挖掘一些常见的漏洞。
漏洞起源于前段时间比较火的小皮 1-click 漏洞,用户名登录处缺少过滤,导致可以直接构造恶意 payload 实现存储型 XSS ,结合小皮本身所具有的计划任务,XSS + CSRF 实现了 RCE 。 因为用户名登录处缺少过滤,所以可以尝试 SQL 漏洞。
根据 SQL 语句可以构造恶意语句,构造恶意语句,执行错误的 SQL 语句后,程序会发生崩溃,所以无法利用万能密码登录。
这里我们可以思考利用堆叠注入,执行多个 SQL 语句,修改 admin 用户密码。我们构造这样的用户名