ThinkPHP 3.1,3.2中对IN和BETWEEN正则匹配不当导致的一个SQLi

 1     // where子单元分析
 2     protected function parseWhereItem($key,$val) {
 3         $whereStr = ‘‘;
 4         if(is_array($val)) {
 5             if(is_string($val[0])) {
 6                 if(preg_match(‘/^(EQ|NEQ|GT|EGT|LT|ELT)$/i‘,$val[0])) { // 比较运算
 7                     $whereStr .= $key.‘ ‘.$this->comparison[strtolower($val[0])].‘ ‘.$this->parseValue($val[1]);
 8                 }elseif(preg_match(‘/^(NOTLIKE|LIKE)$/i‘,$val[0])){// 模糊查找
 9                     if(is_array($val[1])) {
10                         $likeLogic  =   isset($val[2])?strtoupper($val[2]):‘OR‘;
11                         if(in_array($likeLogic,array(‘AND‘,‘OR‘,‘XOR‘))){
12                             $likeStr    =   $this->comparison[strtolower($val[0])];
13                             $like       =   array();
14                             foreach ($val[1] as $item){
15                                 $like[] = $key.‘ ‘.$likeStr.‘ ‘.$this->parseValue($item);
16                             }
17                             $whereStr .= ‘(‘.implode(‘ ‘.$likeLogic.‘ ‘,$like).‘)‘;
18                         }
19                     }else{
20                         $whereStr .= $key.‘ ‘.$this->comparison[strtolower($val[0])].‘ ‘.$this->parseValue($val[1]);
21                     }
22                 }elseif(‘exp‘==strtolower($val[0])){ // 使用表达式
23                     $whereStr .= ‘ (‘.$key.‘ ‘.$val[1].‘) ‘;
24                 }elseif(preg_match(‘/IN/i‘,$val[0])){ // IN 运算
25                     if(isset($val[2]) && ‘exp‘==$val[2]) {
26                         $whereStr .= $key.‘ ‘.strtoupper($val[0]).‘ ‘.$val[1];
27                     }else{
28                         if(is_string($val[1])) {
29                              $val[1] =  explode(‘,‘,$val[1]);
30                         }
31                         $zone      =   implode(‘,‘,$this->parseValue($val[1]));
32                         $whereStr .= $key.‘ ‘.strtoupper($val[0]).‘ (‘.$zone.‘)‘;
33                     }
34                 }elseif(preg_match(‘/BETWEEN/i‘,$val[0])){ // BETWEEN运算
35                     $data = is_string($val[1])? explode(‘,‘,$val[1]):$val[1];
36                     $whereStr .=  ‘ (‘.$key.‘ ‘.strtoupper($val[0]).‘ ‘.$this->parseValue($data[0]).‘ AND ‘.$this->parseValue($data[1]).‘ )‘;
37                 }else{
38                     throw_exception(L(‘_EXPRESS_ERROR_‘).‘:‘.$val[0]);
39                 }
40             }else {
41                 $count = count($val);
42                 $rule  = isset($val[$count-1])?strtoupper($val[$count-1]):‘‘;
43                 if(in_array($rule,array(‘AND‘,‘OR‘,‘XOR‘))) {
44                     $count  = $count -1;
45                 }else{
46                     $rule   = ‘AND‘;
47                 }
48                 for($i=0;$i<$count;$i++) {
49                     $data = is_array($val[$i])?$val[$i][1]:$val[$i];
50                     if(‘exp‘==strtolower($val[$i][0])) {
51                         $whereStr .= ‘(‘.$key.‘ ‘.$data.‘) ‘.$rule.‘ ‘;
52                     }else{
53                         $op = is_array($val[$i])?$this->comparison[strtolower($val[$i][0])]:‘=‘;
54                         $whereStr .= ‘(‘.$key.‘ ‘.$op.‘ ‘.$this->parseValue($data).‘) ‘.$rule.‘ ‘;
55                     }
56                 }
57                 $whereStr = substr($whereStr,0,-4);
58             }
59         }else {
60             //对字符串类型字段采用模糊匹配
61             if(C(‘DB_LIKE_FIELDS‘) && preg_match(‘/(‘.C(‘DB_LIKE_FIELDS‘).‘)/i‘,$key)) {
62                 $val  =  ‘%‘.$val.‘%‘;
63                 $whereStr .= $key.‘ LIKE ‘.$this->parseValue($val);
64             }else {
65                 $whereStr .= $key.‘ = ‘.$this->parseValue($val);
66             }
67         }
68         return $whereStr;
69     }

第24行的preg_match(‘/IN/i‘,$val[0])

第34行的preg_match(‘/BETWEEN/i‘,$val[0])

两个正则表达式没有设置起始,因此xxxinxxxx,xxxbetweenxxx的字符串都可以匹配成功,因而构成了注入。

时间: 2024-10-13 00:17:19

ThinkPHP 3.1,3.2中对IN和BETWEEN正则匹配不当导致的一个SQLi的相关文章

iOS 中的正则匹配(工具类)

正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码. 在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要, 比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 下面让我们先来看看正则匹配常用的一些字

利用Python正则匹配中文——爬取校园网公告栏中感兴趣的内容

写这个程序是因为校园网公告栏时不时会有学术报告,讲座之类的信息发布,但这类信息往往发布在讲座的前一天,以至于丢失很多重要消息.同时公告栏里也会发布一些跟学生无关的内容,比如工会主席会议啥的. 主要遇到的困难时对中文的正则匹配问题.(比如通过第一次正则可以提取到一个页面内的所有中文标题,第二次正则从这些中文标题中将能匹配上“报告”两个字的对象添加到结果list内) 学校公告页面是gb2312编码.我使用的方式是,整个工程使用utf-8编码,将需要匹配的关键字转换成utf-8编码格式,使用正则匹配u

Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1

Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(1 ≤ N

Python List remove()方法-用于移除列表中某个值的第一个匹配项

描述 remove() 函数用于移除列表中某个值的第一个匹配项. 语法 remove()方法语法: list.remove(obj) 参数 obj -- 列表中要移除的对象. 返回值 该方法没有返回值但是会移除两种中的某个值的第一个匹配项. 实例 以下实例展示了 remove()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc', 'xyz']; aList.remove('xyz'); print "List : &quo

java中的List记录是否完全匹配方法

今天要说的是给List分组,然后用Map来封装,可能你看了以后还是有一些模糊. 先看一下项目结构图: User类是一个VO类,主要逻辑还是在MapTestBak上面. 运行效果: 原理图: 1.在starsList中有两组人,共三人 2.在dolList中有一组人,共两人 3.经过marched操作,最后匹配到一组人到result中.即第一组人. 原理很简单. =================================================== 源码部分: ==========

正则匹配中 ^ $ 和 \b 的区别

正则匹配中 ^ $ 和 \b 的区别 ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可组成单词的字符(包括字符串的开始和结束)为另一种类型因此\b\d\b可以匹配"%3%"中的3,但不能匹配"23"中的任意一个数字

PHP中preg_match正则匹配的/u /i /s是什么意思

PHP中preg_match正则匹配的/u /i  /s是什么意思  /u 表示按unicode(utf-8)匹配(主要针对多字节比如汉字) /i 表示不区分大小写(如果表达式里面有 a, 那么 A 也是匹配对象) /s 表示将字符串视为单行来匹配

在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)

原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改了配置文件web.config后,会导致应用程序重启,所有 会话(session)丢失.然而,应用程序的配置信息放在配置文件里是最佳选择,在后台修改了配置后导致所有会话丢失是非常不爽的事情,这个时候可将配 置文件中经常需要改变的参数配置节 放到外面来,例如appSetting节. 一.原来的web.

Effective C++ 条款11,12 在operator= 中处理&ldquo;自我赋值&rdquo; || 复制对象时不要忘记每一个成分

1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi