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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
! |2 v; b4 @7 I% m  i$ |" IThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件" _" U; O0 [0 F2 y& a2 b7 W
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
; V; [- A& B9 ]# \- M; [6 V/ n使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
# I7 R0 e' {: n) O% k$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();- E/ Y. J" ?9 ^6 n
2 ?* L; k- P5 G6 i, h' m
或者% v  I. [5 E) F. b( {# M
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
5 e2 R  S$ |1 c4 D
6 A. `9 t' F; e5 Y8 Q9 ^! X0 n 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
! M) D& F1 f3 i7 \3 l$model->query('select * from user where id=%d and status=%s',$id,$status);
* w) W: Z7 M1 k' w% B$ |2 N. h1 x
( T& }; S! v+ p) @7 M或者
% ], B/ x2 O2 h8 g# B6 b$model->query('select * from user where id=%d and status=%s',array($id,$status));) i9 M' L# ~1 P9 t* H- n* A

' G# N, ~  D% N 原因:
- j# J( I9 D" ^6 Z) TThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.  W% A# w/ ]- S$ n$ D
原函数:. ?# e# J- y4 `3 g! y2 H- j! L
protected function parseSql($sql,$parse) {
% r' q; b- P" E9 o2 @% f        // 分析表达式
+ [2 Y- @, V: K! E, B/ A$ @        if(true === $parse) {3 h" c7 \. {, I1 g5 s' \$ L
            $options =  $this->_parseOptions();
; ?# Z2 f" t0 {! g/ w' }* B2 B0 u            $sql  =   $this->db->parseSql($sql,$options);9 H) F) M/ v7 R  v- \6 W8 n
        }elseif(is_array($parse)){ // SQL预处理
- h% T: {9 L* a            $sql  = vsprintf($sql,$parse);
6 a8 l5 _3 ?4 c0 V" M& p( \        }else{
# }: ~: k( P$ T/ z% _" F            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
- |2 F, L; I$ ?0 I! [        }
3 E: S, l' n. W, [  d. M$ n        $this->db->setModel($this->name);$ A( ^7 y: n( v7 S" {8 E* c
        return $sql;
* I, e+ ~3 l& Q/ \    }9 {1 y2 z& ]6 B( ]; p9 |3 p# s
# C& z$ R3 q1 T( r: i
验证漏洞(举例):
' E& {0 {3 ^# F+ x; ^! {4 F3 a% w请求地址:
; R! t/ }; I, G- ^6 f* \% Qhttp://localhost/Main?id=boo” or 1=”1
: T- {! z+ Y2 d3 z. `- o1 z或
# _( m; z5 v) A/ ?4 Thttp://localhost/Main?id=boo%22%20or%201=%221
' R% m% |# ~9 D1 B- ?action代码:
5 a# f/ ]9 N7 [6 w$model=M('Peipeidui');
4 Q9 Z0 O! S4 [8 p* a0 O        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);! l2 a5 m1 Q$ h" T
        dump($m);exit;
2 V1 Y7 a: T, o" Q或者
) A& b$ O, K2 z7 x6 m! J$model=M('Peipeidui');
; f& z7 H4 B" z7 o        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
; s. Z; k3 T$ Z" ]8 Q7 Z        dump($m);exit;
2 _* ]3 u4 ^# ^& ]0 e- ]结果:1 l2 T8 x8 Y$ [
表peipeidui所有数据被列出,SQL注入语句起效.
2 ~- A; \" S+ q: D& y  P解决办法:$ E- B' E5 D9 u4 E) `( h$ U
将parseSql函数修改为:
2 {8 j3 A' B0 W" G9 i6 X  [protected function parseSql($sql,$parse) {
5 c4 V( H* R& j$ U+ M) W  _+ C        // 分析表达式
. k. M" g& l. o        if(true === $parse) {- q% r9 a2 a' W
            $options =  $this->_parseOptions();1 Y9 X  h5 H2 `2 c" F" v
            $sql  =   $this->db->parseSql($sql,$options);
) x/ X* b6 l! J% `$ o        }elseif(is_array($parse)){ // SQL预处理& k9 _( G( w  R* ]
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
& Y2 p1 t- [5 [1 @' ^8 \8 i5 M            $sql  = vsprintf($sql,$parse);
; a; z$ N5 B) F& T" b, H7 l/ r        }else{
6 J$ Q  G( u. v- @0 i) y            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
5 @" o) X7 K! ?# Z5 _' b9 N4 F4 a        }
4 e" t: v  T% ~        $this->db->setModel($this->name);7 k* R( E0 f9 l( F- i; ]
        return $sql;
" b3 ]; j" S- d6 j4 O* o3 t, {    }
% }/ p# j. p" T% z: P5 k! A9 I+ ~- r( n. d* w3 r/ z0 Q2 F
总结:; W  w1 h4 H2 [/ Q, W. g
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
% y( E) ~* q$ }9 j  v0 t不建议直接用$_GET,$_POST
7 E9 d; ^$ C9 p! g- o$ B[/td][/tr]
) r, J. t9 t+ m[/table]+1
  g3 u9 X6 Q' h1 \8 o/ }
; C' o% ~: O# a8 g# s+ v' m
; P2 Q; n. D2 f. k: N& ~9 z( w
回复

使用道具 举报

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

本版积分规则

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