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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
5 Y$ Y( J6 ~4 z. A  {7 h! @ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件$ y' h! L% x" m4 e
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)7 D+ g5 w9 E% |; r8 q
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:# `$ f! ~/ M! f2 L7 ]0 W
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
, Q8 Y6 I$ U# G4 c- O& P8 T; Z' }# [! n
或者
  H6 g% J) u* D% o. O3 a& d$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
' ]8 V) M4 p1 f5 x# x
. ]/ J" H# ^" c4 [# p: n 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
: s: ?. ?$ Q$ B$model->query('select * from user where id=%d and status=%s',$id,$status);
9 f7 m) |; {) v, A9 `1 @* @8 [
或者
# f5 @; V* E6 s8 ~: [2 E7 }! g$ k& z9 J$model->query('select * from user where id=%d and status=%s',array($id,$status));
- H- w: h" S6 e5 D, }- r# O& K8 V
7 f7 y; u; |9 p! A% d! N 原因:% S6 X4 [2 _( W. E
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤., H7 K" N1 P2 m6 u1 R* N" [
原函数:
: D9 k. |" v! b0 [protected function parseSql($sql,$parse) {
: j- }+ t# {0 m+ k        // 分析表达式
7 D, [0 b% B% E! E: R$ ^7 \        if(true === $parse) {
; S- P7 g3 S' O            $options =  $this->_parseOptions();
. r" j. w; J" G/ p" |            $sql  =   $this->db->parseSql($sql,$options);, ^, C6 T) t7 L; _1 d8 C" q
        }elseif(is_array($parse)){ // SQL预处理; t8 G  V& w3 ^5 S% d7 q+ d" v
            $sql  = vsprintf($sql,$parse);6 i, I% T# r6 t" D3 |: J6 r
        }else{
& q" N0 B+ U+ C. O, ^            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
, @6 f, Y4 F. M/ P        }- `  N6 _$ t8 w1 }+ S
        $this->db->setModel($this->name);; M: Z! H, N- R4 S* T) [
        return $sql;
" s3 }) ^/ M% H& h0 M$ h, ]    }
, \; X1 P6 ?6 g" y" y* t( D: g, h5 m( y+ X+ V- E7 T
验证漏洞(举例):
) B# T& `& t8 s! Y请求地址:
! u  Y; z2 K4 Z2 T  v4 f, J& lhttp://localhost/Main?id=boo” or 1=”1
% a8 S/ v% z, C: u4 Y2 a* _  |3 T1 J* o' X, P* j
http://localhost/Main?id=boo%22%20or%201=%221
: r' y1 O) Z( T1 K7 g8 ~+ p, Baction代码:7 @3 Y1 f$ K( h8 `; |% U  |3 k
$model=M('Peipeidui');* A2 _4 ?6 P9 p# d
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
& ]' F! A' \/ i" b        dump($m);exit;8 N7 l9 n. A+ e1 @2 F) @
或者
* w* \1 z' ~6 p3 b1 T- \$model=M('Peipeidui');
) Y/ b8 H2 [# Y        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));- m9 G; c' j+ p9 |0 o6 u4 P, {
        dump($m);exit;* Q. x, r! t$ y+ }) r
结果:$ v: d# Y4 i5 [- Z
表peipeidui所有数据被列出,SQL注入语句起效.
* H6 ^  p4 A1 m) J解决办法:! v( C0 h9 N# q+ I- N: g
将parseSql函数修改为:" L! P, x$ H! n; Q! N0 H
protected function parseSql($sql,$parse) {' I! _+ l! f- V5 `# F: E' l7 c, q! \
        // 分析表达式
. Y$ e6 s$ a( ]% u8 e; s  O        if(true === $parse) {
2 j7 a5 _# P; C5 P, h( {& ~; N            $options =  $this->_parseOptions();
- N+ n! ]7 o# [# E5 v, I& _4 ]            $sql  =   $this->db->parseSql($sql,$options);
: M8 _* C+ F! P; `7 V/ o( g9 Y        }elseif(is_array($parse)){ // SQL预处理
0 H0 A2 C; e. ~. s% X            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码3 z7 x4 e3 P( `$ B5 R
            $sql  = vsprintf($sql,$parse);) D; i9 P. k0 V2 t
        }else{
4 {" J* q& S! X, Q6 {            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
  J" ?% G3 Y3 t: V5 `( _        }
/ @/ H5 X1 M4 Z4 l, ?, ]. H        $this->db->setModel($this->name);
# f: Q  O# `4 Y' R        return $sql;
+ O  v+ V$ [  Y: B( ]    }, _7 G  h, e2 p  ^" I

, u: v: y' `5 \% V1 X6 G3 n# G总结:
( d( \" s2 E) z: _# W3 q不要过分依赖TP的底层SQL过滤,程序员要做好安全检查2 u# o8 C- _. P0 N* v% m# Z
不建议直接用$_GET,$_POST$ ~6 _/ H7 _9 g3 a4 T
[/td][/tr]; a/ {! l$ I+ }/ z% g' [
[/table]+12 Q- C- g6 r2 Y# P9 b4 w$ E
0 t. `, V6 E0 w: V% ^  r
& `+ G! Y6 y9 ^% a' s
回复

使用道具 举报

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

本版积分规则

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