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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
0 y+ ~- m8 `9 |; j8 s$ G# K) VThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
0 b( g, R" e7 e+ |根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
1 ?5 V9 f0 e; m6 k- @使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:( l5 I8 z7 [: x8 P6 c. J
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();6 E" N; _# I5 a
$ J6 e7 \5 r4 F4 @9 s0 E* C
或者
  d2 g1 a- A2 i3 c; h" R$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
8 @4 m4 l. Y# k- t; x6 \* U
3 e6 Y1 I- k& \, J 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
3 Q7 M8 H' ?0 u8 d7 n* {$model->query('select * from user where id=%d and status=%s',$id,$status);) W# L0 B4 d% i( O
& y3 Y3 U. `) _" e2 B
或者: g5 |/ h3 H$ d
$model->query('select * from user where id=%d and status=%s',array($id,$status));
3 }6 x. G% x" r- C7 Z6 M3 P) E# _
原因:
: H% D# ?  v& t, x% O1 wThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
9 z6 G6 i2 Q, \. N, O* Y9 p+ `原函数:: f$ F. r* v# _. M2 u0 z
protected function parseSql($sql,$parse) {
1 R+ }  W6 k& K4 |- u        // 分析表达式
, Y4 F; d9 K+ q* g        if(true === $parse) {
* W/ l, _' U/ }( `* f1 c. W            $options =  $this->_parseOptions();2 \& N# P& R7 R- |/ o: c
            $sql  =   $this->db->parseSql($sql,$options);
1 e2 Z/ A; o& E5 ]$ ^( x        }elseif(is_array($parse)){ // SQL预处理
/ m3 o/ b, _: J6 x4 v' B) `            $sql  = vsprintf($sql,$parse);2 i3 z6 b0 m6 I* w+ f% E
        }else{5 Z2 H0 q1 P+ }; A# r% l7 q
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));1 k; ^4 e, x# d. ?& H
        }
4 h9 S' ^3 {! |* I" _* ^$ s. x        $this->db->setModel($this->name);) j+ e. s, D( t+ X* L
        return $sql;# T9 l/ Y8 b- v) m5 O
    }
2 M* ~+ F8 n/ t* B; }: f% t; b4 f, k1 t+ ^
验证漏洞(举例):9 l  w- N: I0 J$ _4 o' x
请求地址:2 B( e$ Q+ ^: {, F/ J9 R! Y1 j
http://localhost/Main?id=boo” or 1=”1+ {" o' L& |6 X* Z+ j1 G/ o5 L
0 c- \: k# {- c5 ~7 K8 K3 r
http://localhost/Main?id=boo%22%20or%201=%2213 s" L) Q6 W, s0 g& `
action代码:; ]7 f' K% j. V/ i# Q
$model=M('Peipeidui');# @' h3 h* b+ j4 s5 e9 ^; O1 \" B
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);0 B% f0 I$ K; S4 i- i6 s
        dump($m);exit;6 O* n/ F9 ?: Q) B0 m* O
或者
2 [# y  Z$ t0 ^" I$model=M('Peipeidui');& n+ u. p# a/ {2 z4 y, z
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
/ _9 d' I% I0 E4 C# l- t2 v' ?8 k        dump($m);exit;
- h9 X( i7 _! ?结果:
! j& P" X+ @( p8 Z5 F, |  ?表peipeidui所有数据被列出,SQL注入语句起效.- D( p3 B7 N5 M5 g& V& s% `2 d1 L& w
解决办法:$ l, B, l$ E& @% V
将parseSql函数修改为:0 c, n8 w( r* G# k8 H0 H2 y' G0 U5 Q: X
protected function parseSql($sql,$parse) {
2 F% w, e) O. E5 h+ j) ~7 }        // 分析表达式
! G6 {, f( k0 ?$ G+ g- L        if(true === $parse) {
0 P* E* N* m2 m5 m3 ?9 C. k9 D            $options =  $this->_parseOptions();; C# s5 v; z' e1 W+ ~1 u
            $sql  =   $this->db->parseSql($sql,$options);$ i& k& w2 {- H  ^
        }elseif(is_array($parse)){ // SQL预处理
& I, g) q$ `5 F% Q5 {, [            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码1 W. m. y7 A* [* X, g. R  n6 M( r) n
            $sql  = vsprintf($sql,$parse);  A6 H4 x2 a5 x  b$ J& V4 r! t
        }else{1 y1 B% ]* i8 A; T1 E( g8 X! b
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));- I% P0 ~8 p% E. c( G
        }* w! S  Z8 |3 l
        $this->db->setModel($this->name);9 o( j  x# {0 b, i& i
        return $sql;* O  f, s, N3 v2 Q3 k7 U/ `
    }
1 Z' \$ N6 a) i! n
8 Z3 v* X9 k2 U' ]总结:: ^3 e% a! c4 o2 v3 Y
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查4 c/ \5 u8 t- r9 k" ~' P0 Z: U
不建议直接用$_GET,$_POST" z7 i1 f/ W9 G4 k/ }, L
[/td][/tr]# _2 w; s; L2 C7 W* Y
[/table]+1/ X" u: }+ V3 a9 T0 U2 K9 o
1 a% q. _( q( B) S$ \: g

0 G8 u# \) X2 \9 L: q
回复

使用道具 举报

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

本版积分规则

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