PHP代码审计基础-高级篇
高级篇主要讲
1. 熟知各个开源框架历史版本漏洞。
2. 业务逻辑漏洞
3. 多线程引发的漏洞
4. 事务锁引发的漏洞
在高级篇审计中有很多漏洞正常情况下是不存在的只有在特殊情况下才有
PHP常用框架
Zendframwork,Yii,Laravel ,、ThinkPHP
这里举例因为thinkphp由国内人开发用户量较多而且历史漏洞也多
Thinkphp历史漏洞很多,对于漏洞形成原因可以自己复现。
篇幅有限只介绍披露漏洞
Query方法 低于3.1.3 有sql注入问题
Order方法 低于 5.x 有sql注入问题
Update方法 低于3.2.3 有sql注入问题
/**
* 更新记录
* @access public
* @param mixed $data 数据
* @param array $options 表达式
* @return false | integer
*/
public function update($data,$options) {
$this->model = $options['model'];
$this->parseBind(!empty($options['bind'])?$options['bind']:array());
$table = $this->parseTable($options['table']);
$sql = 'UPDATE ' . $table . $this->parseSet($data);
if(strpos($table,',')){// 多表更新支持JOIN操作
$sql .= $this->parseJoin(!empty($options['join'])?$options['join']:'');
}
$sql .= $this->parseWhere(!empty($options['where'])?$options['where']:'');
if(!strpos($table,',')){
// 单表更新支持order和lmit
$sql .= $this->parseOrder(!empty($options['order'])?$options['order']:'')
.$this->parseLimit(!empty($options['limit'])?$options['limit']:'');
}
$sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:'');
return $this->execute($sql,!empty($options['fetch_sql']) ? true : false);
}
5. x 版本有命令执行漏洞
在github上也有历史分支可以查看修复代码
业务逻辑
想要对整体的逻辑进行审计
- 熟悉业务场景
- 熟悉业务流程
- 通读代码
多线程引发的漏洞
这里我写了个例子
<?php $money=100;//数据库查询的用户余额 $buy=intval($_GET['buy']); if ($money>0&& $money-$buy>0) { sleep(10); $moeny-=$buy; //写入数据库 } return $money
正常情况下用户余额一定不为负数 如果在并发情况下呢?
用户发送恶意并发请求时就有可能出现这种情况。这么防御呢
这里需要知道事务和锁的概念可以自行百度理解我这里简单概述一下
事务:类似一个执行任务 成功就任务完成 ,失败任务自动回滚到未接任务前
锁:悲观锁,乐观锁。
我们可以把多线程请求变成单线程处理,这里也可以用队列压入压出。
<?php $money = 100;//数据库查询的用户余额 $buy = intval($_GET['buy']); try { if (flock($money, LOCK_EX)) { if ($money > 0 && $money - $buy > 0) { sleep(10); $moeny -= $buy; //写入数据库A throw new ExceptionNew("xp"); //写入数据库B } flock($money, LOCK_UN); } } catch (Exception $exceptione) { throw new ExceptionNew("xp"); } return $money
这样确实解决了这个并发问题,但又有另外一个问题,如果有多个数据库操作中间一段中断是无法对数据还原的,这里我们需要把事务也加上同时默认加锁。
我们修改一下代码看一下
<?php $money=100;//数据库查询的用户余额 $buy=intval($_GET['buy']); try { $this->startTrans();//开启事务 if ($money>0&& $money-$buy>0) { sleep(10); $moeny-=$buy; $this->commit(); //提交事务 //写入数据库 } } catch (Exception $exceptione) { $this->rollback();//回滚 } return $money
<?php $buy=intval($_GET['buy']); try { $this->startTrans();//开启事务 $money=100;//数据库查询的用户余额 if ($money>0&& $money-$buy>0) { sleep(10); $moeny-=$buy; $this->commit(); //提交事务 //写入数据库 } } catch (Exception $exceptione) { $this->rollback();//回滚 } return $money
在加了事务的悲观锁后,所有请求到已经开启事务的代码,都会进行阻塞只有提交了事务或者回滚才会处理下一个请求。
然而这样的代码并不能防御并发。这也是很多开发中的问题,确实做了事务加锁,依然没有用。 加事务必须是在查询内加,不然依旧会造成并发问题。 我们在改改把读放入事务锁中。
<?php $buy=intval($_GET['buy']); try { $this->startTrans();//开启事务 $money=100;//数据库查询的用户余额 if ($money>0&& $money-$buy>0) { sleep(10); $moeny-=$buy; $this->commit(); //提交事务 //写入数据库 } } catch (Exception $exceptione) { $this->rollback();//回滚 } return $money
这样也解决了脏读的问题。
脏读:
(针对未提交数据)如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以“看到”该事务没有提交的更新结果,这样造成的问题就是,如果第一个事务回滚,那么,第二个事务在此之前所“看到”的数据就是一笔脏数据。
当然也有更复杂的情况可能框架有多个端。这种二次利用的情况更加难以审计。
在实际审计中我们想要精通一个语言的代码审计我们要做的更难
- 要比产品更懂业务
- 要比测试更懂流程
- 要比开发更懂代码
- 要比架构更懂框架
自此囊括从初级到高级的学习就到此为止了,但我们的学习却不能停止,这也是我个人对php代码审计学习的理解肯定有不合理的地方,不足可以直接提出修改,共勉!
PHP代码审计基础-高级篇的更多相关文章
- PHP代码审计基础-中级篇
初级篇更多是对那些已有的版本漏洞分析,存在安全问题的函数进行讲解,中级篇更多是针对用户输入对漏洞进行利用 中级篇更多是考虑由用户输入导致的安全问题. 预备工具首先要有php本地环境可以调试代码 总结就 ...
- PHP代码审计基础-初级篇
对于php代码审计我也是从0开始学的,对学习过程进行整理输出沉淀如有不足欢迎提出共勉.对学习能力有较高要求,整个系列主要是在工作中快速精通php代码审计,整个学习周期5天 ,建议花一天时间熟悉php语 ...
- Java基础高级篇 NIO
nio模型与io模型的对比 netty 是什么 怎么使用
- Spark学习体系整理(基础篇、中级篇、高级篇所涉及内容)
新手刚开始学习比较迷茫,参考下面,然后找相关资料学习 1 Spark基础篇 1.1 Spark生态和安装部署 在安装过程中,理解其基本操作步骤. 安装部署 ...
- Kotlin——高级篇(四):集合(Array、List、Set、Map)基础
在实际的项目开发中,集合的运用可以说是多不胜数.不过Kotlin中的集合运用和Java中还是有很大的差别,他们两者之间,除了集合的类型相同以外,还包含集合的初始化的不同,以及Kotlin对于集合封装特 ...
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
- 【转载】Spark性能优化指南——高级篇
前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...
- .NET ORM 的 “SOD蜜”--零基础入门篇
PDF.NET SOD框架不仅仅是一个ORM,但是它的ORM功能是独具特色的,我在博客中已经多次介绍,但都是原理性的,可能不少初学的朋友还是觉得复杂,其实,SOD的ORM是很简单的.下面我们就采用流行 ...
- 【转】【技术博客】Spark性能优化指南——高级篇
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...
随机推荐
- Cabloy-CMS:动静结合,解决Hexo痛点问题(进阶篇)
前言 前一篇文章 介绍了如何通过Cabloy-CMS快速搭建一个博客站点. 这里简单介绍Cabloy-CMS静态站点的渲染机制,更多详细的内容请参见https://cms.cabloy.com 渲染规 ...
- 前端之JavaScript篇
一. 简介 javascript是一门动态弱类型的解释性编程语言, 增强页面动画效果,实现页面与用户之间实时动态的交互. JavaScript有三部分组成: ECMAscript, DOM, BOM ...
- HttpClient远程接口调用-实名认证
1.HttpClient远程接口调用 1)用户注册 注册按钮button提交表单时,要return false form表单 <!-- action="http://localhost ...
- uptimerobot 监控
前言 由于搞了多个公共服务于多台vps,需要监控项目稳定性与服务器稳定性,考察了阿里云云监控与uptimerobot,最后选择了uptimerobot 教程 访问官网,注册账号 : https://u ...
- Jetpack系列:应用内导航的正确使用方法
今天小编要分享的还是Android Jetpack库的基本使用方法,本篇介绍的内容是Jetpack Navigation组件,让我们一起学习,为完成年初制定的计划而努力吧! *** 组件介绍 导航,是 ...
- linux mint 19.2与Windows 10 双系统硬盘安装与卸载
安装linux mint 和win10双系统: 1.win10系统下如果没有空闲分区,请从容量较大的分区用partition manager在选中的较大的分区下,调整大小.此步骤最好在pe下的part ...
- 夯实Java基础系列23:一文读懂继承、封装、多态的底层实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- php实现商城秒杀
这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...
- BeetleX服务网关之限流和缓存
限流和缓存相关是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力.Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是Beetl ...
- 我又不是你的谁--java instanceof操作符用法揭秘
背景故事 <曾经最美>是朱铭捷演唱的一首歌曲,由陈佳明填词,叶良俊谱曲,是电视剧<水晶之恋>的主题曲.歌曲时长4分28秒. 歌曲歌词: 看不穿你的眼睛 藏有多少悲和喜 像冰雪细 ...