中国网络渗透测试联盟

标题: ThinkPHP框架通杀所有版本的一个SQL注入漏洞 [打印本页]

作者: admin    时间: 2013-7-27 18:30
标题: ThinkPHP框架通杀所有版本的一个SQL注入漏洞
下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑。建议类似的厂商不要再做这种蠢事。5 v) v8 p. \3 D' M5 [
ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件9 Y6 N+ f, U  p. y  _7 g  Z. N
根据官方文档对”防止SQL注入”的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)/ n  q$ g8 w! }# D$ B  n
使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果:
3 G1 |" u4 o" n" N/ V; E& u$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();: v( P2 N# K6 }, {7 S
* J+ O8 s, l/ y& y: @: u& d
或者+ D7 R; t  |  D6 `) v
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();% O3 t( v3 r+ m- Q8 T

7 F$ y* K* @4 H" W, I& I 但是,当你使用如下代码时,却没有”防止SQL注入”效果(而官方文档却说可以防止SQL注入):% f3 Y3 b5 N% A0 D8 ?6 x1 Y% J5 Z
$model->query('select * from user where id=%d and status=%s',$id,$status);- _2 n- Q* i2 {3 I+ O1 \

5 u- B7 a4 i& ~0 o+ y9 m) z或者# n2 f4 p8 t/ I/ N  G
$model->query('select * from user where id=%d and status=%s',array($id,$status));: H9 p5 E$ |! d1 W5 V8 s) a

  I" u  v" P3 [! L, F; L 原因:
0 l- W9 g( l7 ~+ oThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
. J  f6 o5 c: C原函数:
8 U5 h# M6 g; \* y: z; ?: m5 Gprotected function parseSql($sql,$parse) {& V. M2 k7 B) U' L& J
        // 分析表达式2 h0 ]' h) {1 w7 ?5 X
        if(true === $parse) {
9 v( |+ |  p1 w, o: `5 z            $options =  $this->_parseOptions();
6 {" W. F" Y( R" k            $sql  =   $this->db->parseSql($sql,$options);, n4 C4 q" ^, W: s( K- o
        }elseif(is_array($parse)){ // SQL预处理
3 F7 U/ U3 c4 e: c' B) t1 C% g            $sql  = vsprintf($sql,$parse);! I) n8 J' W0 E3 Z
        }else{% B8 T" c  r) E7 C3 B
            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));
1 ]2 y7 g  `" ?- R$ ]4 o% E        }
; P: N5 o  |3 T4 a+ n+ ~" p& b6 a        $this->db->setModel($this->name);
; d/ G) a3 g0 v- f) d        return $sql;: |0 \( C) @6 y1 l- v: E/ m3 \5 {' E
    }
. F( P; u# q6 |: m' X: d. Y  Y. I! b" ?: h, m8 L# r
验证漏洞(举例):
! K/ }( T. F( D5 d- Q请求地址:) }& p/ a' R, _. a# w9 N* X4 k
http://localhost/Main?id=boo” or 1=”1: o' A6 a, J$ h9 N
$ `; b( w" b8 j! e' W2 _
http://localhost/Main?id=boo%22%20or%201=%221
/ F3 a" G- F, b0 x3 ~! W* d  caction代码:
( Z0 ~9 L8 ^# W8 `5 l! {" X. }3 m2 m1 R$model=M('Peipeidui');" ?4 x1 c- _; S' [  j4 U7 e
        $m=$model->query('select * from peipeidui where name="%s"',$_GET['id']);# d" n3 Z, J! ^4 E" S  H5 l
        dump($m);exit;
' {2 r8 P, I" x) ~: q" H4 a' T7 ?或者& C: ?1 p" w( `! H) r# X! w
$model=M('Peipeidui');
2 l. U1 M/ E7 m; _1 E7 l        $m=$model->query('select * from peipeidui where name="%s"',array($_GET['id']));
% g6 Q3 Q, M# y- p) f        dump($m);exit;
1 i- k3 s. |4 D9 e( y" w结果:
  |, h8 P$ z6 M# ~9 I( n* o" B$ H表peipeidui所有数据被列出,SQL注入语句起效./ z$ {# Z& V8 J, j
解决办法:
5 h/ I( V, k6 _* ^将parseSql函数修改为:, r' F# ~- O+ m! d: }6 \/ P
protected function parseSql($sql,$parse) {
4 ]( N  U1 N; e4 \        // 分析表达式1 X  c( u' k6 z$ F, A6 T/ S
        if(true === $parse) {
: f1 M* g, R5 D5 j$ w& ^            $options =  $this->_parseOptions();5 M4 l- {8 A9 K$ T7 s$ |! U
            $sql  =   $this->db->parseSql($sql,$options);" d) T/ `: K: A
        }elseif(is_array($parse)){ // SQL预处理
  P, y% M# F- B4 n            $parse = array_map(array($this->db,'escapeString'),$parse);//此行为新增代码4 _4 g( D6 S" ]! r5 w( A
            $sql  = vsprintf($sql,$parse);
3 E" m4 ^: }+ z& e& X. _. P, d7 v6 p        }else{
, w" X7 K$ c1 \, _, _            $sql    =   strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>C('DB_PREFIX')));! X4 i8 O: F6 ?6 `* {
        }& x9 l4 h# X& F, R1 A
        $this->db->setModel($this->name);
3 u6 U" K; ?6 u7 y' |8 w        return $sql;
9 T# u# P2 X0 J    }3 O2 ^- j& t+ i7 g/ }% @. G/ t
2 C$ `3 D7 N( J! v% c9 t
总结:+ e) J+ h% J' q5 G3 n6 D
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
; {) B; u# l% s! L7 H3 u0 x  \  q不建议直接用$_GET,$_POST% O1 Z3 n1 Y( j! B, d3 t
[/td][/tr]
( e4 o" l- O2 s  A: L5 G' X[/table]+1
" Q' K$ k4 ]0 F0 p2 }6 }2 g# L
' d& s4 O$ D" v& p: b+ V$ I3 b* |
8 V$ d' z9 A3 t. `* Q% c; q




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2