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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。4 h! N- b/ v, Q( V3 V
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
/ {* B5 A* H$ _  {3 V" c: w# t: ^: e根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)
1 V$ j2 c% m7 b) @$ i* `, a& Q9 x使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
5 |. }  [; ^. Q4 O, e6 ]# P/ T& O$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();" E! {# }" N" r

" E4 U/ H. Y: [. U- S 或者
. Z) s+ K% d  Z& b9 L( Z$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
$ |( H7 ?8 I+ U# X* x! p. a5 U. T6 I* c2 ^' _( c6 E2 K
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):& Z' O( R/ i  e$ V; Q
$model->query('select * from user where id=%d and status=%s',$id,$status);8 t7 ~% B- V! K  I6 I. h) d
5 Z3 N/ \( U1 }6 @# @
或者
2 p2 y1 g# N/ l$model->query('select * from user where id=%d and status=%s',array($id,$status));$ g* E: I$ R" q) e$ Y5 a* I

. e6 S; m! s! s) ^( E  \0 c 原因:
  X" G8 p( h- ]/ @ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
7 P" w/ X& V  ?" y/ U原函数:
! ?8 A3 M6 t9 Z2 P9 nprotected function parseSql($sql,$parse) {
: M, |: y$ ~" U$ C- J% G. j  Y        // 分析表达式
' @* ?2 ]# L. [& T' {        if(true === $parse) {
7 u' B+ v& m5 \. Y1 l            $options =  $this->_parseOptions();
# t( D; R6 v: Z8 x7 T6 b            $sql  =   $this->db->parseSql($sql,$options);
4 ~6 _( o; e. |        }elseif(is_array($parse)){ // SQL预处理+ D; ?$ w  l  `! ~/ q: B; z" W- w
            $sql  = vsprintf($sql,$parse);8 ^5 T3 U8 W, G) ~0 k7 }) k
        }else{- T: K) l  q; C, Z
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
/ g1 C* @! v& W" a        }
$ X8 e% h! \1 Q$ C+ z1 _        $this->db->setModel($this->name);6 b% B0 W! e1 N3 Z. P% O
        return $sql;" y& ~5 a) [' {, p9 b
    }
+ W  \, r2 ~9 a8 Q6 p9 ?! I$ ?% {+ z
验证漏洞(举例):
. Q* Z( ^4 t+ E  Y请求地址:! H/ u3 }& I( F( z: g
http://localhost/Main?id=boo” or 1=”1! Q/ X3 c4 o$ h8 d
' f4 q- [- ?7 \& Y' R, _
http://localhost/Main?id=boo%22%20or%201=%221( v5 N5 q+ z9 s7 E/ L
action代码:7 V8 \+ w; X& ]" \
$model=M('Peipeidui');
: x- \; N( e5 k        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);- w! v5 F0 v: b
        dump($m);exit;
- S" N. l1 V5 g8 y" W/ r( `或者  ~# q- m0 N2 s$ f" J
$model=M('Peipeidui');; {- y9 V- ^+ [' ]+ O: s. q) e
        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
) {1 D9 J' c! V, j' C0 Q- v        dump($m);exit;
, K. h9 ^7 g2 v  \结果:
3 M- H% Y. N7 _( L& P5 d表peipeidui所有数据被列出,SQL注入语句起效.
3 \. C8 G; V  o. j. \4 M解决办法:& r, U* S4 a1 e8 r
将parseSql函数修改为:
1 O; m; ?8 B! N5 S3 l* Sprotected function parseSql($sql,$parse) {
# k* V4 Q: I, Y$ \8 Q        // 分析表达式6 [8 k. p. ?  j. T, |& z$ `
        if(true === $parse) {! s' T6 L+ C, l/ Y
            $options =  $this->_parseOptions();) `! o; g+ o/ i5 C0 N2 L
            $sql  =   $this->db->parseSql($sql,$options);" B& E2 {4 Y, Y) `' k
        }elseif(is_array($parse)){ // SQL预处理
& |' x$ C  S) v6 \+ {4 D3 }            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码( O! M8 W7 L/ e+ d
            $sql  = vsprintf($sql,$parse);
. U0 K+ a8 c8 \5 I! q        }else{
- q9 N% C3 a9 y            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
) j! t/ L6 x' V        }
" J$ V& {+ L- [1 q- Y        $this->db->setModel($this->name);- q: z8 A# v! u  e) {  ~1 g
        return $sql;
* Q6 R( `) a+ O0 _, U+ H    }
  n3 j) z4 x' A3 D, k' `* Y6 Y4 W$ ]- i2 @
总结:' j4 i5 p, ^* J) Q
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查- ]# r. N& t8 I1 s- t, a: U, e
不建议直接用$_GET,$_POST
9 b* B+ o5 w4 ?- s/ r[/td][/tr]3 b7 O7 x7 O4 }( G5 o& `
[/table]+1
6 U% K' z# B+ O; J% m- f  o! a" L% O, {5 j; X2 v  t

; n8 B! V5 K0 K2 {" Y3 l# b+ Y: Y( F
回复

使用道具 举报

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

本版积分规则

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