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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
& \" f% |& a! UThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件" w( b3 r5 o& _  `2 I- e
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
9 S! i8 Z0 }/ f8 L6 Q5 C/ q) C使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
& H* f/ U& f$ }0 n1 h1 E- S- ?$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
9 I- z  b7 X. g; X6 C  U% k& Z4 w4 E% ?7 O1 ]
或者
# C7 \+ y0 p; P) r  j( U$ r5 z$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
9 W8 h' h" H. Y
# a5 @7 x( p" q 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):: y' x  A2 I- {2 k2 j" m) {
$model->query('select * from user where id=%d and status=%s',$id,$status);' V3 n. f, b1 ~* `: W1 Y: }( r, c

! e3 M. N9 j7 e  d: d' P1 r或者  h' ^5 Z! g" F: Q; w
$model->query('select * from user where id=%d and status=%s',array($id,$status));7 u9 j6 K5 b/ ]8 v* k! F

8 K! i) F8 ^0 ] 原因:8 c/ J. i( ^. ]3 k, j
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.) l: Y- O( ~/ G* F* Y5 ?1 P7 i  n
原函数:4 ?3 l: Y( m  [
protected function parseSql($sql,$parse) {
2 i" h2 E/ I0 E9 r        // 分析表达式
: q% M4 Q/ m9 {. a# ~8 [        if(true === $parse) {- P- Q/ E# W; p8 J, Y, S- o3 G1 \
            $options =  $this->_parseOptions();8 B0 W& z8 g: V8 c& r( l- c4 ~( _
            $sql  =   $this->db->parseSql($sql,$options);" n0 u, [. |$ a1 [
        }elseif(is_array($parse)){ // SQL预处理' B3 v" `! c: m& L2 e# [
            $sql  = vsprintf($sql,$parse);
7 x9 S+ B. x. L3 d4 R8 N        }else{
- Q. @: F0 \# Y4 |( K9 _9 Y# R0 F            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
) C+ X  ^* @7 z0 o, ~0 s        }
$ k! p: f6 d7 a- H, ?2 l2 b! C. o        $this->db->setModel($this->name);
7 ~% X5 V2 v: [        return $sql;, A( p1 G0 X, b- G
    }: k4 F- t! w+ u( a1 x% T

  K& [) P9 s% n: A验证漏洞(举例):
% [- d# a% g8 _/ ^; G, Q请求地址:- \, B/ U  n& ]% t& h& _) l
http://localhost/Main?id=boo” or 1=”1( x! d# c0 d9 d0 U
  {) E/ d$ D4 l& x6 t( G& [
http://localhost/Main?id=boo%22%20or%201=%221
3 b4 u1 h7 ^$ Y* saction代码:# U; l# g" S  j- Z' ~: `
$model=M('Peipeidui');
0 x) k9 t- z- p) b0 L/ d5 m) d        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);! m& ?, u/ p7 o9 l+ _! I$ g6 {- @8 `
        dump($m);exit;
2 ]) N8 a) _  H; H0 y或者
* Z* r# n$ c3 {( S* u$model=M('Peipeidui');2 n( d1 D1 i/ T4 F5 x
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
. Z$ `3 Z! x# A7 T  L9 m. b8 s        dump($m);exit;3 M- X& A$ u! H$ {1 \& R4 w. J
结果:
! [' }! v( n' G4 K' ]0 ^表peipeidui所有数据被列出,SQL注入语句起效.
2 {7 c; [9 O  g2 A  f1 l( _解决办法:/ a& m/ g) [$ u6 X7 P
将parseSql函数修改为:
& ?3 |0 B- |: E6 \* E9 Rprotected function parseSql($sql,$parse) {
" P* |* y. e1 q5 d- G) J8 j; u        // 分析表达式; F( i$ k- m  u9 u, ~' h
        if(true === $parse) {
, Y* r- Y, G- v3 Q            $options =  $this->_parseOptions();& w5 p, O4 `% D0 Q" V
            $sql  =   $this->db->parseSql($sql,$options);8 |* }7 J) ~" ^& b1 K5 ?
        }elseif(is_array($parse)){ // SQL预处理
: \: d% S0 L" {- \4 Z0 @7 x            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码5 ]) l# j! }" X# v( {9 u
            $sql  = vsprintf($sql,$parse);
2 h* t" n' s1 L) o! A$ }        }else{
* r( V: l" a- c; r            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
: G  o8 O2 _4 E" w        }3 s* d* e/ a* h5 _" [
        $this->db->setModel($this->name);
* ~' Q2 a/ G& N& P6 e( K        return $sql;
* P0 e1 m1 p! l( L& m+ b. T8 s    }
! x" h& m# D' s& T. r: E7 A8 e( s6 `* R; U9 l) F  _7 q  ]
总结:
. H4 }6 X$ I, l7 H( i& O" |0 Z不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
! X& U/ N) A+ n9 }+ ?' m+ f8 ~不建议直接用$_GET,$_POST/ I7 _1 e. N  D7 B) v4 B
[/td][/tr]
# w& m! K8 V, `) K+ e$ a0 N& T! z[/table]+1
% ^7 b, M% o/ l6 H, ~  z, F: Y* E+ s, x: @' j
% ^0 l5 L' t0 q2 b9 [2 G+ m  L
回复

使用道具 举报

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

本版积分规则

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