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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
$ S( u' V5 ~. @4 \! {1 tThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件. K7 d, q+ C0 {' X1 p
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
4 q8 S- n/ k0 C+ a8 b使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:; x) {8 B7 \0 H4 M# g* I: b' D
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();, S7 w0 @6 j3 K+ m9 n3 U: v
5 N# C, q( a  D3 N. S
或者) Z* v7 {; ]+ @7 |0 K9 Y* U$ y
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();3 O3 O3 I" ~0 p; i& b- a, d. K

" x( k* p9 U! v/ h 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):. g- W9 ^/ B: z8 J
$model->query('select * from user where id=%d and status=%s',$id,$status);
8 z8 R; n- J9 F& E  n5 Z
% e2 U' X- ^" C或者/ F( H, Y4 \* M% y
$model->query('select * from user where id=%d and status=%s',array($id,$status));
8 t8 Y8 _7 n4 P% u/ v  @4 K, F) }+ |: S0 k# X
原因:, e0 L  Y4 U& C6 X$ ?
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.: Z7 T* k, H& h) Z1 F' w
原函数:% e: v2 B$ [+ I4 W0 x
protected function parseSql($sql,$parse) {
7 A* W% D! a, W) N7 h+ }        // 分析表达式& r  q3 W# j  o
        if(true === $parse) {2 B' Z* p5 t/ `* b" q
            $options =  $this->_parseOptions();
" p$ U! }8 C7 y+ `' f            $sql  =   $this->db->parseSql($sql,$options);9 R+ f+ Y2 n/ `$ G% h! B
        }elseif(is_array($parse)){ // SQL预处理
6 g; Z: U1 N; W0 `' d6 e            $sql  = vsprintf($sql,$parse);% _/ m$ g- t6 G/ l3 G6 D" l
        }else{
5 O. b5 Q- l9 m1 ]4 ]            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));8 |1 Q- H$ t8 l" |+ ~
        }
8 p# v6 s- R* p" y7 s+ c. T5 n) n        $this->db->setModel($this->name);
" m; K; T7 W2 e6 w) ^% v% n        return $sql;( X3 A& V, K" I9 T/ z
    }
) R2 G0 N! m) d8 ?8 F- D
4 C, z' z2 h2 U3 I& @5 Z3 d# `验证漏洞(举例):! c. f! K# `2 h' |1 d$ W" D. M
请求地址:
2 D: f$ {5 D1 B0 Qhttp://localhost/Main?id=boo” or 1=”17 \& E, A# h( m9 @6 {

/ p$ H9 t" T2 i; p6 Yhttp://localhost/Main?id=boo%22%20or%201=%221
9 s3 D8 ?+ o0 w3 t2 ]0 Caction代码:, u# ~' q2 d3 m- W) P
$model=M('Peipeidui');
6 L/ M* r# V! N* W0 R        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
! Z9 ^# e  B. W        dump($m);exit;0 w+ @. v" Q! W: J
或者* c( N/ D# `( y2 g6 u/ \
$model=M('Peipeidui');
2 b" G5 e8 \4 |6 y$ X- e4 m        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
) P1 ]" M# w7 v$ }: i* H+ G) j6 M        dump($m);exit;4 }* ~& f6 S* ?; x2 W% u7 }
结果:1 A4 L  S8 ?+ R! R- ?) D9 L
表peipeidui所有数据被列出,SQL注入语句起效.
) b: d( \9 }0 E- c, n" s" `) }1 q解决办法:9 Z2 b' [) S6 T9 Q1 k
将parseSql函数修改为:
, D' s) L( f  b. U; j+ C. N  ?protected function parseSql($sql,$parse) {
, ~$ O( g: ^+ @        // 分析表达式
& X% z; q2 Y5 p1 `3 n        if(true === $parse) {
- G/ h& ~" d( Y9 T            $options =  $this->_parseOptions();
* r1 {! O4 S" b7 J            $sql  =   $this->db->parseSql($sql,$options);
6 t- H2 h& [7 |, Q/ t* D; k        }elseif(is_array($parse)){ // SQL预处理* r) Q; S/ x- h1 F" O5 |3 z
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
. p' Y: f, H- \' G; k$ M            $sql  = vsprintf($sql,$parse);: e. K" M0 B+ P5 K
        }else{% i( k1 e$ w9 ]. r  e
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));( F! y! F0 z7 ]0 J9 M/ _( d
        }. d. t9 p& f& a# f
        $this->db->setModel($this->name);4 C1 y" y- |' y* i
        return $sql;  {5 |9 L: T! K
    }
" m% `. X: n/ r& d
1 o( n! m0 {6 G6 j+ H总结:
6 [8 z0 Y+ v( k3 a% a7 h& q不要过分依赖TP的底层SQL过滤,程序员要做好安全检查% m1 Y1 K/ A0 r0 m3 ?
不建议直接用$_GET,$_POST+ s  e  \: a) T
[/td][/tr]! P$ ^; D, V& }& N3 P" o
[/table]+1, y4 B  t( s+ K9 B
' ?( o' @7 ?  n) U) u7 K' A9 h

6 X+ k. Q4 F# S5 o7 Q' z* i6 r! {) H
回复

使用道具 举报

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

本版积分规则

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