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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。- ~3 j7 v# j  y0 W  L( v. t
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
+ E0 X" P! _5 _根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)' |9 A9 _3 A5 u1 a9 ]/ P0 ]5 D* i
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
1 `+ b: c7 ]- r! C  j" f$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
' l' n& {/ b' R2 o4 X# k) {% z
或者+ c+ R% }+ p, H
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();% T4 x3 B% k2 e1 A! H6 B% @3 @% Z
: e% ^+ d& S. d4 I7 |
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
! N5 t) ], Z/ O+ {3 N. N, a$model->query('select * from user where id=%d and status=%s',$id,$status);
; w% Q) Q; T& m
& S& R8 t! l$ M1 R或者
: c6 g7 A+ V; f) }! n1 U$model->query('select * from user where id=%d and status=%s',array($id,$status));
0 P$ ]9 ~# p& g! k8 A1 [6 ~* Y  }  g7 X$ k+ x9 Z, R5 i2 Z
原因:, ^6 i/ q: r- e( f9 _
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
1 [/ f9 J2 B2 o. G原函数:
0 M; N, r4 f. |1 t/ b) Y) C. N4 Yprotected function parseSql($sql,$parse) {6 R2 y3 v# V7 E% q" \
        // 分析表达式
9 x/ E3 Z- c, V  @) F        if(true === $parse) {
3 |4 E0 T+ O& S9 q( w6 w5 q) X            $options =  $this->_parseOptions();
1 Y6 ^: f  u# ?! N  @; f6 u/ n4 k0 M            $sql  =   $this->db->parseSql($sql,$options);7 D  P  Y4 h% _% x
        }elseif(is_array($parse)){ // SQL预处理6 [+ V3 {! q/ V8 C% i7 q( @% Q
            $sql  = vsprintf($sql,$parse);
" E( Y! _) s7 X& ?; B5 }( M        }else{1 [9 P/ {: e3 J5 X0 J
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));8 S& x  e! ]! o* [) f3 X# ^5 I& B
        }
- u' d' W) v" q8 f/ i$ \$ {        $this->db->setModel($this->name);
& z( h6 t1 W/ m) e        return $sql;
. P+ H5 L4 Y: r. v0 v: d& X    }
- l7 j, |; ]' G6 o& Y6 F: ]0 ^# b4 h$ \' _
验证漏洞(举例):
5 M; @5 s% d$ ^, Y! P% J7 t请求地址:
2 U2 Q: U% K/ p% B% Phttp://localhost/Main?id=boo” or 1=”18 T/ \9 K$ ]: v8 ^
& N+ y3 L) D4 Q, k/ ]5 t9 \  z( Q
http://localhost/Main?id=boo%22%20or%201=%221" n) j2 y7 S- h
action代码:
7 e* @: H9 W. v, O# @% z1 _$model=M('Peipeidui');/ B# f: u+ O7 \: ~  J4 ]; P
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);2 Q+ Q* \& [( G7 }" z; d
        dump($m);exit;+ R2 d0 E; `4 ^) O  `7 `. r
或者
! O! z1 }" N% o& S$ H! C& r6 \7 \! q$model=M('Peipeidui');
. G5 E- t% i7 C( @        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
; ]* ~# c" h: z0 ]6 U7 @/ E        dump($m);exit;
& p% o6 q. D  F+ N1 ]5 Z- g结果:. I2 R# X9 Y" `5 b
表peipeidui所有数据被列出,SQL注入语句起效.
$ g* }1 i# N; V4 ^. j9 R2 v' q! _解决办法:
% X, m, N" z0 D( Z) U0 x% t7 [% _- J将parseSql函数修改为:
3 G4 _- g2 f5 ]% m% Y( @protected function parseSql($sql,$parse) {
: f$ R! Z" j2 q- S7 Y7 j+ ~        // 分析表达式$ d5 i" f1 P* }9 k0 [3 ~; e
        if(true === $parse) {; l. H) C! Q6 @" e0 i: B
            $options =  $this->_parseOptions();0 n4 Q5 Z/ M- z
            $sql  =   $this->db->parseSql($sql,$options);; K' ]1 D8 t/ W7 [
        }elseif(is_array($parse)){ // SQL预处理6 t8 W9 Q# G- E
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码3 r7 Q! I6 ~: T# P! a
            $sql  = vsprintf($sql,$parse);: \: M, f8 i( E2 T
        }else{
1 e- E! R  f/ M            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));1 }  p- r% Q+ x3 K4 P1 C
        }6 W, `* u& R* F3 u' i
        $this->db->setModel($this->name);
0 M  [: V- |' s- U; i3 q: V1 T2 _' ^7 L+ p        return $sql;0 e' t# S3 r6 j/ j) x) P" M
    }
9 I% W6 d# A1 X7 d+ E7 e, ^
% C5 J: o- d4 i总结:" h2 i+ q! p: `/ x5 V1 `
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查9 z7 ?2 K, S! t# V- d; h$ u) a7 a
不建议直接用$_GET,$_POST
- J2 w; a2 B3 L$ i[/td][/tr]6 u$ x+ D& u$ a7 W
[/table]+13 P3 h* ~* }7 `6 x! Y' w2 @
5 ~" s: E& t! u4 j! \6 e1 [# s
/ [; G* B0 H: F- d
回复

使用道具 举报

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

本版积分规则

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