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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。0 r$ \) T- L' s9 `, x
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
) n& k' O0 b- o; [根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)  e' ?9 ~' L) h
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
/ \& m! S$ S6 S  [9 Z. Z$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
; H& c6 `3 ~; G
8 g0 _" H6 F5 \$ | 或者! n( Q8 E; Y& M8 ^
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();1 H5 m) v  f- M# [' |$ q7 E: k- x; ~& ~

! q" x' r6 e5 C: s/ u& t  d( n9 N 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):0 K+ m9 K8 s: E- M" w0 C# @5 Q, l1 r
$model->query('select * from user where id=%d and status=%s',$id,$status);1 a$ r9 J/ x5 [) K5 M; o3 @& U

4 L! p0 v: P7 M7 b! B$ q- {或者
2 j! u$ K5 J2 T0 D# `$ P/ W$model->query('select * from user where id=%d and status=%s',array($id,$status));
8 O$ h- z: A9 W" e/ y: H- S$ X% M& h# l4 i8 i) z- k7 V3 M: @  [
原因:
# M$ T* J  K0 E, O; T3 bThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
4 v# B. V0 w3 F: t* s原函数:
* m) f, y" ~; N  i: jprotected function parseSql($sql,$parse) {
; ~8 U2 Z1 [5 v, v        // 分析表达式0 q8 f9 N; A, \5 L% R' @% b' c! v
        if(true === $parse) {
2 V) H0 U; e6 @9 ~* w7 o            $options =  $this->_parseOptions();1 t( k/ k2 i* j* l* [7 }/ H
            $sql  =   $this->db->parseSql($sql,$options);9 j7 l* W% ~4 C4 [9 b' [' m0 N
        }elseif(is_array($parse)){ // SQL预处理, Z3 R% t4 ^6 V$ `  b
            $sql  = vsprintf($sql,$parse);% b/ G4 p4 l1 W% F
        }else{! A! K1 u# D& t/ n. e3 X. m
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));4 ?1 c( ~- }- p9 c7 C7 M4 y
        }  R% R$ Q8 v, H! ^4 k. t
        $this->db->setModel($this->name);  i2 |3 f' m5 o5 r+ t9 l
        return $sql;
# f, r! E1 I* U, B7 r: U4 y    }
. ]( q' C8 j. Z# s, P9 J
4 b8 @, Q/ v- w1 s9 [验证漏洞(举例):
# S# L8 q! y$ {4 A+ J3 J& R请求地址:
9 u! m( v$ {; \2 C. ~http://localhost/Main?id=boo” or 1=”1
1 A( a" ?; E8 P1 l9 a# j
' K; U% u# S9 {" i7 [5 \: }2 Uhttp://localhost/Main?id=boo%22%20or%201=%221+ g0 ^) k0 _8 @' R" H( ?
action代码:
  k4 q, T3 ~, y* l$ T$model=M('Peipeidui');
4 }& v' F( t; U4 X. H  n: s6 S        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
& M! d# r) I$ Q6 u+ E5 \8 p        dump($m);exit;! C* v, }% w* j* i1 Y
或者; h, c  n4 }# y
$model=M('Peipeidui');
* k4 H& B) W& b& ^        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));, b) o2 v( F8 ~7 I3 O5 q
        dump($m);exit;
5 }- ^6 l& t' [; X* `! m. n结果:9 n, E5 G$ c: y4 N7 K, p7 G
表peipeidui所有数据被列出,SQL注入语句起效.
5 ~( T8 N; F- C6 L5 I, _+ [1 f' W! m解决办法:: i+ s" F: ~9 o; p% c! k
将parseSql函数修改为:' \8 w& ]% O: Y
protected function parseSql($sql,$parse) {
( j7 g" Q- d7 m, L1 _        // 分析表达式# [/ J4 W% I, m+ q% d
        if(true === $parse) {! A  {! \) ]0 o' T1 i& }# U- T0 P
            $options =  $this->_parseOptions();9 S) J; G0 T: Y7 Z1 _
            $sql  =   $this->db->parseSql($sql,$options);/ z0 ~2 {1 s7 e
        }elseif(is_array($parse)){ // SQL预处理
  F1 X  U& M0 b' o' T' ~2 S% E; D            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
$ \; E1 t; Z1 Q! _0 t- Y1 t            $sql  = vsprintf($sql,$parse);
4 K$ r9 r  W# i0 j6 t& S        }else{' _! X* U3 @  x" r, I4 M
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));6 v- I1 C- g: @) F3 b1 X! }5 G
        }
) F& W4 ]. c3 l4 U# m- P$ |! E; ^        $this->db->setModel($this->name);
- S) |. ^1 Q- f7 `        return $sql;, U& z# {$ ?+ C
    }
$ t" X6 B! }  V# _% ^
3 [5 U, p! B  V/ t- {总结:
; g" z0 r* y3 R$ O" Z4 G8 B不要过分依赖TP的底层SQL过滤,程序员要做好安全检查2 z$ A9 a; K0 e! P- E* f
不建议直接用$_GET,$_POST
& v2 S# c5 d! x+ ?$ X[/td][/tr]
! b# N: a  f$ x* q( X9 a[/table]+14 s% U% u' Q" R
4 m* u7 C& D$ T4 D8 i* F: E( U
% W; k1 c( _' n' }$ H
回复

使用道具 举报

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

本版积分规则

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