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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。$ E$ D# y( k# |- \
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件$ X2 S9 j! I7 R4 _3 B" I8 x
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)4 F' A3 Y0 Z4 J8 T# W- T9 A1 l
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:( d% b  l. o0 w
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();& |* ~! ~5 ?* K* I( L% X

$ y; I* \/ D: u& f9 o% X 或者
' \& D' @' @: J- e! V6 H3 r% c$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();5 L. P' o0 X: ]" k1 p
0 U3 a/ Q# e7 Y: R* M% P4 j7 ]- U
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
" Y# I- r8 }6 @- A' d$model->query('select * from user where id=%d and status=%s',$id,$status);3 t" Y! I  h- f6 F: J6 L

! O7 V$ m0 O5 @- S$ {或者
) X( B( v6 z+ |  j7 r8 l' D$model->query('select * from user where id=%d and status=%s',array($id,$status));
8 }+ B: X3 c% |( f+ a" C7 z  Z
, B+ u9 ]0 P4 H" J8 t 原因:
8 x; O( P3 p2 E! G8 X) {6 GThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.% d, W  e% e7 f
原函数:
1 C8 n) R5 [  Z8 wprotected function parseSql($sql,$parse) {- D9 T8 n8 g7 d0 O9 C7 l1 F
        // 分析表达式
% D6 `* L# t$ c4 W# C        if(true === $parse) {
6 z' j+ k2 R$ R! ]: R, Z6 T' r3 b            $options =  $this->_parseOptions();8 d. o0 T& x/ v% Y) L
            $sql  =   $this->db->parseSql($sql,$options);; h1 ~; u: g! f# W+ f8 U
        }elseif(is_array($parse)){ // SQL预处理4 f5 U- U- k7 q5 T2 s0 l) h
            $sql  = vsprintf($sql,$parse);
' y4 m8 h/ m1 m+ d        }else{
- D8 g4 E/ r- D+ t% g% z8 ^& a            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));6 r! A. F0 Y, R' n8 I
        }
* `4 _' `/ F+ ~- y        $this->db->setModel($this->name);, ^/ \( [  c: a, W3 ^! v7 |
        return $sql;* R5 ^  t; \& h! a) `& T2 [% c
    }
2 m- P% |; R4 n6 {
$ R* k+ O# a# g验证漏洞(举例):
3 e* l- P; s1 T' I请求地址:
1 R! M* i' n; @7 uhttp://localhost/Main?id=boo” or 1=”1( l, f, G8 n2 F/ n

" \3 h+ a4 [  Z6 i* h6 X9 T; hhttp://localhost/Main?id=boo%22%20or%201=%221
, {& Y% F" ?  O2 L/ h9 O2 _  H* b' aaction代码:
" q+ e& G  g# {7 B1 z) u0 Z; F$model=M('Peipeidui');
1 x4 X: d% G& E        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);3 G4 P1 e. l% L
        dump($m);exit;
" u& h7 F3 j5 U5 Z& T( q6 v/ K0 o或者
4 ]1 o7 k) f- K  X+ \0 e. _8 c$model=M('Peipeidui');" ^6 {: D1 f# j7 ?1 F$ ^2 t
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
4 D& X6 w6 f& H        dump($m);exit;7 B" E! H% N0 C2 x  F1 h* G
结果:/ ^  \: f3 L* a' ~6 ~
表peipeidui所有数据被列出,SQL注入语句起效.1 I& o# a' o% t4 c! ~
解决办法:/ E2 F7 `; ^9 f  e# r
将parseSql函数修改为:
$ b$ C( t9 o1 ^  R9 Z7 u  Dprotected function parseSql($sql,$parse) {4 I* t4 m; N5 y3 u5 h
        // 分析表达式4 B1 n+ Z# L9 B. b' ~( h/ ~
        if(true === $parse) {
# z; p1 g2 q: n  J1 c# D# Y, g* J            $options =  $this->_parseOptions();% a8 u, X* E7 ]# P' }
            $sql  =   $this->db->parseSql($sql,$options);
# [5 H, N* x6 ?  L        }elseif(is_array($parse)){ // SQL预处理
/ [' a( a% E/ p9 c/ G  C% a            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码5 W. g5 b* A) N, N% W  B% `
            $sql  = vsprintf($sql,$parse);9 F. @$ i: e7 {4 m6 K" T
        }else{1 o: ^# p; w3 g6 F3 t, A" l/ a
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));* O( L9 \/ w; o
        }7 g3 l8 Q$ M/ v
        $this->db->setModel($this->name);2 E' q. T! V+ S- N$ F, |
        return $sql;
$ S7 `4 F' W' m! q; I    }
+ d( `% B" ^4 f5 @
& Q$ t  ^* o) F2 b+ Z2 ~5 o& D总结:
0 _$ ~  j9 b( _4 I6 M7 h! ?不要过分依赖TP的底层SQL过滤,程序员要做好安全检查' B4 D: o* r$ {: l% Q: {$ N0 n
不建议直接用$_GET,$_POST# ~5 q- U; |& j7 V+ Q6 f
[/td][/tr]6 m% {) |5 o# P+ R; k& q- j
[/table]+1) l3 L' C  \7 b* @' i* ?$ m, C( N

" h3 E5 j- U' y+ K' F  p- \1 C, A/ @; a
回复

使用道具 举报

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

本版积分规则

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