1. 熟知各个开源框架历史版本漏洞。
2. 业务逻辑漏洞
3. 多线程引发的漏洞
4. 事务锁引发的漏洞
/**
     * 更新记录
     * @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 版本有命令执行漏洞
然而这样的代码并不能防御并发。这也是很多开发中的问题,确实做了事务加锁,依然没有用。 加事务必须是在查询内加,不然依旧会造成并发问题。 我们在改改把读放入事务锁中。
这样也解决了脏读的问题。
  脏读:
(针对未提交数据)如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以“看到”该事务没有提交的更新结果,这样造成的问题就是,如果第一个事务回滚,那么,第二个事务在此之前所“看到”的数据就是一笔脏数据。
当然也有更复杂的情况可能框架有多个端。这种二次利用的情况更加难以审计。
 
在实际审计中我们想要精通一个语言的代码审计我们要做的更难
- 要比产品更懂业务
- 要比测试更懂流程
- 要比开发更懂代码
- 要比架构更懂框架
 
 
自此囊括从初级到高级的学习就到此为止了,但我们的学习却不能停止,这也是我个人对php代码审计学习的理解肯定有不合理的地方,不足可以直接提出修改,共勉!