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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
6 D4 m) X1 U( h% V% Z( aThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件, P; [: m( V8 j7 @4 p' L: ~
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)) Y" }8 {; Z( E& ]2 M
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
! e  m) L$ {1 z* c$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
; f% x! t$ T4 X! H) e! q( K* n
7 v2 \2 U/ @$ i" M/ V( T8 P 或者, v& ]& q' M; _6 I5 l+ n! V4 N+ \
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();' F" r9 y6 _5 f+ o8 O

; U0 q' C& w9 A7 e9 I 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
8 \9 K- p" B; k$model->query('select * from user where id=%d and status=%s',$id,$status);2 i1 i. e* |' T" p, y/ X- [0 L

) U( l% L  h6 S* b2 w6 H' r7 E" q或者
( j% H4 s4 Z% G, Y2 ?3 p& |- n$model->query('select * from user where id=%d and status=%s',array($id,$status));
- N# U( A/ V3 [% W/ s; u. V4 ]+ o) N1 ^& w+ F* Q
原因:
" H& s+ ]8 n9 ]' AThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.5 G5 [4 T8 n- [2 `5 t7 G
原函数:
% I; t$ m) ]3 o) xprotected function parseSql($sql,$parse) {
8 Q0 V1 p( d8 ?, ~  J. k0 A        // 分析表达式- `1 [( K* y7 M( k- ]6 F& I) E' J
        if(true === $parse) {
' Y3 m0 I- I3 o5 L            $options =  $this->_parseOptions();1 v6 i+ t/ C+ X" q, l6 Z
            $sql  =   $this->db->parseSql($sql,$options);# o3 B# W$ E! ^3 J% E
        }elseif(is_array($parse)){ // SQL预处理
. B0 }, t& O0 m2 u9 R            $sql  = vsprintf($sql,$parse);
% r! T' K3 R9 Q1 H        }else{
+ b: m- ~1 W) F3 _  t            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));9 P0 Y( i& o, a0 D# \& ^
        }
$ X8 F3 f( k: ~- @0 r' t        $this->db->setModel($this->name);) n5 x4 a; N2 Q4 T+ u. @
        return $sql;
  R0 p: _5 }: c: n( U; K/ E    }
: W0 u- j; `6 L. \! l
- E- b3 F; A0 ^$ Q: N# h  c) b验证漏洞(举例):
; H2 ~, _. i! D2 T0 p& J4 Y请求地址:
( O1 `! y) g9 u# m# }http://localhost/Main?id=boo” or 1=”1
7 I* r5 R* o. P' @' f
/ u& K3 I4 {  w) }$ ?, Ohttp://localhost/Main?id=boo%22%20or%201=%2216 g$ G6 G$ o; z5 e/ P$ c: [
action代码:( y$ D& ?  O3 P" j, ^6 q
$model=M('Peipeidui');
9 c2 C' M1 j$ T        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
! y* ?7 R  C: |        dump($m);exit;
# ?3 `  p" S! _" T或者8 i: @; ?& d9 _( m' D
$model=M('Peipeidui');
' `  k7 R; R# Y: k5 J6 I+ d        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));- }% W4 w+ B1 a) {- f$ C, S
        dump($m);exit;3 Y$ A' |  g. B% K/ N3 h( M9 H
结果:
/ g  ^) @( e3 d表peipeidui所有数据被列出,SQL注入语句起效.% _% Z2 L1 f  e: |! q
解决办法:
+ j( d4 e7 w: V; d- x* o将parseSql函数修改为:
5 g: \) z( _$ [; L' Lprotected function parseSql($sql,$parse) {+ C7 W8 T8 t7 ?4 A: D- g% r2 s
        // 分析表达式
7 b; C6 @  B% q        if(true === $parse) {+ ^$ C" ]5 ?% E$ u
            $options =  $this->_parseOptions();: H& ~4 u8 d* Q5 L7 o5 O: n
            $sql  =   $this->db->parseSql($sql,$options);
; ^# H! L6 p9 Z& X+ d; T5 d% w* N$ j1 j        }elseif(is_array($parse)){ // SQL预处理
7 S1 p1 r4 E  D1 X            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码' l; V, [2 y4 T. k
            $sql  = vsprintf($sql,$parse);
! W" D$ b4 p$ H& |% @* l        }else{- m( g) @/ K& Q4 ]9 D
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
' q1 Y  ]' ~3 \. N        }
3 d5 f+ z6 N: d" Q        $this->db->setModel($this->name);" Q' W- i1 c- Z5 C! x
        return $sql;2 d2 H0 ?/ B+ [+ X9 N  T
    }: B& [- [! g- l; m# W# @8 i
' s' u* n# U2 N" h
总结:, F# l: M1 Z- E4 F) v/ b6 F
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
7 [+ w" D9 J" w9 i1 Y0 X! D# [不建议直接用$_GET,$_POST+ {1 y) C( G5 ^; m
[/td][/tr]3 f6 f) w$ J% c! k5 |4 t
[/table]+1, P" v' [; p* G  n: S

$ j# o7 Y, ^: J
, u; r* a3 T  @1 |" H- N
回复

使用道具 举报

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

本版积分规则

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