关于渗透测试:PHP文件包含小总结

1.1.本地复现
过后发现url中有一个参数file=/home/task.php,眉头一皱;计上心来,把/home/task.php替换成了../../../../../../etc/passwd
接着发送带有php代码的申请,先phpinfo试一试。
接着就是蕴含日志了,感觉马上就要腾飞了,后果很忽然,no such file了,又换了几个门路,还是这样。
没方法只是试试蕴含一下配置文件,后果….一样。
这可咋办,眼瞅着就要getshell了,没门路啊,忽然想到还有一个ssh log能够尝试蕴含一下,立即来了精力头,噼里啪啦一顿敲,食指放在回车键上,当机立断,豁出去了!只见我眼睛一闭,重重按下回车,当我缓缓睁开眼时,悲痛欲绝,终于没有no such file 了
接下来就很简略了间接ssh连贯:
ssh ‘<?=eval($_REQUEST[1])?>’@remotehost

蕴含ssh log文件,而后执行下命令:id。胜利!

2.文件蕴含小常识
2.1.蕴含函数
1、PHP共有4个与文件蕴含相干的函数:

include

require

include_once

require_once

2、Include与include_once的区别:

(1)Include:会将指定的文件载入并执行外面的程序;反复援用的状况下加载屡次。

例如:

这里include两次1.php文件,所以就会蕴含1.php两次。

(2)Include_once:会将指定的文件载入并执行外面的程序;此行为和include语句相似,惟一区别是如果该文件中曾经被蕴含过,则不会再次蕴含。

例如:

这里include_once了两次1.php文件,但只会蕴含1.php一次。

(3)require和requireonce的用处与下面两个一样,但区别就是require和requireonce会加载页面最开始执行。Include和include_once会按代码程序执行。

2.2.反对的协定和封装协定
File:// ——拜访本地文件系统

http(s):// ——拜访HTTP(s)网址

ftp:// ——拜访FTP(s) URLs

php:// ——拜访各个输出/输入流(I/O streams)

zlib:// ——压缩流

data:// ——数据(RFC 2397)

glob:// ——查找匹配的文件门路模式

phar:// ——PHP归档

ssh2:// ——Secure Shell 2

rar:// ——RAR

ogg:// ——音频流

expect:// ——解决交互式的流

2.3.罕用伪协定解说:

  1. file://

(1)这个协定能够展示本地文件系统,默认目录是以后的工作目录。

(2)例如:file:///etc/passwd、file://key.txt

  1. php://

(1) php://input是个能够拜访申请的原始数据的只读流,能够拜访申请的原始数据的只读流,将post申请中的数据作为php代码执行。

(2) php://filter是一种元封装器,设计用于数据流关上时的筛选过滤利用。

3、phar://

(1)phar://数据流包装器自PHP5.3.0起开始无效

(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt

phar://1.zip/phpinfo.txt

2.4.伪协定利用形式小总结:

3.getshell总结
3.1.Getshell之session
条件:session文件门路已知,且session文件中内容局部可控。

获取session文件门路:

1、session文件的保留门路能够在phpinfo的session.save_path看到。

2、默认门路:

/var/lib/php/sess_PHPSESSID

/var/lib/php/sess_PHPSESSID

/tmp/sess_PHPSESSID

/tmp/sessions/sess_PHPSESSID

session的文件名格局为sess_[phpsessid]。而phpsessid在发送的申请的cookie字段中能够看到。

利用:

1.要蕴含并利用的话,须要能管制局部sesssion文件的内容。能够先蕴含进session文件,察看外面的内容,而后依据外面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次蕴含从而执行php代码。

2.例如当初有一个session.php可控用户会话信息值:

3.能够看到这个session.php文件中的用户会话信息username的值是用户可管制的,那咱们就能够传入恶意代码进行攻打利用。

4.将恶意代码传入当前,接下来就要利用文件蕴含破绽去蕴含这个恶意代码。

5.从返回后果来看,咱们的payload和恶意代码曾经失常解析和执行。

3.2.Getshell之日志
3.2.1.拜访日志

条件:须要晓得服务器日志的存储门路,且日志文件可读。

日志存储默认门路:

1.apache+Linux日志默认门路:/etc/httpd/logs/accesslog或/var/log/httpd/accesslog

2.apache+win2003日志默认门路:D:xamppapachelogsaccess.log、D:xamppapachelogserror.log

3.IIS6.0+win2003默认日志文件:C:WINDOWSsystem32Logfiles

4.IIS7.0+win2003 默认日志文件:%SystemDrive%inetpublogsLogFiles

5.nginx 日志文件:日志文件在用户装置目录logs目录下,假如装置门路为/usr/local/nginx,那日志目录就是在/usr/local/nginx/logs上面

利用:

1.少数状况,web服务器会将申请写入到日志文件中,比如说apache。在用户发动申请时,会将申请写入access.log,当产生谬误时将谬误写入error.log。默认状况下,日志保留门路在/etc/httpd/logs/下。

2.但如果是间接发动申请,会导致一些符号被编码使得蕴含无奈正确解析。能够应用burp截包后批改。

3.失常的php代码曾经写入了 /etc/httpd/logs/access.log。而后蕴含即可执行代码。

4.但有的时候,log的寄存地址会被更改。这个时候能够通过读取相应的配置文件后,再进行蕴含。

中间件默认配置文件寄存门路:

1.apache+linux 默认配置文件

/etc/httpd/conf/httpd.conf或/etc/init.d/httpd

  1. IIS6.0+win2003 配置文件

C:/Windows/system32/inetsrv/metabase.xml

  1. IIS7.0+WIN 配置文件

C:WindowsSystem32inetsrvconfigapplicationHost.config

3.2.2.SSH log

条件:须要晓得ssh-log的地位,且可读。

ssh日志默认门路:

1./var/log/auth.log

2./var/log/secure

利用:

1.用ssh连贯:

ssh ‘<?php phpinfo(); ?>’@remotehost

之后会提醒输出明码,轻易输出就能够。

2.而后利用文件蕴含,蕴含日志文件:

3.3.Getshell之environ
条件:

php以cgi形式运行,这样environ才会放弃UA头。
environ文件存储地位已知,且有权限拜访environ文件。
environ文件默认地位:

proc/self/environ

利用:

1.proc/self/environ中会保留user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再蕴含它,即可。

2.例如咱们当初拜访一个网站,应用burpsuite抓包,将恶意代码插入到user-agent中。

3.利用文件蕴含破绽去蕴含proc/self/environ,胜利执行php代码。

3.4.Getshell之利用phpinfo
条件:存在phpinfo页面并且存在文件蕴含破绽

原理:

当咱们给PHP发送POST数据包时,如果数据包里蕴含文件区块,PHP就会将文件保留成一个临时文件,门路通常为:/tmp/php[6个随机字符],这个临时文件,在申请完结后就会被删除。
因为phpinfo页面会将申请上下文中的所有变量打进去,所以咱们如果向phpinfo页面发送蕴含文件区块的数据包,就能够在返回包里找到长期文件名,也就是$_FILES变量中的内容。
利用:

首先咱们应用vulhub的脚本(https://github.com/vulhub/vul…),他能够实现蕴含临时文件,而这个临时文件的内容是:<?php fileputcontents(‘/tmp/p’,'<?=eval($_REQUEST[1])?>’)?>。胜利蕴含这个文件后就会生成新的文件/tmp/p,这个文件就会永恒的留在指标机器上。
写入胜利当前,咱们利用文件蕴含来执行任意命令。

原理:

那么为啥vulhub的脚本是如何做到在长期脚本文件删除前去蕴含的呢,其实就是用到了条件竞争,具体流程大抵如下:

首先发送蕴含webshell的数据包给phpinfo页面,并用大量的垃圾数据将header和get等地位填满。
因phpinfo页面会将所有数据打印进去,第一个步骤中的垃圾数据就会将phpinfo页面撑的十分大。而php默认输入缓冲区大小为4096,也能够了解为php每次返回4096个字节给socket连贯。
所以,这里间接操作原生socket,每次读取4096个字节。只有咱们读取到字节里蕴含长期文件名,就立即发送文件蕴含破绽利用的数据包。因为第一个数据包的socket连贯没有完结,所以临时文件还没有删除,咱们就能够文件蕴含胜利。
3.5.Getshell之上传文件
条件:有上传点,晓得上传上去的文件名和寄存目录。

利用:

这里用一个靶场简略演示一下,找个文件上传点,上传一个带有php恶意代码的图片。

咱们当初已知文件名称和门路,能够利用文件蕴含破绽去蕴含这个图片,就能够胜利执行php代码了。

4.应答措施
1、在很多场景中都须要去蕴含web目录之外的文件,如果php配置了open_basedir,则会蕴含失败。

2、对能够蕴含的文件进行限度,能够采纳白名单的形式,或设置能够蕴含的目录。

3、对危险字符进行过滤。

4、尽量不应用动静蕴含等等

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据