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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-27 18:30:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。
9 z: f6 G% R9 |% G( I, oThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件
2 _9 y! X: l; t! u2 A根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)5 P0 J. j6 B( ^5 \
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
. k8 _5 v' C# N' Z. k& b$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();" U9 R! @$ F1 R9 |, Y

! C" I+ `& S0 A& a- M; \ 或者, B, d0 [8 I, B
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();' n4 d5 P& Q: m* \2 K0 M
  k% p! |/ m7 d2 _' x% @
但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):2 l% N: i$ m1 ^& m/ q: M
$model->query('select * from user where id=%d and status=%s',$id,$status);8 b- }# U9 K  h) l: x# M' }2 G& T

2 I$ w: `1 M, M( J或者6 h7 j$ G! ^4 a. ?  ~* C
$model->query('select * from user where id=%d and status=%s',array($id,$status));2 z6 G0 H5 k1 k6 P
8 u- D0 b  i6 |
原因:
  _* x# ~( Y8 b0 HThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.3 @- }9 D' @( T# d
原函数:. k* w  \. N0 H4 \. M
protected function parseSql($sql,$parse) {
5 P" {: M1 i+ v) v0 U  W! I* [* L        // 分析表达式' ?/ S+ v; Y% i/ v
        if(true === $parse) {
' ?  `- G. J, p  y; o* D9 ]            $options =  $this->_parseOptions();5 ^. ]( }: ^" t$ m4 n
            $sql  =   $this->db->parseSql($sql,$options);
6 g% W. h$ C, B9 _3 u4 k8 E        }elseif(is_array($parse)){ // SQL预处理
; N4 s8 S" F+ b            $sql  = vsprintf($sql,$parse);
8 ^1 _# F* q8 d  D+ C8 ~( `5 L' X% `        }else{
+ a/ D6 K' a3 D$ c1 {2 @            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
! ~& z, ?) b6 b" e# Y; Z        }9 I* y7 c! Y" e( c4 p
        $this->db->setModel($this->name);
  b( {: b/ }4 @( N/ S        return $sql;7 O4 Q3 Z5 H, A% H/ |
    }) B# w; y; I, E) y, @+ T1 R8 ~1 f

& [) Z5 |1 h# F验证漏洞(举例):" y2 s% m+ g0 R) z* v
请求地址:3 k' T0 S1 g+ p; l8 i
http://localhost/Main?id=boo” or 1=”1# T% W4 l7 ?1 }  T2 ~+ t# ~3 |7 e
* {2 d* q3 u- k6 q
http://localhost/Main?id=boo%22%20or%201=%221
8 a$ k4 }/ l* S- Xaction代码:
- k9 l$ B$ C+ u" }' L7 V$model=M('Peipeidui');2 h% E% Y0 q1 U6 A
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);3 q+ B; L& \9 x8 Z. i
        dump($m);exit;
, R- i% T8 }6 c- y8 W. V或者2 @, s% a3 U# A5 U
$model=M('Peipeidui');
$ s* K- M" K# }. {% I2 ?' I        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));3 e; g- E! C  i' K" M, Y
        dump($m);exit;9 z+ E, `  ]5 R+ N
结果:/ `2 Z6 T& Q) V: H& [
表peipeidui所有数据被列出,SQL注入语句起效./ n" s# k3 Y2 e& ?
解决办法:/ w6 {) l- O; ?- G1 I, y% [* R
将parseSql函数修改为:4 O* a5 @! m3 w5 f3 z5 _& h' R
protected function parseSql($sql,$parse) {
/ R6 b* E% I/ E) [        // 分析表达式7 q3 R) Y5 V6 h8 J' B/ H
        if(true === $parse) {* [* k# C% `9 @: j) P9 k
            $options =  $this->_parseOptions();
2 ]+ P, c: q6 H# Y3 `3 ^" g            $sql  =   $this->db->parseSql($sql,$options);
) u! ]8 ?. |8 c        }elseif(is_array($parse)){ // SQL预处理
* |7 d, S. |/ F  ^            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码
# C8 G8 ]3 e) v3 c            $sql  = vsprintf($sql,$parse);
9 J- q8 s- _- @% m. k        }else{
0 U8 [8 |3 v  P# R  @$ J! D) \/ n            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));3 U4 P$ }: Y- A. l6 q* C. D. ~
        }
" v: r; T+ o' u        $this->db->setModel($this->name);
3 p8 k' t. f7 m/ B1 q        return $sql;
7 f; d* V. M: P    }
8 [  I3 W0 u/ F  p' c/ N$ T
1 @3 K! ?: a( a  n, g总结:
) B4 l9 P( {$ e5 v: d9 c不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
# n, a3 a& Q1 g# K# B不建议直接用$_GET,$_POST
1 @1 y2 }, {* S! k/ H[/td][/tr]) {5 V! S0 q2 U" O
[/table]+1  I1 x# H' [5 Z, x4 [  A: I

/ p, k6 |% I4 j: S8 k4 d
# q0 x% n5 H- W: ]" Q) K8 Q2 a
回复

使用道具 举报

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

本版积分规则

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