找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2177|回复: 0
打印 上一主题 下一主题

ThinkPHP框架通杀所有版本的一个SQL注入漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。1 H" L9 ~2 X0 v' i, t/ B
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
$ R- Q! ?! `9 G0 B, R根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
% M: a4 W- S' M3 e使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:4 {: W& J: K( }5 ^9 I9 D& z# O: `9 Z
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();2 ^6 e% b: p2 m; T$ E

" o% H" s7 ?, N 或者
7 v/ s( S' G5 c4 ^6 P5 |$ E& m* q% D$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();7 b* ~, F1 W1 F& H4 n! q- [
, U2 F  B* d6 P( s: W# p
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
) a6 i7 G; @1 R& u7 P& y$model->query('select * from user where id=%d and status=%s',$id,$status);
2 n  d0 K) k5 @. M  X7 @+ X; [2 B0 }# |
或者
2 Y( a3 A$ K$ |' i+ l$ Y$model->query('select * from user where id=%d and status=%s',array($id,$status));6 ]" p$ \/ |6 |# |9 f. f

/ @0 g" p+ B! D# F* [4 T" S' X 原因:& l% s9 a" l$ a5 L2 A3 m  V
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
$ M4 E! A- \. r/ T原函数:
9 w+ C: h! N* \) L  X- ?# o5 Zprotected function parseSql($sql,$parse) {
) e9 ~6 i& V" `6 Z9 ?- d- {5 c        // 分析表达式: Z0 M/ a* y  W6 t/ c
        if(true === $parse) {
! x& X* M8 L' I  l# g            $options =  $this->_parseOptions();0 ~1 v; a+ h5 u) ]; h7 H' e
            $sql  =   $this->db->parseSql($sql,$options);, P' v$ d  Z( K: i! G* h
        }elseif(is_array($parse)){ // SQL预处理# Q6 r& m2 w. v8 ]* \
            $sql  = vsprintf($sql,$parse);
, [3 W9 b6 k" I( O; R) y        }else{
# x( `7 M& D. \0 A" v7 D$ _8 K            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));& k8 F1 M: [! b3 p% ], B1 h& c, q
        }
% C1 s* v, Z( p' q  t) d        $this->db->setModel($this->name);, P' Y+ m2 P, K4 ^2 H, a) K
        return $sql;
. I1 x; [. p& b* e+ i3 E    }
* J$ U# G8 y- V% R$ Y" ^5 b3 ^0 }! C5 Z+ L, S+ k% e
验证漏洞(举例):+ h8 W3 z) h4 a9 D8 t/ N
请求地址:
4 a, ]% n8 g: h" Shttp://localhost/Main?id=boo” or 1=”1
: v  J0 f, G: h6 v! }
9 Z2 a/ a/ B3 x( e. n: v* i  rhttp://localhost/Main?id=boo%22%20or%201=%221
% y/ u. w9 B7 X* E9 `action代码:* N5 S+ d/ \/ ?+ E5 t# U
$model=M('Peipeidui');
: {  B6 a6 @, L7 @7 W        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);9 e+ h' S2 @  `' J
        dump($m);exit;- D3 p  k$ Q& h! Q
或者
; r5 Z7 u1 s9 k6 q" d* `$model=M('Peipeidui');7 t1 U& F& @& i9 l) w+ T6 C
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));0 q4 |$ N6 A) v* P, q) G
        dump($m);exit;
1 p' L* O) N( q/ j" Z6 z8 X1 a( b结果:
* O2 A8 M1 H0 t+ C- Z$ m表peipeidui所有数据被列出,SQL注入语句起效.3 E7 W5 e1 b4 b" M7 w
解决办法:
, e& X' j8 y  y* o, [% G2 t9 g将parseSql函数修改为:- N/ q! I/ |% l. h! l
protected function parseSql($sql,$parse) {
8 r$ j0 r; T: }        // 分析表达式* |- b" u' H+ ?2 w
        if(true === $parse) {! \) A2 {6 M! J! F8 |! v- [
            $options =  $this->_parseOptions();
, L8 l4 [+ ~* |! Z+ e2 o) {) E            $sql  =   $this->db->parseSql($sql,$options);
, m% I. R2 V" p' u/ c        }elseif(is_array($parse)){ // SQL预处理
4 @& I# ]  C+ P            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
/ z0 _0 `3 [0 N" D" O- Q$ H            $sql  = vsprintf($sql,$parse);
- X% l! W$ L! {3 ~) S5 M% d        }else{
" ~* H% V: D! ?# C            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
1 ~: h5 W8 J1 L0 A        }
4 q0 }5 A8 U5 F+ Q& u6 ]# K5 |5 N, f        $this->db->setModel($this->name);
4 S5 y! x" v: G0 t: W        return $sql;5 }3 f5 _( g- b) f( E
    }
$ m2 n( I" `% ^6 ~7 k, k  X/ q
总结:
( I+ B& o4 J) O不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
  v4 K% Q6 Q1 H+ ^  j9 B6 s不建议直接用$_GET,$_POST7 w  t4 @: L6 O$ E% r" Y
[/td][/tr]
3 S# O3 w3 \% @( J6 P+ |) Y3 C' f[/table]+1. o8 v- F: w+ k* ]+ X9 F
4 R* M* y5 q/ `- k* T
: ^4 _9 q1 p! m- k' h
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表