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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
  d: X; u$ j1 W! G# bThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
4 P+ c1 z0 D# H. b根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
3 z' \# r) H  z, I% L3 ?使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
! \4 k* G% f( y- l$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();; \: B& r* E8 }8 c# x

% Q" F. G" A5 S& ^ 或者% x1 C- T- h4 L' K6 c9 G% ?! a
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();) t0 j8 r( h5 H; U, K8 n

# x4 T: u" f0 |# @* K 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):) s6 k) Z* h+ f; _" w: M
$model->query('select * from user where id=%d and status=%s',$id,$status);* [+ C, E4 x9 a9 @
$ X: B$ {5 C( t% S; ~& F
或者" o& r9 D5 S$ N, P* c
$model->query('select * from user where id=%d and status=%s',array($id,$status));  `& o* o' I. l' n/ H$ a; T; E
9 [6 U8 m" `/ l1 ]2 v
原因:& O# X6 h! a) {
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
6 W8 C3 G( v9 I2 V% n) Z原函数:  X/ V1 M# E* R8 k% o
protected function parseSql($sql,$parse) {
/ _9 _2 g2 Y/ r, w& Y% z6 ]        // 分析表达式
9 v( a+ I& k' r, N! o, \        if(true === $parse) {
6 t* w; _% F: x            $options =  $this->_parseOptions();2 u5 @, K6 F; l# A3 V" F  @- h
            $sql  =   $this->db->parseSql($sql,$options);
" w! t/ T2 o. B0 }, ]. b. [        }elseif(is_array($parse)){ // SQL预处理
) N8 i/ e) [/ W  t7 ^8 o            $sql  = vsprintf($sql,$parse);
  {- k4 O/ @1 }, U: A/ N        }else{$ n2 _/ v2 K! a4 k' f5 D/ G& G0 W
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
$ X) k% _% a2 ]3 z& u8 O        }
) B; T1 `' N! m1 Y' U2 |        $this->db->setModel($this->name);
; r) W6 B" H+ x" R0 k+ W4 Y        return $sql;
0 J7 @* i. s! y5 [: u; Y* w7 L- }    }' M. k. V$ e4 y$ {
7 a1 w/ |# f$ ]4 R* Y
验证漏洞(举例):
; b+ Z( h  z, R请求地址:- F& `6 x$ N4 [" u! _
http://localhost/Main?id=boo” or 1=”13 v; W; O5 L, g9 Q. J6 \7 R+ c
. x3 f$ Q0 }$ y2 e9 c
http://localhost/Main?id=boo%22%20or%201=%221, A. T, Q" P8 w( P9 h/ w
action代码:
% h; ~3 w- O/ o" ~* w) s+ e7 K$model=M('Peipeidui');. L6 O) l6 p$ e6 B
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);& b) C5 w8 p$ n$ H
        dump($m);exit;
; B5 `3 j! D2 w3 f5 `或者2 S" U- }# f3 h7 W
$model=M('Peipeidui');
' u2 b/ K3 u6 K3 Z* U        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));9 h8 w1 U; Y4 ?/ D6 c: t
        dump($m);exit;
/ y) V4 a, Y, z: u结果:2 m( |+ H8 B0 }- D8 B' V
表peipeidui所有数据被列出,SQL注入语句起效.
$ Z( J) p2 E6 r! |" |解决办法:
! U3 W, m3 |' |; u0 ]将parseSql函数修改为:/ L# p( t: `. ~! _( P' R- T
protected function parseSql($sql,$parse) {
) V/ n9 O1 F( c( M& x        // 分析表达式" v7 x7 C- p5 L! K9 T3 C4 [# D) P
        if(true === $parse) {
; }4 l$ A+ c- U% u- t            $options =  $this->_parseOptions();
9 c8 {0 V0 Z% U6 Y* a% `            $sql  =   $this->db->parseSql($sql,$options);
2 O+ u/ k6 @0 N: S& C, q        }elseif(is_array($parse)){ // SQL预处理; x  V7 J, l2 Y8 p
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码- \& S' m# i6 E0 z
            $sql  = vsprintf($sql,$parse);
( r1 M+ A- ?4 {. U4 R        }else{5 X2 g; v  |' ?# R2 ]
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));6 `! }$ z: d6 g. }
        }
. G* V( E4 o/ ~6 D        $this->db->setModel($this->name);
$ ^4 D4 t' e4 Y( G1 q( X0 {3 o        return $sql;
2 t9 F0 u* W# f* l& D    }
/ w/ k6 G& H+ `6 ~8 U2 a5 l. ]/ h* r2 `0 q
总结:/ P# i& X8 w" h" `$ P
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
" H# w& X& O" A& U# ?) G) s不建议直接用$_GET,$_POST
! H$ _5 a( L+ z, K9 \[/td][/tr]
0 O; w+ P" _) t* j+ w0 d) E[/table]+1
# P) L6 w3 V+ l! y6 I5 n+ I
( z6 Y2 C; Q$ u
! N" n: ?. y, |* |" J/ @% A
回复

使用道具 举报

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

本版积分规则

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