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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
5 g, \& o6 `  B4 i, S% bThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
; O2 z+ C$ E" o  z根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)& w6 u% O8 X8 [+ ]
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:% s# a. B4 F4 X! P: u: _4 q
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
7 U( m) Y9 L. Y5 p) M* E1 C7 C* J# h7 H4 O7 m- Y
或者0 h- n+ @$ ~0 G, C- |+ s6 Q
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
$ ?. \3 z0 h" |) z6 e& r+ b1 X' K! w
( t# [# g  C# B; ^) H 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
, w& K) y) w! T& e# y$model->query('select * from user where id=%d and status=%s',$id,$status);9 z9 q6 t) J8 m( u- r
5 a0 {/ |+ k. n( q8 u2 t
或者. }! P, Y2 h2 v% c1 m4 _
$model->query('select * from user where id=%d and status=%s',array($id,$status));
9 [8 I5 M9 l# X4 b( x( G0 C; |3 t' k) H; o) t+ |- i
原因:, L5 Y0 q! j3 s7 D) ^9 i! ?3 B
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
) D( P+ ~* q* _1 R9 A+ f* [原函数:
4 T+ `9 v5 s% r2 R2 C5 w# @protected function parseSql($sql,$parse) {  D% A# Z/ G; W7 B5 h2 [; ?& `
        // 分析表达式
$ J# W7 D# Q: G/ j! ?. s2 C        if(true === $parse) {
$ y  k, N0 `  O; A7 n            $options =  $this->_parseOptions();
, B7 s/ L# Q4 k2 d3 p. Q            $sql  =   $this->db->parseSql($sql,$options);$ Y7 R1 f5 R3 P8 L" I" K3 p9 L
        }elseif(is_array($parse)){ // SQL预处理) H- {) [% m7 D8 o; F' M& t
            $sql  = vsprintf($sql,$parse);' [; M, j7 ], S& U6 U% U7 B
        }else{
* u- {# A7 I. ^0 d0 `$ X3 h            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
6 k) U  l8 ?- U        }0 C& o7 F7 |- U. A3 y2 o
        $this->db->setModel($this->name);) i6 L  j  A2 e  d: }( f
        return $sql;9 @" X9 Z0 V; Y
    }, p9 z, V; v$ B8 s/ u" g5 i( M8 i5 @
  l1 o; k/ _. P, w6 d9 v
验证漏洞(举例):7 W$ Y  q/ r5 N" V6 P7 {
请求地址:) ]9 m9 c" d- F& Y4 F
http://localhost/Main?id=boo” or 1=”1. _7 g8 {9 B& S+ J8 M
1 R# B" X- R4 G
http://localhost/Main?id=boo%22%20or%201=%2214 n: _# j! Z$ \. ~: ]3 A; B+ \
action代码:
" K: U9 q8 u2 P9 z  f$model=M('Peipeidui');$ K& R  \- U9 t* R! ~- s0 S8 Q$ c
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
$ ~6 T. n* ^: w5 \: ?: X        dump($m);exit;# E# _8 e: W( `7 o
或者
& b% A. T$ P8 d( x5 o6 |& q# Z$model=M('Peipeidui');5 Y, D: V1 G6 w/ a/ P5 r. I
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
9 b  j% E/ W2 G, h+ Q# f        dump($m);exit;
( G1 V) v: I) G7 }结果:( Z, R1 L5 S1 D/ M! E6 ?
表peipeidui所有数据被列出,SQL注入语句起效.
  T0 U& E/ V- m9 C% i- H解决办法:
- l5 F+ V2 r. B+ N  T将parseSql函数修改为:
3 K+ ^, M8 ]) ^6 F% d7 |protected function parseSql($sql,$parse) {
' z$ Z8 \2 {/ J( C; K/ s        // 分析表达式
( B7 w) t7 h5 }4 q        if(true === $parse) {
& `! M- X0 A/ _+ O3 K            $options =  $this->_parseOptions();9 ~$ {5 W% s, H+ V1 h% N# n: f
            $sql  =   $this->db->parseSql($sql,$options);$ P1 _7 j" [& i" L2 Q$ D& Q
        }elseif(is_array($parse)){ // SQL预处理3 h* M+ J/ f4 L- C; T* m
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码: b5 N6 Q( }4 P3 X
            $sql  = vsprintf($sql,$parse);
( ]2 u' _9 J# w        }else{8 M" |( R& e$ Q" ^9 O3 L2 @
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
, T7 N' C3 \4 D' G        }9 t, u6 [! j" i* H8 F
        $this->db->setModel($this->name);
; _; n5 ?! T  p. Y; C        return $sql;) h1 `# z3 e  S
    }- i+ ?* t- y. V( m+ H
. O$ [8 I$ B! Z2 {
总结:* B  m9 y- e4 L" h
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查& u4 A6 N6 P* \+ ^2 k: }# U. M
不建议直接用$_GET,$_POST7 A2 c: j, c. n! E+ n
[/td][/tr]
# }- H- P& i1 x  L[/table]+1
: _( L/ y; E9 k$ L  s) b; ~  ?) m# ^# A. R( M
4 r: S1 t0 g% D) Y3 o/ \
回复

使用道具 举报

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

本版积分规则

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