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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。' |2 \- ^" e; _7 s* t
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件( U* J3 p+ J5 s% l+ G8 p8 F
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
% O  f# P) N6 [7 h使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:/ Y9 e! ]2 `/ r/ P! C
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();, E: V" G' Z: |0 E5 o7 n. H
; R. P% I+ r' ~+ r( h
或者8 h" U8 n' d$ H  b4 m0 Y
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();: C" r9 r- ~  f
; s' i. a0 m& K6 |7 X' }) M
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):0 @% a5 o% p0 `/ I. ~
$model->query('select * from user where id=%d and status=%s',$id,$status);* v7 w$ a/ Z( n8 ?

# ?, {5 P2 u$ W+ R9 K或者
0 d* `, Y* R. u! |$ N$model->query('select * from user where id=%d and status=%s',array($id,$status));( z# {$ _% I( T' i& Z) U8 A
: r6 Y1 a6 _, ~0 H5 ]# p4 p9 A
原因:4 i* z" c7 a( M5 f; U2 c
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
/ z( e2 C2 k& z& |" C原函数:0 F% G- R* C! \2 V
protected function parseSql($sql,$parse) {3 Y7 p# g; R& z$ K
        // 分析表达式
* j2 U- v6 s% D0 O  l% O  X        if(true === $parse) {/ E4 M- t% ]) o9 ~* v
            $options =  $this->_parseOptions();
$ v; ]- Q+ j7 I            $sql  =   $this->db->parseSql($sql,$options);% u6 h/ c0 z3 X: Z1 w; D" o
        }elseif(is_array($parse)){ // SQL预处理
0 }: _% y% C- r+ t0 l" Q            $sql  = vsprintf($sql,$parse);
# P7 X8 ?/ A; k        }else{. f' Z  m: R# y5 s: T. A- ?$ Y
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
; E! j) A" g9 K- E2 k3 B/ o0 T' h        }- T& u$ b, M3 Z5 [9 S3 k
        $this->db->setModel($this->name);
: J2 K" s# f& p1 P( U, p2 y; {        return $sql;5 |% y7 s3 h( @8 o0 j& |3 Z
    }0 _; @$ ]/ M% d1 ^" ~% M0 g
( t6 `& a5 m, R* R" M* o
验证漏洞(举例):! c6 a3 b5 w; I6 d5 \0 v6 u
请求地址:0 i9 ~* {1 S% ^% f2 j3 R& ~
http://localhost/Main?id=boo” or 1=”19 j0 x; H: N+ I1 Y8 V
9 N6 X" V3 G- z2 c1 l( \# m. G
http://localhost/Main?id=boo%22%20or%201=%221
: R! [" B! G6 }2 @- naction代码:
+ ]" x: ^6 ]6 _/ n$model=M('Peipeidui');
" ?& ]: G8 j3 c1 s        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
& S  Y* G: o! X/ ]        dump($m);exit;" g2 E1 I+ L* B4 X! Y
或者, u: m) Y: _+ T  q) {
$model=M('Peipeidui');6 f4 B( Q" @- R* q
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
$ b- x$ ^" [1 D8 I+ x# `. B6 Y        dump($m);exit;
7 k+ X/ R# M% [; E+ Q  g结果:1 w5 b( ^% u! p3 E, e1 j
表peipeidui所有数据被列出,SQL注入语句起效.4 c" w! G3 p+ d  f2 ~8 K
解决办法:
$ ]1 |' ^4 T3 t; u3 E8 b8 w将parseSql函数修改为:4 Q0 s* Y2 Q# v) \  v6 S3 L' @' u
protected function parseSql($sql,$parse) {+ \5 v6 M) Q/ s1 G5 i9 B
        // 分析表达式" u# c1 Q& ?7 y" a! A5 g3 P' M
        if(true === $parse) {3 w% V7 [8 B( M' }) i
            $options =  $this->_parseOptions();$ Z) k4 U# G+ j% {
            $sql  =   $this->db->parseSql($sql,$options);
( N9 a6 C- j1 F+ K        }elseif(is_array($parse)){ // SQL预处理% \9 f8 O9 m  k% D; f, h
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码/ R3 y/ f5 C% ?6 v1 I
            $sql  = vsprintf($sql,$parse);
3 j6 k; h( R8 M        }else{
2 k) g- O0 ]7 Q+ O9 U& i, D+ t7 ]4 `            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));) h* I) i) b* E7 W2 M  z* h
        }
& ~) _7 I: x# f# w        $this->db->setModel($this->name);; A( t( |" F+ g$ s" P( r2 }1 i
        return $sql;
0 g7 c- m+ k6 h) f; ?2 J    }/ g, b* t7 c5 {+ o: x' F! f
" a: E6 {% T6 ]. ^2 H
总结:
- I  Q7 f$ S- T- w. x3 l不要过分依赖TP的底层SQL过滤,程序员要做好安全检查# l: M& m% }- ]7 `8 S# d6 ^
不建议直接用$_GET,$_POST9 P  I& E; }2 `# d9 O( k6 f4 ]( p) K7 h
[/td][/tr]
- W. E+ _. ~  ^$ u# J2 u[/table]+1
6 r" v  H7 s% r& L3 u. |$ u- ?
1 F+ ]- Z/ s6 \% S9 [( d
* `" m9 F, [, O" g
回复

使用道具 举报

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

本版积分规则

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