找回密码
 立即注册
查看: 2582|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
* v1 t# P- s3 t/ c# |ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件: R2 ]0 A" p6 K' ?+ h/ I3 ^6 b0 U# V" [
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)1 l- C/ }) E$ i9 N6 ~2 P; ?; q
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:1 m5 L9 l: F6 P" q3 [
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();  t" T. B; k+ V$ d% Z& k, H
! [* j" h' _( o* a2 }  H9 n
或者( H/ o! D( k: S$ X" b- i
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();# ^8 [/ a  P# |; w) U% U
# ^+ p2 x& L. Z8 }
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):/ e6 J! x( K7 Z5 H
$model->query('select * from user where id=%d and status=%s',$id,$status);
9 C, d% a& N0 G& L
# J6 o: g& h. y3 ?3 z; M或者' l5 J6 d2 h# O5 P, O9 |9 q- f
$model->query('select * from user where id=%d and status=%s',array($id,$status));
5 Z( Y; X4 [0 n3 {
4 [7 }3 r4 Q/ Z, H% x3 {; H( ? 原因:
: H- L0 Y6 A: b! t$ s9 L$ }ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.7 E4 Y; n, t; x9 x9 z: p
原函数:# N9 P4 R% i9 H* r# @
protected function parseSql($sql,$parse) {
$ Z0 A8 P0 g3 Y! A+ `        // 分析表达式! Q) T/ g1 Y2 j( l9 L. r0 U
        if(true === $parse) {
" [- p+ L& g' K$ h) }            $options =  $this->_parseOptions();8 [! J2 _% ~( K: Y! f) u. @; D
            $sql  =   $this->db->parseSql($sql,$options);2 I& d  q& M: E/ K0 ~9 ~) |
        }elseif(is_array($parse)){ // SQL预处理
2 O& r" i& r7 V. `' ?) \! y' @            $sql  = vsprintf($sql,$parse);
/ y" m" G, X$ m& L! \  d        }else{* r1 f& q# a- Z" C. ]% _
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));8 r0 g7 O# a+ F9 L6 R( X) h4 {
        }
% @9 }2 d! p( `4 t9 T        $this->db->setModel($this->name);
  ?9 a% J) P7 Y# v5 P2 p        return $sql;
9 q* O! J$ c1 f4 h8 Q    }# o* x' l- C1 \9 h+ t/ U3 i

) j0 U6 d4 ?! f: X: q验证漏洞(举例):5 M  y: D) k6 K  K& `/ i* k
请求地址:
% h  C9 D- h) Ehttp://localhost/Main?id=boo” or 1=”1
. u6 P5 R$ Z  }0 o( E0 f
$ D4 j0 f  F9 N2 O* T7 Lhttp://localhost/Main?id=boo%22%20or%201=%221' M) O/ g8 T: e' E0 t, u
action代码:3 X; a4 x2 U% Y0 o/ n# R
$model=M('Peipeidui');# w9 @" n9 V* n6 K3 f# b, U; E
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);# R6 W9 a/ A3 X) t
        dump($m);exit;
: S3 V- z. b' L8 X# `或者
9 w& s: O9 G& j0 i$model=M('Peipeidui');
2 i3 r$ _3 B0 X- H, O. W& P        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
$ v( V- u3 ]$ z( T6 ]+ Q        dump($m);exit;% W+ C# G9 y3 ~: N: d
结果:2 n2 p4 m1 q) Y- v. ?$ ]8 u! n7 {
表peipeidui所有数据被列出,SQL注入语句起效.
9 b6 Q$ U/ ]# h9 C解决办法:
  P. C( W! d; o3 e/ H9 d1 S将parseSql函数修改为:, |) ^. Q' ~; n4 D
protected function parseSql($sql,$parse) {
$ C3 l/ V8 f; X        // 分析表达式% M( G: W; s0 R0 a3 n
        if(true === $parse) {
5 g, N9 E: c: N            $options =  $this->_parseOptions();
- \$ [, v: P& Z5 D  d. U: K+ j2 C3 v            $sql  =   $this->db->parseSql($sql,$options);8 n$ i* o  p/ e, C/ d, v- `
        }elseif(is_array($parse)){ // SQL预处理9 J1 f3 {* J- A) M! B7 H0 J
            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
6 W/ T: D, E- |6 t            $sql  = vsprintf($sql,$parse);
6 s, }" h% T3 |' x) Y" \( Y        }else{
6 t# \) i2 ~* u* m2 n            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));0 x- |5 @2 K8 ?3 W3 b# v
        }# X9 V3 b5 Z3 H5 x
        $this->db->setModel($this->name);
/ |: x6 v: W+ j  m+ K: A# T$ r2 O        return $sql;; d' _4 r4 y9 {! W8 S. t
    }
' {7 B# A, R' g$ K: @& J& ?" N5 O  }% R* J
总结:" Z3 I. O( K9 h. x* R9 O* u
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
. W+ q: Z" _. n* }. \不建议直接用$_GET,$_POST
* v8 y* n! _  L[/td][/tr]
) h( _/ x' g. ]1 E[/table]+1/ j8 P1 m1 B0 F$ ?, ~7 U4 @
/ L8 M$ |& E  I# D* ?

- c% [) n4 R8 K
回复

使用道具 举报

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

本版积分规则

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