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

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

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

* i' Y- s( I3 L5 M. R 或者
2 s$ ?/ ~4 T( c) G8 P3 i$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
- A5 Y% q* F8 r) g% H+ D  X' l! C# }# Z4 _1 N
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):+ j7 ?9 i4 N5 A
$model->query('select * from user where id=%d and status=%s',$id,$status);
: a1 o- E0 u( J3 T& e- f+ y
: E! w' N* k; N7 ?或者
7 a& O6 S" v. \- N' P! W# \" m4 [4 V' \$model->query('select * from user where id=%d and status=%s',array($id,$status));
* [( g4 f1 J/ S& N% b6 K: }5 Z. T5 T- G8 t' T) D
原因:0 F; U2 d, e3 \) L
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.( H( B2 A- q! s0 u  T3 \! F. a
原函数:9 H' {9 Y7 ^8 J! y& d
protected function parseSql($sql,$parse) {
" B& o# \+ t  F+ Z/ f        // 分析表达式2 B$ Q# N; E$ R* z/ E  ~
        if(true === $parse) {
/ a2 I5 ]' r+ J7 `7 x1 q% l            $options =  $this->_parseOptions();7 l9 ^/ u) ]% q! }% q
            $sql  =   $this->db->parseSql($sql,$options);" E5 R( e; A( ^' w* n9 F+ ^* t
        }elseif(is_array($parse)){ // SQL预处理
1 m; V9 O; p) K% p. u. T  j9 d- O            $sql  = vsprintf($sql,$parse);, X# m& r1 R& ~, v& f9 Z% r
        }else{
2 r9 e6 ~( K9 B5 g, j            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));& U, Y8 D: r) [  }5 S- u7 G: ~2 W
        }1 N0 o7 y& ~! o, |  v6 @
        $this->db->setModel($this->name);  @! f3 U- i! J1 @5 v
        return $sql;5 ?' U5 ~& l8 s
    }" o1 p3 _* X6 I

4 _' g, s/ S) E验证漏洞(举例):
( g5 M( x( Q# {5 O* N# a2 T请求地址:
2 M+ d) v2 J9 V* C- ihttp://localhost/Main?id=boo” or 1=”10 g2 d1 z" q' a' s+ f; O

8 ~. i0 w; Z  zhttp://localhost/Main?id=boo%22%20or%201=%221
6 [0 t! H% c$ {6 Z5 Vaction代码:
7 k1 x, T7 j& v( M& ~! e) x" A$model=M('Peipeidui');6 ^" y, t6 R" n* ]( g: Y* ~
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);, `' c2 v2 ^: c2 B1 }# p, Z) }
        dump($m);exit;
9 g" d: E  C4 H( R或者
2 p# U0 E% D+ a2 O  R. }$model=M('Peipeidui');  f3 k! K  e7 K  X, e; I5 z
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
) e4 P6 i0 ~0 u  S        dump($m);exit;
" C) |3 Z  H9 j结果:/ \2 q5 G0 B+ Z. z" V/ _
表peipeidui所有数据被列出,SQL注入语句起效.
" V0 J. g& f+ o解决办法:
0 D8 E5 H8 I( O将parseSql函数修改为:
7 o, T& U3 F6 H7 |0 Z7 m0 h7 {protected function parseSql($sql,$parse) {9 D5 t- Y% E0 c. M
        // 分析表达式4 L3 @& ?, Q% R5 @4 v' ?- @
        if(true === $parse) {
& |+ I( l3 A& Z& w0 o, H            $options =  $this->_parseOptions();  Z( t$ z) W- Y+ n4 _) c; O
            $sql  =   $this->db->parseSql($sql,$options);
: A5 J2 [' v* y  i* [. D        }elseif(is_array($parse)){ // SQL预处理5 @# |. N/ W; c# f( h; |; F
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
" v' j3 A# V2 h            $sql  = vsprintf($sql,$parse);
& @5 w2 D" W; K5 D6 k4 g! k% y        }else{. G: R' N! m6 I1 K
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));/ |' i- s9 l5 Z. [
        }* \! Q0 V) R$ x! F
        $this->db->setModel($this->name);
' e4 @: T2 q! q- n7 V        return $sql;
5 C( z7 x, X8 X3 n: ^  N# f    }5 W3 M9 h; s% n8 G

# j/ P. h3 `. x/ Q/ _总结:: G; c( ]+ H% ~! f. u
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
# W2 [7 v: O% m$ F( S8 e- l/ t+ ?6 g不建议直接用$_GET,$_POST
: h$ _4 u* Z5 d. L* t7 S$ K[/td][/tr]
4 H# O) V% H2 |: d! y, W: D[/table]+1% q% w7 T. K; V: h$ D

5 V- |6 X  i  {+ F# o9 b
" o* S, ?- _* u' l4 A, Z) h
回复

使用道具 举报

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

本版积分规则

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