找回密码
 立即注册
查看: 2503|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
. e! J5 q; N* t( B: Q1 SThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
# N, P% K  o& @' d4 d9 F/ N根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)7 X! ~  r( l7 m& f$ Z
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
& }. b: g1 J! D3 W$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
% ~& P  ^* k% [1 u
" u. G& E6 P" C5 K8 b 或者
  `2 [7 L0 M8 [" d4 [$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
. `$ `$ D6 Z5 [' R& R; D
  d7 ?+ P* M% P8 j! W/ r 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):2 Y& p4 J9 P2 h8 F4 r" F6 r3 _
$model->query('select * from user where id=%d and status=%s',$id,$status);+ U8 y+ f: ?- g6 g2 x
( Q! f: y0 o6 T+ {* _4 e
或者
! X0 V' B3 U; ^( S1 E$ C$model->query('select * from user where id=%d and status=%s',array($id,$status));
5 A* r% J: |! p) I2 I+ u
8 ?! }; m/ q8 C( X  p 原因:8 g. H# |, M* c. Y
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.0 W( u) j; P# B4 q; W
原函数:
6 q/ B0 w$ [1 f, S. r% ~protected function parseSql($sql,$parse) {
; j) \$ R' K6 i        // 分析表达式
8 Y& X+ G7 k2 X# l+ @        if(true === $parse) {
# Z" g8 c3 J/ f: n+ P- D            $options =  $this->_parseOptions();
. W- ^4 R- i  x8 ~- B  }( x            $sql  =   $this->db->parseSql($sql,$options);# v7 G; b! H% m4 X2 m' b; I
        }elseif(is_array($parse)){ // SQL预处理
* o) v# Z! r2 c8 s- c            $sql  = vsprintf($sql,$parse);
  p$ p7 |0 S5 M' a( y        }else{5 r8 i+ W* L9 j+ [1 U; }8 p2 Z1 T1 O
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
) o4 a! ~* g7 K" T2 n1 F; W        }
) N9 t/ t9 L' H& }, Y        $this->db->setModel($this->name);9 K; |& ?, }, \5 B" K) A
        return $sql;/ x: K( \9 J4 c  q- D" Z: a
    }( n% P3 C. }; ^
$ }7 J$ j/ Y( e: B: K: [+ C. [2 ?
验证漏洞(举例):
0 Q; ]$ i8 L9 ?' _) X请求地址:! n4 Y6 y6 a3 Y5 E1 u- l$ a9 g
http://localhost/Main?id=boo” or 1=”1
. }" Z  U* i1 V) B/ w1 A
4 J* d, G) `' \+ P' dhttp://localhost/Main?id=boo%22%20or%201=%2212 }/ j& @- p: D8 [$ Z5 y3 q
action代码:
% q, v* J0 _$ u7 J0 `8 a1 q$model=M('Peipeidui');
( E! I1 j# ]: R8 g( K$ K( n0 v  H' h' m        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);4 r# d) g+ N" ~/ `. Z# R2 O* {4 G" C
        dump($m);exit;
8 K$ A6 ]3 ^+ `) \或者# F& A1 L/ h7 i4 M4 Y% X: G* E6 v, w1 e
$model=M('Peipeidui');) R$ |2 R0 N. h
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
7 y: g6 \+ p- @& \        dump($m);exit;
1 K# \% x/ @: [" O5 O( S* |结果:* R$ H6 X8 Y3 I
表peipeidui所有数据被列出,SQL注入语句起效.
9 y/ ~* M* B' b4 Q# u解决办法:) J" X0 r; I& f0 k* q5 p# b" i
将parseSql函数修改为:" l- O8 s3 U& L8 k4 ^% ~2 P, X3 `6 [
protected function parseSql($sql,$parse) {+ F, k- A6 h! W0 ?1 D
        // 分析表达式4 e! i/ s8 @; e8 e4 v( `9 ]
        if(true === $parse) {
' n3 a/ M7 Z, y            $options =  $this->_parseOptions();
. B; n/ ~$ l( t  M. G. Z            $sql  =   $this->db->parseSql($sql,$options);# x% e# G: K7 x- [2 T$ i7 G: w6 b
        }elseif(is_array($parse)){ // SQL预处理
/ {2 V" n% V3 n, b) W& g6 H            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码( Z2 H8 K! n9 h) i2 r5 A
            $sql  = vsprintf($sql,$parse);/ ~) S/ S& ?& b! O! |2 Y! M: a
        }else{  V% D. x3 w& e1 {
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
' x6 D- A4 c- C3 r        }3 h$ C* w. B# }3 Q2 M- O: k
        $this->db->setModel($this->name);
; h, {5 h- O: B/ p, ?( b  V        return $sql;
( g+ ~& W1 b$ E  [# H$ d9 K    }
* _& l& y1 p2 H! \9 ?# Q
; G9 W, X/ r- T% F2 q5 J: ?# U: {总结:
' ~' ^1 o4 K$ m不要过分依赖TP的底层SQL过滤,程序员要做好安全检查0 y- i# {6 E! u( H. F6 n
不建议直接用$_GET,$_POST
! A0 m& B  A. T# i: H; F[/td][/tr]& F. y* q  p$ }1 u1 I5 f& d
[/table]+1$ u) |, C% {, g9 u* I

) ?, j+ i3 q. t# z# R. Z: x4 R# g9 e6 }( c! x0 F0 b1 l) T, _
回复

使用道具 举报

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

本版积分规则

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