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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。) z3 o' q* |8 h1 E) K/ O
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
/ Z4 Z% V' `+ w2 [* E根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)% B9 a* ?7 l7 I8 T8 O* _& Z; n
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
  z" U" ^. N6 S9 Q0 H2 I9 O% U$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
, X/ W3 ?1 n6 w' \% u! `1 h5 L; y/ b  m6 v( j2 R
或者
  v- C* |+ r% m, E$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
: d- D: Y! [; }' J3 \
; d9 h0 b8 {$ K2 f) a8 ^ 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
1 t3 l; Y" P3 ^* C/ o. A$model->query('select * from user where id=%d and status=%s',$id,$status);
7 u* l' z; c' B& D3 p
7 G3 O- p. u  u* H或者- [9 o) T$ o/ l9 r: a
$model->query('select * from user where id=%d and status=%s',array($id,$status));
8 j0 p0 q, x7 c/ J0 _& s, P
. ]+ G& r2 ?; k' E; \, `# G 原因:( o* M2 V# t1 K) v) t9 L1 d4 ^
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤., J2 s4 H, x3 D$ R/ R
原函数:) z8 L$ @3 v1 K& t3 l
protected function parseSql($sql,$parse) {
9 A: g6 A& E" p) `6 s7 U        // 分析表达式0 _) M/ L( \8 R7 U- u
        if(true === $parse) {2 C" S* {) d2 d
            $options =  $this->_parseOptions();6 E) v0 V; r8 x. l1 B/ n. B
            $sql  =   $this->db->parseSql($sql,$options);& u4 s1 U& c0 V& q
        }elseif(is_array($parse)){ // SQL预处理; ^4 R: q% @8 B6 B& q( o  A  b/ K
            $sql  = vsprintf($sql,$parse);  g2 d7 C" C, ]  g8 K
        }else{
8 X& V  d/ e  E0 j  Y$ C* y            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));8 }! b2 T1 {: _. ]0 a. H! W
        }3 `! X% n2 i2 D+ K7 r5 s- l6 J
        $this->db->setModel($this->name);
( |# p! s' e; n' l6 H        return $sql;; @# C2 h6 D- B4 y- e
    }3 D0 p  W) I- Y  e* {

( i9 J" U1 k/ m' }+ g- D5 N验证漏洞(举例):( A& \, ?, |7 M: E# Q& q: p5 g
请求地址:
9 _0 H1 f" H' m2 Q# Q/ vhttp://localhost/Main?id=boo” or 1=”1. Y" G, H4 c6 Q5 \( N
或
/ }4 |* \) M4 T; k) ahttp://localhost/Main?id=boo%22%20or%201=%2216 p9 |( R4 f* A
action代码:: b$ V$ W3 N1 R% B* K8 ?; E4 A2 {
$model=M('Peipeidui');6 I% x" J, F, L0 p
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
& w% ~' R  n) u! D8 W( m        dump($m);exit;2 z/ i7 y) p* F3 X9 u: _; e
或者! z) J' w' H: p$ Q7 k" T; w
$model=M('Peipeidui');
6 Y: r$ i3 c. ]7 c2 r- Y8 N' n% I! h        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
; V7 q) b. t/ u$ `! C" E4 {/ C' v/ D        dump($m);exit;! g9 E) f6 J" ~' Y7 n6 O
结果:
( {: F+ \& }& R表peipeidui所有数据被列出,SQL注入语句起效.
$ v, A0 k) K9 |; ^, `0 Y解决办法:+ h4 U7 x3 f. o
将parseSql函数修改为:& @1 W' v  q4 i. e# G1 x4 t$ x( V
protected function parseSql($sql,$parse) {
$ C& A9 X3 \6 [, f2 [! X" d        // 分析表达式% Y2 @* D+ I  O
        if(true === $parse) {
2 g. k  p! v4 m+ B" n  v            $options =  $this->_parseOptions();9 F* _/ y( G* p& i: Y
            $sql  =   $this->db->parseSql($sql,$options);8 i2 m2 U% r' w: I& `3 {
        }elseif(is_array($parse)){ // SQL预处理
  u+ m0 z" e8 V" [" Y8 C: E. W            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码4 ]- y4 R3 {; s- T8 R" k
            $sql  = vsprintf($sql,$parse);
. C4 v" ?! e8 Z1 N4 P0 X        }else{; ~9 K5 O3 _7 i
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));* }5 h! k5 a/ D$ k
        }6 @. g; d: @" ?3 i
        $this->db->setModel($this->name);# Z+ ?& Y* u- K/ r5 n, O: H- E
        return $sql;( x0 E# O* A6 p' Z/ ^: [
    }, S( V+ V# y4 U* V7 _; Y/ d

% J- r" `8 y: {) [) [; t& l总结:
; f9 ?. _. E+ z5 `不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
" o4 k) e8 b- j/ t" n4 H& i不建议直接用$_GET,$_POST! E# `; `' @1 @( s8 p) L3 b/ [# x& X
[/td][/tr]
5 y9 w, j: n! a# i9 w! K[/table]+1+ U* ~7 P0 F  q* D% i, V
2 T4 {5 B2 k# Y7 v) W/ y- [+ t

" P3 u. p) E) b# v, z
回复

使用道具 举报

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

本版积分规则

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