ftp:// — 访问 FTP(s) URL
php:// - 访问各个 I/O 流(强调)
zlib:// — 压缩流
数据:// — 数据 (RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 存档
ssh2:// — 安全外壳 2
rar:// — RAR
ogg:// — 音频流
Expect:// — 处理交互式流
#各种合约的条件与技巧
#标准输入流和输出流的原理:
----存储(按顺序递减):外部存储-->内存-->缓存
----读取速率(依次递减):缓存-->内存-->外存
---- 对于显存和外存的理解,我们可以简单地将其理解为一个容器,即外存是一个容器,内存是另一个容器。
----将具体的输入和输出称为流量,就像连接两个容器的水管。 从外存读取到显存的数据称为输入流,从显存写入外存的数据称为输出流。
---- 流是一个非常形象的概念。 当程序需要读取数据时,会打开一个通向数据源的流。 该数据源可以是文件、内存或网络连接。 类似地,当程序需要写入数据时,它会打开一个到目的地的流。
3、Php合约读取1.txt文件的源码(注意:PHP合约只能在PHP脚本中使用)
:8888/test.php?filename1=php://filter/read=convert.base64-encode/resource=1.txt
---原理:在文件输入之前进行过滤php 文件操作,读取过滤器中的内容,其中resource是要过滤的数据流。
---base64加密原因:有时由于编码形式不同导致读取出现乱码。 这里加密后就不会出现乱码了
#解密
4. 执行PHP格式的文件
---- :8888/test.php?filename1=php://输入
----post提交数据:
----原理:php://input可以读取未处理的POST数据。 它对视频内存的压力比 $HTTP_RAW_POST_DATA 更小,并且不需要特殊的 php.ini 设置。 php://input 不能用于 enctype=multipart/form-data
5、在Php合约中写一句侧门代码
---- :8888/test.php?filename1=php://输入
----post提交数据:
----原理:使用fopen打开或创建shell.php文件,使用fputs将字符串''写入shell.php文件中
---- 服务器文件包含在脚本路径下找到的shell.php脚本
6.文件合约读取文件内容(适用于所有脚本)
:8888/test.php?filename1=file://C:/phpstudy/PHPTutorial/WWW/sqli-labs-master/1.txt
---这里的txt文件实际上是以PHP脚本格式执行的
---条件:文件合约的使用需要使用完整路径,依赖之前的信息收集
7.执行指定PHP脚本代码的数据契约
---条件:allow_url_fopen和allow_url_include打开
:8888/test.php?filename1=data://text/plain,
八、总结
---- 伪合约常用于文件包含漏洞。
----在php中,同样可以导致文件被包含的函数有include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile。
----include函数:可以放在PHP脚本的任意位置,一般在流程控制的处理部分。 当PHP脚本执行到include指定的文件时,就会被包含并执行。 PHP 第二次遇到同一个文件时仍然会重新解释它。
----require函数:一般放在PHP脚本的前面,PHP在执行之前,会先读取require指定的文件,包含并尝试执行导入的脚本文件。 require的工作方式是为了提高PHP的执行效率。 在同一网页中解释一次后,不再解释第二次。
----include_once 和 require_once 函数:分别与 require/include 功能相同,不同的是它们执行时会先检查目标内容之前是否导出过,如果导出过则不会重新引入其相同的内容。
----hightfile 函数:highlight_file(filename, return) —— 文件名:必填。 要突出显示的 PHP 文件的路径。 返回:可选。 如果为 true,则此函数返回突出显示的代码。 此函数使用 PHP 语法突出显示中定义的颜色输出或返回 filename 中包含的代码的语法突出显示版本。
----show_source函数:该函数是highlight_file函数的别称。
----file_get_content函数:将整个文件读入字符串。 与 file() 相同,不同之处在于 file_get_contents() 将文件读取到字符串中。
----file() 函数:将整个文件读入一个字段。 与 file_get_contents() 类似,不同之处在于 file() 以链表形式返回文件。 数组中的每个元素都是文件中的对应行,包括换行符。 失败时返回 false。
CTF-南邮大学,i春秋百度杯真题-白盒
1.进入南油岭
---这里的URL带有文件传输参数,可以测试文件包含/下载漏洞。 真实环境下,可以使用扫描工具进行扫描(文件下载漏洞)。 尝试更改文件的参数名,发现显示不正常,说明参数确实是通过文件传递的。并且可以执行PHP文件,大部分都是PHP脚本搭建的网站。
---直接访问show.php文件(显然存在文件包含漏洞)
---数据包查看环境(这里只找到中间件nginx和php脚本)
---案例判定操作系统(发现为Linux)
2.订单执行的伪合约
---测试php命令(这里执行起来比较困难,查看php伪合约的要求:allow_url_include参数必须开启,这里可以不开启,这里可以实现php伪合约的过滤读取-合同)
---读取当前路径下的index.php文件(如果读取成功则后续猜测成立)
---解密(获取flag)
3.进入i春秋射击场
---如果传递的参数路径则包含该参数,否则执行phpinfo
---isset()函数用于测量变量是否已设置且不为NULL
---访问当前目录下的phpinfo文件(验证码分析)
---案例判断操作系统(这里是linux系统)
---通过文件包含漏洞读取index.php文件
4.订单执行的伪合约
---使用 php://input()
---读取dle345aae.php文件
--- 源代码查看
---php过滤加密读取
---解密
CMS程序文件包含帮助黑盒
1.进入拍摄范围
2. 发现漏洞
---1. 漏洞扫描工具 2.CMS公开漏洞 3.手动查看参数及功能点
---先使用目录工具(铸剑)扫描一下(有参数传递的地方可能有漏洞)
--- 这里可能存在一些漏洞:/index.php?s=Admin/Login
---发现这里是CMS
---在线搜索漏洞
---后门代码的原因是{}:文件中包含要执行的PHP脚本,而传统是告诉笔记本用PHP脚本来执行,所以这里不需要写
---这个漏洞被别人的代码审计了,所以这里的目录工具扫描的好处不是很大
3. 执行漏洞
----访问包含URL的文件(:6677/index.php?s=)
----包含日志文件(s=my/show/id/路径下,没有sidedoor.html文件,这条信息会被写入日志中,可以看出这里的文件包含了限制设置(添加html后缀))
----写入侧门({~eval($_POST[x])})
---服务器发现日志产生(日志以时间命名)
---访问漏洞/index.php?s=my/show/id/..templogs21_11_27.log
---这里的路径有点奇怪,我觉得该文件包含了网站根目录下的文件索引,直接s=templogs21_11_27.log或者templogs21_11_27.log就可以了( emmmm都报错,不知道为什么)
---尝试使用php伪合约(还是失败,我这里启用了allow_url_include,这里是本地文件,不得不说CMS真香)
4.错误修复
---传递参数,过滤并检查参数是否有变种
---尽量不传参数php 文件操作,把参数写死(固定文件)
---传递参数后,修复文件名的后缀(有绕过的可能)
---WAF产品