php代码审计-小技巧篇
白盒测试常见疑问
- 基本web漏洞都有所了解,但实际漏洞挖掘过程中,为什么挖不倒漏洞
上述问题非常常见,例如:我们在挖掘漏洞时,看到很多地方都做了漏洞防护和预处理,但是并不意味着所有的漏洞防护和预处理都是有效的,要多尝试,
- 代码量增加后,如何快速地找到漏洞
急于求成就暴力搜索, 深度挖掘就全局审计,安稳点就半审半搜
- 如何挖掘对安全有一定防御的代码中的漏洞
- 目标使用了现在php框架,很难找到常见漏洞,怎么突破
这种现代框架,只要你是按照产品手册写,很难写出漏洞,那么怎么突破
你所需要的两个知识
- 白盒基本方法
- 白盒测试技巧
现代web开发框架下的php漏洞
现代web开发框架
- Laravel
- symfony
- slimphp
- Yii2
特点
- 所需PHP版本较高,\0截断等老漏洞绝迹
- 提供功能强大的orm
- 提供自动处理输出的模板引擎
- 开发者可以通过composer找到任何需要的功能类,避免因为自己造轮子产生的漏洞
现代web开发框架安全思想
secure by default原则
文档中,会详细叙述可能出现的安全问题
那么,如何挖掘
- 挖掘思路:
- 寻找框架本身的安全漏洞
- 寻找不规范的开发方式
- 寻找错位的配置
- 异常的利用
- 第三方服务的利用
- sql_autoload的利用
寻找框架本身的漏洞
案例:slim3框架架构上存在XXE漏洞
https://blog.csdn.net/qq_48985780/article/details/121283157风味1
特点:
restful+前后端分离式架构慢慢流行
json/xml成为主力传输格式
架构默认支持多种格式解析方法,由请求包中的content-Type决定
常见的漏洞为:任意文件读取/ssrf/拒绝服务
寻找不规范的开发方式
案例:edusoho的sql漏洞
特点:
- 基于symfony+doctrine
- doctrine orm默认使用参数化查询杜绝sql注入漏洞
- sql语句多参数情况下,开发者不知道如何使用参数化查询
- 开发者没看开发手册
一般来说sql语句多参数情况下,进行拼接容易存在sql注入
异常的利用
案例:eduso任意用户密码泄露(无敌了,这b框架写的什么玩意)
https://blog.csdn.net/2301_80115097/article/details/134549332
特点:
现代php框架多使用“异常处理”的方式处理错误
debug模式下会详细的列出异常数据
异常信息一般指:所在函数,异常堆栈,当前所有变量
思路:在用户信息页制造一个异常,即可获得用户这个变量所有信息(例如,登陆点只能处理字符串,但是我提交了一个数组,那么就会报错)
寻找构造异常的方法 传入数组导致字符串处理时出现异常
第三方服务的应用
案例:Discuz!x有条件远程命令执行
https://cloud.tencent.com/developer/article/1511932
特点:
现代web应用会配置许多第三方服务:如7redis(这个最常见)/mencached/mongodb
SSRF请求可操作redis
修改redis内任意信息
控制preg_replace参数
/e代码执行
sql_autoload利用
案例:phpwind GET型CSRF任意代码执行
特点:
php自动类加载机制(sql_autoload)
windows目录分隔符与php命名空间分隔与PHP命名空间分隔符相同
跨目录包含PHP类文件
成功构造反序列化利用链
压缩炸弹的利用
何为压缩炸弹
- web应用执行了解压缩操作
- 黑客利用压缩包的一些特性,构造畸形压缩包
- 解压时将造成漏洞
那些压缩炸弹惯用的方式
- 绕过文件检查失败后删除操作
- 阻止压缩时的文件检查
- 绕过压缩时的文件检查
- 链接文件的利用
绕过文件检查失败后的文件删除操作/绕过文件检查失败后删除操作
例子:FINECMS前台任意文件上传系列漏洞
https://www.cnblogs.com/ichunqiu/p/7453208.html
还有phpcms头像上传漏洞,漏洞基本上类似
原理:
用户选泽头像后,前端将处理成多种大小并打包上传
后端接收压缩包并解压
在当前目录递归删除非法文件
解压失败后,程序抛出错误并停止运行,导致webshell保留
绕过压缩时的文件检查
是的,还是FINECMS
https://www.cnblogs.com/ichunqiu/p/7453208.html
还有一个据抽象的漏洞,当压缩包的文件名内是“../../../filename.php”可解压到上级目录
链接文件的利用
新浪SAE沙盒读取任意文件(目前找不到资源)
原理:
- 解压时未判断文件类型
- 软连接文件可保留至压缩包中
- 访问该软连接
- 服务器中间件字典读取软连接指向的文件
- 任意文件读取
什么是软连接
举个例子
ln -s /etc/passwd test1创造了一个软连接,这个时候cat test1就会打开/etc/passwd目录
那么同理,我们把压缩包内包含这种软连接文件,就能达到任意文件读取的目的(压缩包自带解压软连接的机制)
白盒测试中的条件竞争漏洞
条件竞争漏洞
- 并发状态
- 进程与线程
条件竞争漏洞挖掘方向
- 上传后删除的利用
- 忘记上锁的数据库
- 鸡肋文件包含的妙用
上传后删除的利用
FINECMS
https://www.cnblogs.com/ichunqiu/p/7453208.html
就不多说了
忘记上锁的数据库
举个例子,假设有个漏洞点的逻辑为
1.查询用户余额
2.查询购买商品的价格
3.判断:用户余额 >商品价格,true,购买后跳转到4
4.用户余额=用户余额-价格
但是,这个框架它忽略了一个问题,在3处时,有一段时间内他的数值是不变的,那么如果在这段时间跑多线程,就可以达到成功购买多个商品
鸡肋文件包含的利用
案例:链家旗下某自如站的文件包含
漏洞:
本地文件包含
无法利用?
利用
寻找临时文件泄露点 >phpinfo()
线程1 :上传文件并通过phpinfo获取临时文件名
线程2 :包含该文件 ,生成webshell