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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。- v+ @* V4 Y; m- I0 G1 S) W5 `; N
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件9 f8 e5 R; G0 [2 @/ C& b
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
8 U! X  ~5 D% i8 |* `9 G使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
2 x1 C) ~1 {; Z* f1 u, c! A$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();# l% d+ r: t' ?5 l
; p' c1 V3 l: A3 e5 Q8 ~
或者
8 t9 T" f: b" |/ j& V4 [$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
: Y. w( l3 W% b, {2 k, c* {' B6 `5 ~  x8 U, R4 {# Z, u9 ?
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):* g- z6 T8 a/ r' X$ Z+ t# ]
$model->query('select * from user where id=%d and status=%s',$id,$status);
1 m+ c. l  m4 B: a0 `/ _/ [: [
9 i: Q4 U% K5 L9 b1 f1 @或者
  \1 R+ A! i3 \5 r! M" [$ q$model->query('select * from user where id=%d and status=%s',array($id,$status));, r& p9 z/ j- f, r% s
  _/ z, P6 M( t( W$ D; T/ P
原因:
& z) w: K4 Z4 yThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.- a) d% m+ N1 g# ~2 y
原函数:
! n$ {7 s2 @4 Y9 t( _protected function parseSql($sql,$parse) {1 |7 G4 c+ K4 y! V! V  G' X
        // 分析表达式
0 n" P4 g9 A7 F/ _9 F1 I        if(true === $parse) {
  z2 d+ c% `1 m3 {            $options =  $this->_parseOptions();$ \: c2 _! s4 }# W! ~
            $sql  =   $this->db->parseSql($sql,$options);
6 l1 t. r7 w1 M        }elseif(is_array($parse)){ // SQL预处理
9 `: h7 H& h% e+ D. R            $sql  = vsprintf($sql,$parse);4 M' O1 U! M1 n' u' i
        }else{
" K) m/ _8 N6 v* C: z: v            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
; ?& I" x. F. }; E. z        }1 e: \4 v( P9 ?: ^' ~3 m: E
        $this->db->setModel($this->name);
" ~9 r, N: j# i. |        return $sql;  }! j) T8 e. g! W
    }
. }) s1 o* w( N1 }6 H0 F8 j# j
4 h* [7 H, h9 D6 J8 ~& P: K, z; v验证漏洞(举例):
7 ~% H7 u' r" ]" C; O请求地址:
* L6 G# Y- `/ E; u" Lhttp://localhost/Main?id=boo” or 1=”1. u% g7 v0 l! P3 W

. u. `, Y, F* ^2 Nhttp://localhost/Main?id=boo%22%20or%201=%221
( B  ]' T) O/ q$ C, K9 C0 I2 v. Caction代码:; t. A4 T7 {' k" I1 |1 y0 U
$model=M('Peipeidui');. `1 o( ]# ]$ M4 I, X9 f% A! J
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
' L; Z! A$ ?3 s' R  O        dump($m);exit;
. l& g" A/ L9 {9 L9 h$ Z或者& @1 P+ Y4 r: f! t
$model=M('Peipeidui');% c/ I9 L& [: ^6 |7 w' `9 R* l
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
, S5 W9 h; L) x/ \  ^. H" [        dump($m);exit;8 ]$ @; C' G( \1 p% ~
结果:
+ k& j; ?% @+ v% K) x5 C表peipeidui所有数据被列出,SQL注入语句起效.
8 l( e( B2 u6 _' K/ ^7 E# k0 X4 n  ~解决办法:6 c# ?& e# T1 s
将parseSql函数修改为:
1 p) g% |$ ]- ?. j* C: P( iprotected function parseSql($sql,$parse) {
0 V1 a6 b, f2 _        // 分析表达式% c- W( a8 ^! c" G
        if(true === $parse) {3 S! W4 p. k4 V; b2 f
            $options =  $this->_parseOptions();# p7 p; q  Y9 Q- j0 f# D
            $sql  =   $this->db->parseSql($sql,$options);! h4 F( ]) K2 v; {+ x
        }elseif(is_array($parse)){ // SQL预处理0 S# o  D8 V- ^4 A& X' i0 U# X
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码2 f0 T4 p, k3 E9 A, I( _# {
            $sql  = vsprintf($sql,$parse);+ o# n3 Y! E/ P' Z0 ?% y
        }else{3 R9 V% h3 T7 C3 x! b* r6 I) |6 z
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));! F* D- |6 T4 v$ [4 V. z
        }4 L% W+ {  z3 ?( W' |0 Y  S+ a) _
        $this->db->setModel($this->name);
4 n' c/ y6 f/ ?8 u( I' ?* B        return $sql;& b0 i! p3 a/ F% |" }5 A9 P
    }
, I0 R8 [- |! C1 U/ J: |
' O- e" n! D6 c; c/ u! }% W! \; x总结:& b0 b- J+ T7 ?+ j5 U2 I# l* {
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查! o& n/ G, G/ q2 N
不建议直接用$_GET,$_POST! c2 T( M( l8 w! a/ p- j
[/td][/tr]
: r7 g% e! l) L" f[/table]+1/ |: v9 W" A  z2 D4 w9 j
+ l* q/ x; K$ L9 o
6 _# x9 o6 r3 T
回复

使用道具 举报

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

本版积分规则

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