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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
# X3 V2 X8 D' L+ oThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
- Y3 a- G- j* B% z  s" {根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
$ C! U0 e8 `" v) ~3 g( y使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:, f1 m& g( \$ R( \) H( J: S
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();# U- k/ z9 Q' x! D- E

& l' ?" g% s5 x9 N( g& ~2 O 或者
% Y% @  U' {8 B9 v2 g$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();9 `7 p' m$ E! G6 `4 C- \

( R6 M+ E2 O6 {/ D1 j 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):/ b2 F8 B3 b: v: w$ S) `* }9 G1 l
$model->query('select * from user where id=%d and status=%s',$id,$status);! W) j0 V* v& H3 `  [

5 g3 S% b0 c$ z. b, z! ]或者% }$ G# Y0 Q% h) ]
$model->query('select * from user where id=%d and status=%s',array($id,$status));
% ?8 I8 b: y2 d9 A' Z9 S: d6 O+ I+ h! V. A
原因:% k5 t% D. Y' U6 p9 `9 _
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
6 t# A  q/ m( r: g% m5 R' A原函数:" d" |* W2 A- N# N
protected function parseSql($sql,$parse) {2 m* ~  j7 N7 |/ ~) R" W
        // 分析表达式. e2 V9 g0 {/ L2 }' u- F
        if(true === $parse) {
+ y. z( U7 W0 J+ \            $options =  $this->_parseOptions();
9 `) w1 w! h1 s0 w/ ~7 R            $sql  =   $this->db->parseSql($sql,$options);
3 w4 ?- ^  u6 B* |: L        }elseif(is_array($parse)){ // SQL预处理- Q9 Q3 g3 p6 F  ^* F
            $sql  = vsprintf($sql,$parse);+ H% Y4 {0 N  ~
        }else{
9 U! _* k3 ^" C6 J& B2 r            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
' ~' A/ p  u. ?( S        }
4 I* {0 g2 p/ W+ J        $this->db->setModel($this->name);
: R# Y+ @/ ]* ~* {2 k9 k  C" {        return $sql;% |0 X1 X7 w4 v
    }
. m. U) |' i* K; t& |3 L9 P# j# w1 A1 `; _2 n* W
验证漏洞(举例):! e8 s$ G. V# ]) t, p; t3 A
请求地址:
7 E: T4 ]& D5 I4 X, T* Whttp://localhost/Main?id=boo” or 1=”1( l5 {" e! z* t0 \6 L" j
; f+ ~( W+ X" d& c
http://localhost/Main?id=boo%22%20or%201=%221
' z; }! p2 d; q) d; `9 [action代码:
" k  D" S6 j/ O, E% a$model=M('Peipeidui');& V% J) R3 C" `+ d( F8 U
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
# A# W; r, V4 ?+ b; x5 o        dump($m);exit;
: X0 ^* j1 R( X* ]  K8 O' N+ P或者
4 @( z/ i* o1 m1 `; _$ d. ~/ h$model=M('Peipeidui');1 ], {: }7 j" K) ?; v( B- ?
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));7 B0 G2 F8 g6 ~6 z- v) N/ g; j$ q
        dump($m);exit;
% u7 r0 J' d6 l: _. m8 k/ [/ O结果:
) C: \; }, I' K$ x# G! k* n) z表peipeidui所有数据被列出,SQL注入语句起效.
5 ~: s3 T1 R  I( Q6 I- Z; U解决办法:0 e: g, ]$ ^! A$ a) m
将parseSql函数修改为:+ I( T: a3 M4 T* P% w2 M+ m
protected function parseSql($sql,$parse) {
- r( @7 X" W0 B! }! H% n        // 分析表达式% G, z; W; J& @
        if(true === $parse) {
7 q+ v6 t  q  g0 ~- G            $options =  $this->_parseOptions();. Z# W$ Q3 O9 Q& _; Q' N
            $sql  =   $this->db->parseSql($sql,$options);6 q. K! f. y2 r: R5 H( q& X
        }elseif(is_array($parse)){ // SQL预处理
' r5 c) i0 a. Y' b            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
% ^5 t. O- W; C: ?( {' R            $sql  = vsprintf($sql,$parse);
$ S0 ^& F* H! T$ s" @        }else{
+ ~) U4 ^2 c3 G( V% ^7 \            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
8 f' z* ~/ j  u/ g! o+ ~        }9 p4 T" N" w" q: j
        $this->db->setModel($this->name);  L9 D1 E# {  X9 Q! u# n
        return $sql;  E* K! ?( [2 D! n0 S
    }
+ y- c% I  X) T& t% K+ ^8 p2 i* }7 ^" w6 l1 K; d( _3 P4 N6 {
总结:
$ z/ c6 `9 o# j% ~2 E) Z* y不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
1 ~7 n0 w$ F, B8 Q9 o/ A- A* }5 f不建议直接用$_GET,$_POST6 A( T5 q7 E& `  `! a
[/td][/tr]
8 ~5 U3 ?# x, c5 @; v[/table]+1
3 v; y" Y8 @; o) ]
, S* b# W! O/ C2 U  [" T( m) }3 u( x, G8 v
回复

使用道具 举报

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

本版积分规则

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