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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。1 A6 ^/ g+ w3 L9 M- A8 U, J- C
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
" }+ {3 h# U/ |/ x+ q$ B& s; F. M& H, E根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)# J7 W1 M# U. L4 n, ^) Y: P. W8 c
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
6 N* \/ b. L" b( ^5 S0 e$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
5 Q, y# S4 \8 I
: t8 @" l7 l( a4 ~. \4 f* E% s 或者
# h! L* Z/ s# x; K& ~( z$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();8 W! F8 X0 Z, H2 x- r  w9 [& `
( ]& X- Z. r8 e& i9 l2 F" p
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):; V6 R" i8 D# T+ g9 i' m
$model->query('select * from user where id=%d and status=%s',$id,$status);
9 B- C2 A0 v& U9 C2 \9 O4 a. V, M1 Q2 Q1 T
或者; D7 ]5 T1 I' ~0 O3 l
$model->query('select * from user where id=%d and status=%s',array($id,$status));5 G) [' g, D+ K# @6 T

4 |& [( N# j6 Q; y" X 原因:3 x3 N/ D8 i7 M8 _2 D1 ?$ C
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
4 @8 [, s3 \. W7 G; `" r: o9 V原函数:4 r% B' |- v6 y
protected function parseSql($sql,$parse) {- a) Z3 `/ U6 \  w
        // 分析表达式
$ w# A" ?" L3 l1 @0 k; Z        if(true === $parse) {$ T4 b/ m; a2 b! H' \! V
            $options =  $this->_parseOptions();4 ^( }( ]* G4 K/ @0 [6 Z
            $sql  =   $this->db->parseSql($sql,$options);4 d5 E$ t3 H' G
        }elseif(is_array($parse)){ // SQL预处理/ B# G3 v' r1 a: B4 x% q, A9 L
            $sql  = vsprintf($sql,$parse);1 h+ P5 g- p$ M' X- |( L" Z
        }else{7 \9 H# u3 h5 e4 z- \: o7 w
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
! r# X! N8 B6 q5 v        }
( _4 B) l' e1 Q        $this->db->setModel($this->name);
( y0 x$ ?( D. f1 U& N3 f3 j8 g        return $sql;
1 Z7 e4 S# t* [# J    }) W9 ?; v# Y, c/ Z! I. V

( S2 D7 L, O; j4 Q# l验证漏洞(举例):
# P1 h1 ~( D5 v. c请求地址:
* @9 V- W8 ^+ }) Mhttp://localhost/Main?id=boo” or 1=”1
1 y* @2 b" p, L' e& T# `5 [4 f% `2 g8 J3 n' Z  ?
http://localhost/Main?id=boo%22%20or%201=%221; \3 X( q: X5 V+ ^
action代码:
/ g0 L7 q! Q" G$ ?1 w; N$model=M('Peipeidui');- Y+ P. h' Z- i" q* D
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
- r, S3 m' T) m, ^& D/ `        dump($m);exit;
3 r( m5 ^9 s% o4 P. u  j或者
. Z$ {) n; h4 m7 v& R& }" d$model=M('Peipeidui');
, g$ T+ i3 R( P5 }- _        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));# R# W4 p1 U  k! e
        dump($m);exit;0 q3 g( {# Q7 F' J+ X: Z: L
结果:6 k! c; A8 p3 J9 L  ]
表peipeidui所有数据被列出,SQL注入语句起效.3 O4 `, g% {% o- w( G: F2 [
解决办法:$ e* k+ Z9 r; y2 E8 j5 L
将parseSql函数修改为:
! x7 @( H% k5 Y. K" Z- J8 U! _0 ^protected function parseSql($sql,$parse) {
# L* P8 W* ?) c+ c% s" _- Z* t        // 分析表达式
9 k  c9 }4 x) s7 z+ x3 R        if(true === $parse) {
$ F- f2 ?$ q3 w9 ?" Q. Z3 d" S            $options =  $this->_parseOptions();1 Y2 ^5 O* _, ?+ ]6 Q6 Z
            $sql  =   $this->db->parseSql($sql,$options);  j1 x( @( Y. b4 A9 p
        }elseif(is_array($parse)){ // SQL预处理
6 ^/ i1 E# N6 z1 H8 W" {9 r            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
' F: a$ k1 C2 m  O, m3 O            $sql  = vsprintf($sql,$parse);
% s0 K7 ~: V! |; G* U9 P        }else{  d3 }# G3 a! p; D0 {
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));$ v: n) }( \! P( F/ w; j; V! c
        }$ V0 R6 t6 V7 Y+ t* c' E
        $this->db->setModel($this->name);* ]( z8 o8 X( M( a5 G" i# e  |
        return $sql;! s5 B7 [6 q) O+ V
    }
9 H3 Q5 S; p$ k+ N, u& w9 s+ ?4 i" s' j; H+ `3 m
总结:, y0 a8 E" U* _4 O# O
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
7 f" W  Y* Q, r: J: d; g! e& P1 J不建议直接用$_GET,$_POST
; o+ d% z+ h. X  g4 y5 n  j[/td][/tr]
; J+ `: R! H# B9 G# a+ C[/table]+1
% u. ]& S. |, b$ I9 P7 e( E7 v; ]! v2 k0 h- O4 |
) c- g+ Q2 P# M$ g1 z  v2 m
回复

使用道具 举报

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

本版积分规则

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