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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。# p5 c1 o) m4 G- _5 p" P) n8 c: n
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
2 `; T0 i7 Q% i" s根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
3 N/ A4 ~' R5 U使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
* ?! K) ?, U2 T3 W+ p7 n( }2 C$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();( t; ~0 x' I: m) J# O) @

& `5 C5 Q# q6 T 或者  v5 j) o$ t) V: x
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();& Q- V2 C; H: `# k+ j& W5 T
# i8 V" b8 b4 u; ]8 `8 A4 @
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
  d0 i" m2 }. Q+ y# Z( Y. ~8 A$model->query('select * from user where id=%d and status=%s',$id,$status);7 S$ S: E: A1 T: s+ M3 l) X

! W1 a5 }; U( Q% m+ B. H% {+ ?3 @或者
3 Z# x, J5 A- w! F; j# K$model->query('select * from user where id=%d and status=%s',array($id,$status));
' {  ]1 \+ \2 k6 c. U% e) t
+ x; H$ a! R8 ~8 \( x* T  S& T, D* t8 E- j 原因:' |' e1 E/ h# {/ H. g) F
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
# D& Y0 _3 z2 `0 N原函数:
) J$ |$ ~2 e+ i' X) z/ ^protected function parseSql($sql,$parse) {
, g$ P3 I# d! |4 @% I$ ?3 v4 h        // 分析表达式
' z/ H# N2 d! g( b: z, n! z0 D% J; W        if(true === $parse) {1 ?; G8 h% j$ H7 m* ]
            $options =  $this->_parseOptions();/ i5 `" c; B# ?# F/ ~- d
            $sql  =   $this->db->parseSql($sql,$options);
' N* S% F, `& A) J5 p( L        }elseif(is_array($parse)){ // SQL预处理
+ {/ }* d! D8 ?- y9 x            $sql  = vsprintf($sql,$parse);( a1 \8 S$ {! q" Y
        }else{
; I7 j7 T# ~' H, e) L+ w- D            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));9 U1 G5 Q4 d4 e# P& F: H
        }
2 {5 Y" K, _0 x) r6 C: J3 t0 A        $this->db->setModel($this->name);
! E# |8 Z7 I1 F8 {& E( i4 Q7 a3 U        return $sql;
. [1 p# B( g* T' b4 f    }
4 }% i! O+ j3 S4 t
" Y! l8 [! G7 J/ W验证漏洞(举例):
. W+ K' h1 X4 X. a( m请求地址:, A) r8 f- R+ a  b; c
http://localhost/Main?id=boo” or 1=”17 W+ Q) L) e6 [9 J6 T: U2 U

- I7 ^$ x" u& b4 w/ n8 s* s8 ohttp://localhost/Main?id=boo%22%20or%201=%221
# ?' `! H0 R3 I0 b9 f* Y/ Eaction代码:
6 l' W7 D1 g! a/ c2 `- r' D$model=M('Peipeidui');
# b8 r$ C4 N2 Z9 R9 u5 c        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);' l3 h5 }  b- J- A2 S+ y5 I1 r; l
        dump($m);exit;
6 S. H! j& h6 E7 ?- [4 G8 l或者4 Q! V; a2 N3 o: |
$model=M('Peipeidui');
3 ?- j1 b- M0 i& H9 V# ^        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));. g" ?1 m& ~; Y5 X
        dump($m);exit;
8 ^, w7 r3 q' @! W2 s结果:
. U, u" p- a) |- p) z2 o表peipeidui所有数据被列出,SQL注入语句起效.- Q7 p; D/ n- Y2 V0 l% p
解决办法:
4 A; j% i% w& `: [$ u/ e: `8 Z将parseSql函数修改为:. y+ f* o4 j: I- v5 z4 r
protected function parseSql($sql,$parse) {
! J  J5 O# E8 O& V- \( y        // 分析表达式" P- y+ p4 K. s* Z* o
        if(true === $parse) {
* k+ w+ b& c/ q' e9 t  {* F* x            $options =  $this->_parseOptions();8 B& z1 W/ u3 ?$ x' S3 E: W1 S
            $sql  =   $this->db->parseSql($sql,$options);
2 d4 C8 e9 n- A7 }$ |4 ]        }elseif(is_array($parse)){ // SQL预处理
/ G7 \" @* n- f            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码6 r. N& |: G* `0 p" M% _
            $sql  = vsprintf($sql,$parse);
& k9 O! }3 r' W1 v        }else{& p+ U* \- H9 I9 y, G7 X
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));) k' c+ g1 G  ]% n( Q) T
        }
  v' c8 W5 ^$ k: f, P: O        $this->db->setModel($this->name);
/ [" a! ~. r+ j1 W( ]        return $sql;
' ~: o$ M# }: [7 c; F$ t    }* J, |0 x- D7 x; l' e. ]) f
. `) B! g$ m3 u, t8 d  z0 h
总结:4 C, L! o/ H, n* _) {  z* @
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
3 Y. j& c! d3 L* C- a; {' c3 ]不建议直接用$_GET,$_POST8 r( V4 h+ C1 k
[/td][/tr]
9 `8 V0 j; r) ?[/table]+1- S; H4 |, b8 B% z* l+ i; C

3 d: V6 L  |$ @) m0 y! Y/ X) {0 |" E; z1 V6 F7 [# r
回复

使用道具 举报

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

本版积分规则

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