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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
  R! i6 x& g" S( x  i/ h$ Z0 jThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
* Z: U% {1 ~, J8 ~% |根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)  a4 E0 W" _0 Q. ]/ V
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:, S; l# X9 @# Z) d: d, \9 |
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
& w. O0 [  Y: u- \6 Z# X) ]7 o3 _
8 E" M3 n9 p+ j* U 或者
- r1 E- M7 r/ r6 v+ Z( J$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();3 [# Q- `- k) G

: ^9 A: }, M- y5 w. O8 t# L: ` 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):
  L, w) z5 ]% C$model->query('select * from user where id=%d and status=%s',$id,$status);  T, `& E- _# J1 a! j" m& R$ ]

! O* {9 G2 k. K) B3 m或者* Z6 ]7 G! n4 _* G& Z; L, ]! r! Z' n
$model->query('select * from user where id=%d and status=%s',array($id,$status));6 X4 T! a1 b/ f) R8 X" ^$ M
4 N; c$ y$ r- M) d2 r
原因:
  k9 l# ?- T3 L2 V6 RThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
4 @) Y- r9 \) u; ~" `! f- K原函数:7 _5 e3 ~: K( w. ^( F2 r5 G
protected function parseSql($sql,$parse) {$ @$ W4 j( z0 T( B) H4 z; u
        // 分析表达式
; _  y; z- U: e5 o0 H5 A; D6 M, ^        if(true === $parse) {# b7 z+ \" J6 L3 U. H4 ^5 u
            $options =  $this->_parseOptions();
/ X8 J/ g5 ~4 [) B" Y" H0 q            $sql  =   $this->db->parseSql($sql,$options);
- n3 Y5 F" f9 h3 n' T* \        }elseif(is_array($parse)){ // SQL预处理
; W! a  ^( `$ j0 |6 V7 Q            $sql  = vsprintf($sql,$parse);" y2 I: G2 |. c3 g  J2 D* Z/ u5 o
        }else{1 j$ C' a& c$ z( d: i, C
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));3 ~/ ]" i+ @- z: e/ y0 a) ]
        }
" H1 ~& ?! y+ x3 e7 d        $this->db->setModel($this->name);$ |# R, v9 h$ d# Z% I- P. ?: `
        return $sql;, }+ S- g5 r' I$ X" q0 t+ ~0 `
    }( x, z3 ?% ?0 ]6 o

/ r& |) u# O2 U% h# @8 T验证漏洞(举例):& v+ H' T; Y1 H7 }
请求地址:$ a+ R6 b- B% c& l& G4 p
http://localhost/Main?id=boo” or 1=”1
. w) h! `* E* j; N- ]
) ?) |! O  V1 k* w7 w+ ~5 |" chttp://localhost/Main?id=boo%22%20or%201=%221+ a5 A9 x! I( p1 x  {# L
action代码:5 V6 I$ L+ C" l+ F
$model=M('Peipeidui');
0 N1 y# N& Y; p  X/ {" L        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);
9 [7 O2 n. N; I        dump($m);exit;
5 s; q+ c- t( J6 z3 Y或者
# I& Q) }# h/ O9 r$model=M('Peipeidui');
& t& X8 m. d. B" c        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));1 J* Y7 ?5 P* l# x
        dump($m);exit;1 H* D! n8 A$ c! c) n
结果:% Z9 E- o5 L$ N4 ]
表peipeidui所有数据被列出,SQL注入语句起效.- a, O* _2 ]* A0 `
解决办法:1 U' f4 E# s! C3 Q# H( l9 ~' L8 F
将parseSql函数修改为:
, [  r0 v6 e6 ?4 ^2 Uprotected function parseSql($sql,$parse) {
5 g9 C0 W% _$ ~: J: J        // 分析表达式
" i# I, v: |# t, n" |        if(true === $parse) {/ A  I* c; a& Q0 t
            $options =  $this->_parseOptions();
4 ^" R4 ^6 q2 u: N3 o2 w            $sql  =   $this->db->parseSql($sql,$options);
$ W% A- i' T" t& m1 p3 M/ B% {8 `        }elseif(is_array($parse)){ // SQL预处理. {4 C. w+ }# C0 P# }# c# f
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码( V# B& I4 o! {! g& Y( G
            $sql  = vsprintf($sql,$parse);+ y1 F( W' C  \  W
        }else{7 H8 h$ o- I& ?% k8 z2 K+ N
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));0 p) x2 A6 y8 P0 y+ ~( `; b5 Q
        }( I. {! A9 Y. O% Y3 e
        $this->db->setModel($this->name);+ `6 x: T; [5 A. @% I# E; Z
        return $sql;
( s- D; P4 h$ }8 r% A    }( }" y+ B& R( H) @: @, \2 S

; @# l2 _5 y  ]- |, y& V: D- h4 h) X总结:
6 j, m* u" k" `' c# G: T8 \不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
' q2 v: R$ g5 e3 h不建议直接用$_GET,$_POST
& G5 |" J% E# ^) Y  \' w" L3 x[/td][/tr]) f9 T5 r; j7 @5 Q, i7 V" f3 k, O* Q
[/table]+1+ F* N* B# R6 p: Z1 G

+ k- m) ~: E/ K) N/ M9 s7 r4 N: c4 ~. t. {2 ^# Y7 ^
回复

使用道具 举报

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

本版积分规则

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