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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。1 F7 H3 I( F8 y& e# G
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
7 ~6 B( G# p) j& \根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)6 h9 Z5 s8 V& k6 _* @
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
% w' t# t9 G6 _: j$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();* q! g( J4 I; n5 z4 ]/ c) R+ v
4 |3 Z; N: r+ n) V3 ^
或者& L. b  y  n/ h
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
* c; J( P2 E6 _1 H( ^$ K% J8 L
9 ^! |& _) t6 X3 a$ M 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
* h0 ~  u5 D, g9 F8 J+ W$model->query('select * from user where id=%d and status=%s',$id,$status);
  b0 R! @$ ]- K1 {; r  E7 V; s6 B! n& J" \
或者- _; D  h0 u5 @; D4 v7 u
$model->query('select * from user where id=%d and status=%s',array($id,$status));* f9 A" }+ \4 y+ O

2 A- {2 L( T7 i: W 原因:
& l" I0 ]) k1 bThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
4 [) `/ k& ?3 ]9 {原函数:
3 j' @- p6 Z6 Y8 Z* E. Jprotected function parseSql($sql,$parse) {# l; y, ^9 B" q7 E( g
        // 分析表达式
" s1 p# L' }+ y2 T+ }' V" z4 n        if(true === $parse) {
: O3 i! u7 Y1 ?" d$ o8 A            $options =  $this->_parseOptions();8 ]5 {5 ]( T  ]2 v+ {0 E& I: i5 r
            $sql  =   $this->db->parseSql($sql,$options);
" _" @3 C0 z2 v+ c5 C        }elseif(is_array($parse)){ // SQL预处理- c) c9 P2 Q, [# ]" n4 A% O
            $sql  = vsprintf($sql,$parse);/ `. j8 {  v3 x  R! F8 ?+ u
        }else{2 S' @! E/ @$ I
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));. {: h  O! ]9 m: V6 X% D4 Y) a
        }
; I( Q/ Q" e3 A; H        $this->db->setModel($this->name);! ?# D' P3 ?# ^
        return $sql;7 U6 t8 }0 n8 g$ [) }& }+ M) h
    }
( m7 E$ ~0 a! C9 ^; {4 p) r5 o/ _1 F2 _: P5 U% S# R
验证漏洞(举例):* w, H8 E' X7 c3 f" [6 e  Q! _0 p5 f
请求地址:
* O% A' L5 T, G! S# phttp://localhost/Main?id=boo” or 1=”1
: c+ w  M+ @6 K/ v) k5 H5 \4 C: a5 b
http://localhost/Main?id=boo%22%20or%201=%221
$ B* @! O( K9 M! ?action代码:
% P5 p' m% j+ F7 E  J: k$model=M('Peipeidui');
5 K0 K. i0 ~$ L2 s9 H$ O        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);8 @8 {' P! U2 r' Y* W, l+ v. ~
        dump($m);exit;4 s* l' C' i& [: c; a5 Y0 Z
或者
* R! G) }9 R) o, J: S7 o5 @$model=M('Peipeidui');
/ c, G; G) B( v9 e! o        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));3 U9 Q# N4 @. @% X" y
        dump($m);exit;
- u4 ]3 h: }9 V! U) [# U& B结果:
5 G) [+ D2 N9 R; w& b% l6 y表peipeidui所有数据被列出,SQL注入语句起效.
0 R/ [& ~  t  Y% Y3 j# m解决办法:
% ~" B, e  l' A3 m将parseSql函数修改为:% H% E! H+ J; r! ]# W- k6 R
protected function parseSql($sql,$parse) {
  l! w5 S/ E9 I; U; P5 @" p        // 分析表达式
& p; j' Y+ |# e4 I* W7 }        if(true === $parse) {
  d- g- S# _1 }* `2 [! N% K0 \            $options =  $this->_parseOptions();
/ h+ b/ k# d- e0 P            $sql  =   $this->db->parseSql($sql,$options);
' n9 X2 c0 q) N8 I. p8 r        }elseif(is_array($parse)){ // SQL预处理- v3 A- N- `# g( @" P# K
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
4 k3 b4 @% v; I. h9 y            $sql  = vsprintf($sql,$parse);
& j$ o# S- r  \        }else{
/ _& Z  v  X' i2 X% _- O" j0 k            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
, T# {9 q( c1 g        }& M2 J3 ?# E: K1 o! a
        $this->db->setModel($this->name);& j: u8 G( a. i, W+ s5 w
        return $sql;2 x# A! V1 e8 C$ d5 U; C" b
    }2 a: a1 Y( B/ l2 f1 ?$ r
2 f8 e2 ?* t: t% N1 t
总结:
4 U- d; y/ G) o  I7 M3 |不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
! T  U  X7 m' }不建议直接用$_GET,$_POST
4 K; A/ U. X) R9 S3 O[/td][/tr]
+ F/ g8 B- L6 O7 W1 \3 c[/table]+14 _3 W' g8 j0 `7 Y3 B% G, f( W4 h
/ P+ N) D) {/ N9 _# z% K- [9 w

0 F& m+ h$ F0 y
回复

使用道具 举报

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

本版积分规则

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