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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。! }  N" Y! \' K! o
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
1 ^- W; E+ d, w, Z" X7 ~! U+ `0 R根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
) `3 U0 R- p+ d+ g1 L( ^& q8 W使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
+ K, D* T( F, M% W- i2 C: a3 x$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
, G/ @# m, I. j) A+ }
9 H) Q: f% J' Y4 S% k1 O 或者
: l  \* V5 n7 d: i- N$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();& I. l, o9 `, V" c" k* m7 U) i
( B% [" e' W1 O; ?$ u
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
$ K" k  p2 D1 f* |+ U! B$model->query('select * from user where id=%d and status=%s',$id,$status);2 c3 Q0 M% b$ J: m  C( T

6 x  ^' o) @! n5 p或者
' x7 m4 u& g3 `9 Z+ l/ Q) ?7 y$model->query('select * from user where id=%d and status=%s',array($id,$status));" t7 U+ w' v; s# g* |' u5 h+ h$ a

4 \1 R9 u' W1 g$ L  |; j. a/ e 原因:
* ^* Z: O$ M8 o+ z/ JThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.( P. K: X. |: ]4 r  w7 c
原函数:
6 T- n: h5 k6 Xprotected function parseSql($sql,$parse) {
# O, }( g7 u' d7 ~. h2 }$ e        // 分析表达式, s; N* U* B# M$ w
        if(true === $parse) {
* H) e$ O5 m& M            $options =  $this->_parseOptions();
9 f: ^6 r4 y% I7 Z& l$ o+ I1 z            $sql  =   $this->db->parseSql($sql,$options);
7 @+ y: {. O) G- q* [7 k        }elseif(is_array($parse)){ // SQL预处理
- q2 Z, ^: y6 `1 V            $sql  = vsprintf($sql,$parse);. x1 c6 N. j0 _7 `! v) Y8 p
        }else{
# p1 K: e! t7 R1 g) Z7 V; L. U+ G8 S3 m            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));( Z# {8 J2 y- r
        }
! j! }- t( [- k  C2 u/ f+ }+ V; _        $this->db->setModel($this->name);
, c5 X# q! ~/ l: ?        return $sql;
+ d9 S5 ?" n+ \9 z8 u    }# G; G5 ?" a7 Z; r0 G! R3 Y; k3 w; G
' X" v; T2 F3 W8 r% F: L
验证漏洞(举例):# F; k4 N8 O& E2 A
请求地址:
; x! [- W9 V! |+ g$ {http://localhost/Main?id=boo” or 1=”1  n$ z0 n3 E5 b3 S

1 K5 U; ~! ]0 u5 T9 V9 ~http://localhost/Main?id=boo%22%20or%201=%221
, {2 L( C2 N/ C8 Xaction代码:
2 o4 ^; s, [- U  v6 o& s$model=M('Peipeidui');
! X; d9 M7 [0 W/ g' x. y        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);/ @8 k: p; K) {, E# ~0 W
        dump($m);exit;  b- U* k* E: t
或者
- R3 a. n! }+ _: f9 X$model=M('Peipeidui');; j( Q; T% v8 z1 x: C
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));* r3 v4 i3 Y* t/ a3 x
        dump($m);exit;; N2 u8 f3 B7 }: l
结果:2 [  U9 A3 p8 K7 s  t0 k  o. b
表peipeidui所有数据被列出,SQL注入语句起效.5 Y% n& }7 j+ v9 T) l  D
解决办法:* M8 S4 I" s! J* F5 }7 J
将parseSql函数修改为:; C' v5 F; h. Y+ P- W& c
protected function parseSql($sql,$parse) {
: G7 l# ?! T, f0 I: M6 w        // 分析表达式
8 ~0 |: B% r) A. K        if(true === $parse) {
  G. n$ g3 T- _5 o            $options =  $this->_parseOptions();; Y# u1 }* X9 f/ C
            $sql  =   $this->db->parseSql($sql,$options);4 z% I0 L  b, M# b
        }elseif(is_array($parse)){ // SQL预处理2 v- a: p% v9 r: S5 Z* Z
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
5 i- \0 [1 s, `" g0 }, o& Q            $sql  = vsprintf($sql,$parse);1 s0 t8 r9 F' D0 q
        }else{* O/ C' \( D6 \/ ~
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));$ ^" U3 o! F2 n" x9 S) e
        }
& E6 s# k$ ?# H/ @8 s3 i        $this->db->setModel($this->name);
& D- x, @& b8 F$ u! r$ d% Y& E        return $sql;7 G# e# R4 [8 |8 g
    }
% q' n( ?8 s9 s2 N+ l& Q* ?  Y& j6 b
总结:
4 P/ G9 o1 K( E( U6 u* n% D# G不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
" y% s9 f5 @+ u6 P6 t4 p! u不建议直接用$_GET,$_POST  L' s: |2 Z% T8 t. m; ]4 X4 T4 R
[/td][/tr]2 d1 z! [. D" N7 q" |3 S
[/table]+1
5 x/ q3 \. }+ o# g) v3 O( Z- V5 v" H3 A
8 r8 E  @2 ]) W( n
回复

使用道具 举报

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

本版积分规则

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