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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。: u3 b* S+ _7 o& v' }1 g! F
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
1 l% @. |+ A, q, [根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
6 z. a& l8 ~  {6 I$ R8 c! D% g3 k4 s使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
9 M( I, c9 O$ m2 e$ J) A$ ~6 Y$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();4 b: o6 ]5 H& S- x+ P4 |
6 ?% k; n* v4 N2 K7 d) [! g6 q
或者+ X7 O  q# V. Z& D6 ?9 k6 g
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();" P% N# Q$ E: s

7 y: u/ |: y3 ^6 x4 S 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):2 E0 u0 G% o9 {
$model->query('select * from user where id=%d and status=%s',$id,$status);) ?1 o; Q1 M% z+ v6 _/ u+ i6 d: A

, H& }1 }4 r, _  l; N或者
- ^* V* k5 j9 i( e3 I; p$model->query('select * from user where id=%d and status=%s',array($id,$status));
( s$ C/ W! ^" b1 K1 m' X7 H0 }( r0 x* V. G$ C4 P% \9 O* \
原因:
7 F7 o0 j1 J6 b+ V4 e1 D7 k! VThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
* v1 F1 ?1 T. R! w2 D9 n原函数:' K( I2 J9 E9 u: `6 f: Y' b6 ^
protected function parseSql($sql,$parse) {+ [) F8 m7 U2 Y8 O/ }
        // 分析表达式7 }' l& h8 b. t
        if(true === $parse) {
8 t( y; E) h# U9 z8 t* @1 ~/ J            $options =  $this->_parseOptions();
1 e: O  N+ L+ x            $sql  =   $this->db->parseSql($sql,$options);5 ~7 q! _. S1 M$ y& H
        }elseif(is_array($parse)){ // SQL预处理6 w( _. O2 k; E
            $sql  = vsprintf($sql,$parse);
4 J' L' u3 K; Z$ S7 ~: ]        }else{
/ c2 i: g: q+ R. W* L            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));. H% M& ~) ^& Q( M
        }7 y% p. `) @5 M2 Y' p% z$ D; d
        $this->db->setModel($this->name);0 ^# _& x$ `. G3 Y( S
        return $sql;; f, X; F8 L+ z3 T0 `
    }& F/ u% ~+ s& V6 e( u/ L7 a
; H0 s7 \$ _' A2 `
验证漏洞(举例):2 P9 J5 I( A& e* Y4 F' z4 _
请求地址:
4 c' w) Z( {; g9 mhttp://localhost/Main?id=boo” or 1=”1, D+ y3 \( y9 L- ?
1 L6 L& P! g* q- f, \
http://localhost/Main?id=boo%22%20or%201=%221# |+ o3 Y% r) m0 c# x
action代码:
$ U: j. s: z" ]+ s3 w; b$model=M('Peipeidui');- Y: a: x* Q" T& m& F
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
8 R, A5 N8 p  [& S* J        dump($m);exit;: H, f. T+ |; |# p  \6 E: m
或者) q- _- w! T( }3 l5 g
$model=M('Peipeidui');, T+ G: _, s! {+ n' U6 C" B
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
5 t; S9 ?/ i8 W) q: P' R* @, D: p        dump($m);exit;/ z8 P1 ?) `$ N, K$ L
结果:
2 t& a  W6 F& x/ g" F, k表peipeidui所有数据被列出,SQL注入语句起效.0 e2 m# d  V8 C4 s
解决办法:0 \: j+ M! ^4 R: g$ `0 C
将parseSql函数修改为:' `" B. ?, b6 b
protected function parseSql($sql,$parse) {
6 G' t! H3 N7 C. p/ U        // 分析表达式
5 y. G* T4 \8 u" c        if(true === $parse) {
0 |7 }8 g. l8 X; \! y: s8 c% P            $options =  $this->_parseOptions();
& @& H! p  l/ r+ ?9 C, c# b. P            $sql  =   $this->db->parseSql($sql,$options);+ s0 [- p: g$ Z# x
        }elseif(is_array($parse)){ // SQL预处理# |7 z* ]" D  J- V* \2 r! p0 `
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
4 E7 g9 m$ ~9 Y) ^  r7 K            $sql  = vsprintf($sql,$parse);: n: g" E9 Z* E9 [& y0 @
        }else{
: w/ z3 I+ z' w7 D8 i- V2 ^            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));& X% a1 b+ \- l
        }6 N" u& b+ L# B9 X, z* S1 x/ P5 U
        $this->db->setModel($this->name);1 ^3 @& o, s: ], O& U* O
        return $sql;, z0 Y, B6 ?+ N0 G) {
    }
. V: s# i, x+ [1 Z: [: i
8 F, ]0 ]# n/ D. ]) P总结:
; X& E% k6 a& }% i* }不要过分依赖TP的底层SQL过滤,程序员要做好安全检查4 j8 }6 o9 }1 A0 e1 S7 P
不建议直接用$_GET,$_POST
( f/ j8 a% l+ j[/td][/tr]7 w& O# d/ ^& J2 R$ S( Q0 P
[/table]+1; s. V, g' ~$ B: e
5 ?# w" Q/ q; r+ a. e; ~9 O. w

8 N4 `6 D: f$ \
回复

使用道具 举报

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

本版积分规则

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