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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。) \3 x1 V; r$ D; e7 X* X8 a
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件3 w5 _" A1 \7 `) a2 z6 W
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
4 t# G! g$ L" @- `0 R# U' N2 s使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:, r- ~! l4 Y1 ^# F
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();# Y. D2 }8 O# W6 G9 k
$ }8 Z* G8 f4 u8 W
或者# K" B% Q# O7 s( @, w  k0 [
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
0 U/ P) P, y, n+ h8 A9 x7 Q
6 _0 B/ O3 t9 f, X( W 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
" w8 G6 W) n' A4 _' ?" `, t* }$model->query('select * from user where id=%d and status=%s',$id,$status);
1 u% [0 a8 J4 K* x4 }2 M$ |
( W. m2 b- b+ Q2 ]或者
# |/ Z- e: Y8 W" U) C$model->query('select * from user where id=%d and status=%s',array($id,$status));$ C, o8 L( v$ I7 |  P/ y9 n
8 @" a* ~& G9 s
原因:
- G  ^7 }  V/ zThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
  e& n6 f- [( a  a  a原函数:
2 h  [& U4 r: t: Y2 I- k8 kprotected function parseSql($sql,$parse) {+ s7 s3 E8 o! t3 v* q6 `
        // 分析表达式
+ }# ^& b' F- ?- q5 \9 d8 v9 o        if(true === $parse) {- K6 H% Z' n/ X& f+ e' y, Z
            $options =  $this->_parseOptions();# s+ G& B3 |4 s1 F2 T
            $sql  =   $this->db->parseSql($sql,$options);
7 F% o0 {( y, [8 O1 q        }elseif(is_array($parse)){ // SQL预处理
: f/ R: W( Q% U            $sql  = vsprintf($sql,$parse);, D3 B6 R" }( @1 t  @
        }else{
- A7 E  L6 Y1 E. u( ]+ i6 J, U            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));9 v# M5 g% t6 X
        }
' H. Q! K0 {7 D* R        $this->db->setModel($this->name);1 f2 g  E& j$ n" G0 ]
        return $sql;
9 u3 ]5 U/ s; [1 U" Y% C- K    }7 O1 `4 d$ n; A% y( {
6 \7 n0 @& K# Y9 ]
验证漏洞(举例):; T1 Z; I% O+ Z; v$ O1 W3 o; }
请求地址:# ^! [+ D5 X6 a9 k) J2 t. H2 \
http://localhost/Main?id=boo” or 1=”1
1 c0 a4 w3 s5 V0 e* w) p) s
4 ^, ^9 A  `8 ^- W7 G9 phttp://localhost/Main?id=boo%22%20or%201=%221( u8 Z  l  e; m
action代码:. V% ?( W0 ?- s0 }/ E
$model=M('Peipeidui');
: {" i  N8 I$ M        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);- V8 w& e& ]; b: K+ w8 G: ]  B) T  B
        dump($m);exit;. C$ G5 v( Z9 E+ C( e# }2 w7 c/ E- c
或者" g( [& y* b* M  [, c
$model=M('Peipeidui');" r4 [9 l: W5 y# b" y' Y
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));) L, ^$ W2 n+ E: L. G  I5 ]
        dump($m);exit;% j% r9 m- T4 l
结果:
! g6 s1 q9 p" C) a& Q2 Q; b  c2 U表peipeidui所有数据被列出,SQL注入语句起效.
% ^& U4 H3 K) G1 _' o) E% ?解决办法:
# e1 Q. X- O8 Z9 D! h! d将parseSql函数修改为:
5 v6 y$ d8 Z; X( K9 ?protected function parseSql($sql,$parse) {
$ E8 i7 y- [, N, _        // 分析表达式% X: p7 a! D7 p. e. }
        if(true === $parse) {  J# o! ^" N; K4 m, `
            $options =  $this->_parseOptions();
$ P. ?# H4 v$ Q# b' c/ l. D; P; Y) z            $sql  =   $this->db->parseSql($sql,$options);: `+ j$ f# X, x9 H' W' x+ T- E
        }elseif(is_array($parse)){ // SQL预处理1 X& A/ g+ L4 [
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码! \3 u  \2 ~4 h: B0 \7 D( e. T* S
            $sql  = vsprintf($sql,$parse);! s. R$ R: |. u5 G9 h1 I, {
        }else{+ ]) H# e& R9 `; ^2 b
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));: `, e6 J8 E' z& ^  d. }  ~. {
        }
' d4 ^3 i* s7 o4 _' n  Q        $this->db->setModel($this->name);
$ r; ?1 w% h6 T, T) b        return $sql;
8 b9 z1 i3 r/ w2 M+ P- z  p/ E/ [    }2 B) R( P( x7 J% h# l. c/ M
% h/ T+ P- q( O4 j! S+ |
总结:' \; G2 y$ z+ m1 I6 Y2 X
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
) x% z6 d  \4 z( E. g不建议直接用$_GET,$_POST
  a! Q- ]% w) i" X3 e) Z! s. H$ q[/td][/tr]
# q( I* q3 F- U# s[/table]+1
# m7 ~; G6 U; @' L. U
* m0 r5 j: |9 P. W0 c
( o5 ~. B+ k; q4 V" k
回复

使用道具 举报

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

本版积分规则

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