中国网络渗透测试联盟

标题: ThinkPHP框架通杀所有版本的一个SQL注入漏洞 [打印本页]

作者: admin    时间: 2013-7-27 18:30
标题: ThinkPHP框架通杀所有版本的一个SQL注入漏洞
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。+ F  p( t& Q2 K% k+ r
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件& O: B% o  W% t
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)  _# D7 A% J' [) I; s; {
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:: }* U+ g+ y6 v; r* {  \
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
  y1 ]6 v( ~2 T6 ]4 `* G' r; Q  Y9 ^: R3 |
或者
# J  r- ^0 R% b6 H2 X* V$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
2 F0 ]6 i7 [/ r* v/ I9 ~
9 O# z( W/ l3 C% P9 J. i1 X) ^. {2 V 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
+ l5 H  A3 n, ^, `4 y/ ~$model->query('select * from user where id=%d and status=%s',$id,$status);
; T# z. K1 S8 Q  o  Z. x, ^% z* Q
. a+ g/ y& I/ ?8 ?, U/ A或者
- x$ c' ~; R9 b: P( J; n5 n0 T$model->query('select * from user where id=%d and status=%s',array($id,$status));3 ~1 q. o% V5 n2 h: c$ F6 t

0 \9 V9 @9 P3 [* e/ f' {+ _ 原因:+ p2 {  n9 e; {
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.$ i  Y$ X. K8 R+ i( U# K
原函数:
! t2 C' u8 J7 V% [& Mprotected function parseSql($sql,$parse) {
  `6 b2 q0 \+ }/ Z8 p4 y        // 分析表达式9 O- e$ g( r! c2 M
        if(true === $parse) {
2 W/ x7 V; |! G# G; H4 |+ |            $options =  $this->_parseOptions();
/ k( l+ c1 q& H            $sql  =   $this->db->parseSql($sql,$options);; l! F$ Y, O9 T6 h" ]- P* y; }
        }elseif(is_array($parse)){ // SQL预处理
! W9 p9 h! s9 V/ M            $sql  = vsprintf($sql,$parse);8 Y( l0 ^# h- R6 \5 A
        }else{$ T6 X: C8 u' T. N( ^/ \/ Z
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
! Z+ q. o8 X3 \. z, n        }
7 T, d( K% b* e, }3 q+ U7 |+ W        $this->db->setModel($this->name);$ s6 M% k2 W) Q' l' O9 ]/ P
        return $sql;
6 ]% X& [2 e2 C$ b    }
3 T# k0 S0 }' H, F& D$ B: W9 U5 I2 X( K# G5 `0 W* _4 A
验证漏洞(举例):
) V) D% }+ j+ C- l( G请求地址:
: D7 c( p" G' q6 A) Zhttp://localhost/Main?id=boo” or 1=”1( h* J& Q3 o1 C" O$ u0 X
- R8 O, N1 y/ v' s6 R. I
http://localhost/Main?id=boo%22%20or%201=%221
( |0 E+ `- O2 f$ H$ kaction代码:) J, x+ ^) W3 N3 K8 Y* ~
$model=M('Peipeidui');
5 W; g. M% v* H' z9 L5 \        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);, c& M& q4 a: V0 L- P0 l8 y
        dump($m);exit;
0 @0 X! E6 D% P* h& v" P) W; t或者
7 {! P! t0 p9 m; o$model=M('Peipeidui');
6 S2 O* s1 P3 E( [  b        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
" L# L4 I8 U6 h/ f5 J        dump($m);exit;
! @# `* D; |) V0 j. c5 u7 C3 v结果:6 [) w# `+ I3 Z5 C1 |  R
表peipeidui所有数据被列出,SQL注入语句起效., z& I- v! _. U0 m# x. W$ m
解决办法:# B! c% W7 i5 i; u
将parseSql函数修改为:
- C- M$ K  q' X/ }) M. _protected function parseSql($sql,$parse) {
& N/ A! Z' P! @$ V# z        // 分析表达式8 d% f: _! H+ o7 q* p% B9 X2 J( s
        if(true === $parse) {1 v+ m2 G" G/ j- S2 x; F, s: P
            $options =  $this->_parseOptions();# l4 o7 b4 w) O* v5 Q+ O3 L
            $sql  =   $this->db->parseSql($sql,$options);
7 q# S% @% h+ r        }elseif(is_array($parse)){ // SQL预处理8 A+ m1 P0 f: |' d3 g
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码) v; `$ m7 `/ w: f" C/ H; u. \
            $sql  = vsprintf($sql,$parse);
* j7 a3 m& z5 L2 y+ s        }else{
3 J1 g5 I: @8 b% i4 m3 B3 P            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
+ r8 `. |; A& e$ E! j' z        }  S3 {6 s7 x* Z- Z
        $this->db->setModel($this->name);
7 J' Y% I  |7 x7 N# Y3 n  z! F        return $sql;2 [, C, f  i% `# s
    }2 n0 P- T1 e8 p
( O+ t' ]0 R7 B& P
总结:; ^& \: v( H1 ?# h# g2 f7 H
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查! T/ \/ Q( S2 V& M3 g
不建议直接用$_GET,$_POST1 O# m5 l6 G. ?/ R( _4 P* K! ~
[/td][/tr]! p3 B' s% V+ r, [: h; d3 i8 ?7 @3 l
[/table]+14 B) E# H1 @% W* T
+ }% S$ R0 @" S( k+ m6 L! \

3 S# v: |& [% H




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2