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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。5 A( _7 c# s, }0 D3 a7 @
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
7 V/ H* A" n9 _3 ^# c' v根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
8 d* M, c+ m4 A- ^* s1 d/ ?9 x" h  Q使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
4 z# w2 B  A# `! w$ t1 |( n$ z$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();9 b6 \; j+ i# h3 _
8 a/ B, r2 w7 A
或者" l) i% N* L0 z) j
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
6 v( h$ A4 F. s; p4 y- r- ^
+ Z+ Q4 |3 V9 p2 x1 \ 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):# B1 Z! {8 C$ K* K' k
$model->query('select * from user where id=%d and status=%s',$id,$status);4 p7 S$ D5 @4 N' }5 a
5 d' r, B: Z2 O( k+ V+ h' P) p6 P
或者9 d/ Y: o4 N# f4 S- |
$model->query('select * from user where id=%d and status=%s',array($id,$status));
( g6 ]$ [0 M, l- j! F% ^% H
: r  B8 ]! l+ p+ F0 H 原因:/ x- j+ v: @. a9 g# M
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.# |9 e0 Q5 a- |8 @
原函数:  W' |/ Z: e8 K6 Z! I
protected function parseSql($sql,$parse) {
* ?( L+ c! |9 `" u        // 分析表达式
1 Y, m3 S8 C2 C) |0 J        if(true === $parse) {
2 E9 s. W$ D4 Q& z            $options =  $this->_parseOptions();& G8 |5 d: m- n
            $sql  =   $this->db->parseSql($sql,$options);
  u5 _- t* ~2 b6 ~4 a; a$ i) u        }elseif(is_array($parse)){ // SQL预处理
# R3 H% N# K: W# Y% C% N  f            $sql  = vsprintf($sql,$parse);1 i! E; ^* v4 L* G9 y
        }else{
6 N* r, i+ E; d1 W' P, c) ~5 v  H3 C( n            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));" Y, R! `8 j; n) D2 _
        }
9 E! r: {6 d, V9 ~9 ~( [6 \& @# c        $this->db->setModel($this->name);$ E; t1 y/ L/ g  v# C" ~
        return $sql;
$ w% k9 u$ y9 {# ^4 q( g, ^- g( D. x    }( q. k1 t' ]6 j% w1 Z

/ W* u( ]( ]! {: }) L验证漏洞(举例):
4 ~. ?; _5 Q$ o) ^请求地址:3 G" U/ H9 j' C
http://localhost/Main?id=boo” or 1=”1
; m6 x) o8 e+ N2 d5 q
* B9 X# [1 q- z$ B3 hhttp://localhost/Main?id=boo%22%20or%201=%221( c5 W( r# Z3 O# O5 r$ _1 [
action代码:6 y, K9 A$ a/ u  A: o
$model=M('Peipeidui');: a9 R6 Z) V6 ]" k8 A; L5 ]
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
; L" ]1 k( U) X6 }* \8 l        dump($m);exit;. u/ f! G5 b3 q- s$ E1 W
或者( V- g: p! \5 u: d9 }" d: Z9 ^/ Q0 t$ F
$model=M('Peipeidui');
$ V% t3 y$ Z1 c$ {. \        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));6 p6 l! E8 A8 P$ P0 ^7 I
        dump($m);exit;  r/ ?: t3 K* Y" L/ _7 Z: K$ a
结果:; m# x# Q0 o; U
表peipeidui所有数据被列出,SQL注入语句起效.* y8 g1 e) m6 A8 K$ G
解决办法:4 {, M$ B6 o! n5 |
将parseSql函数修改为:/ n8 R( `7 K3 w6 |( V
protected function parseSql($sql,$parse) {
9 X) L: \, q! L5 F8 c5 t; T. W/ `! a        // 分析表达式! w6 E9 W1 e6 |# b, Q- _
        if(true === $parse) {  E  [! }6 }# Z- ?6 `! [; z( Y
            $options =  $this->_parseOptions();
! `; Z( |( ^' H: [5 J" b            $sql  =   $this->db->parseSql($sql,$options);
/ }. e3 z- a( \8 f$ e        }elseif(is_array($parse)){ // SQL预处理* P, v  @/ g2 x& D  N
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
5 u9 G! d  G% ^9 {2 I            $sql  = vsprintf($sql,$parse);/ L2 y) ~8 m- a% {! ~
        }else{
6 X3 V, _- f  M0 E& x  r7 `+ b# t            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));( ]0 h3 u2 h: m: _
        }8 T1 d7 u9 k7 n8 y/ ?9 h: D( g
        $this->db->setModel($this->name);
( s# y2 z( n9 l# I0 S$ o        return $sql;
( W' |8 E; P' z    }  v/ ?7 B! R$ L" H; J; h. ?
% J3 P5 b6 e/ h& y6 F" C; X" [  Z
总结:2 _" k) u2 t, @; F- w% T
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查4 a- f9 c# P1 ?3 |
不建议直接用$_GET,$_POST
1 G; N& c$ i! o! R0 Y, \; k[/td][/tr]
; V% r8 s. ?1 t7 s7 q2 y$ p[/table]+12 l4 b1 w% J1 U+ t
! E4 A# U9 h' S0 {+ w4 O
" p/ m9 M& m% z. @2 Y5 ]
回复

使用道具 举报

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

本版积分规则

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