文件包含和命令执行挑着写,学习并记录
web33到39大部分都是文件包含的内容。
文件包含函数漏洞:
1.require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
2.include(),找不到被包含的文件时只会产生警告,脚本将继续运行
3.file
文件包含伪协议:
file:// [文件的绝对路径和文件名]
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行
data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
data://text/plain/,<?php ‘代码’?>
命令执行
web29
eval()函数里面的值会被当作代码执行
很简单的命令执行
先看看文件
既然flag被源代码过滤了,那么就要去过滤一下flag
得到flag
web30
题目过滤了system,这里用到另一个命令执行函数passthru()
然后和上一题一样就行
web31
知其然,要知其所以然,过滤的这些到底是些什么姿势,我觉得有必要好好讲清楚
首先,flag,system,php,cat就不讲了
sort是一个文件排序函数,用于替换cat。
shell则是过滤了命令执行函数shell_exec();
过滤了空格,用%09代替,可以直接用echo解出来。当然上面的passthru()也没有过滤,也可以用,不过这里再介绍别的解法
再没有过滤eval()和引号的时候,再构造一个b是很不错的选择
web32
把;过滤了,这下虽然没过滤passthru,但是没有;也不能执行passthru的命令。
但是include函数并没有涵括进去,同时也不需要. ' ` ; (
不过include函数需要一点文件包含的知识,上面也给出了伪协议的用法啦,心动不如行动
?c=include&_GET[1]?>&1=data://text/plain,<?php systtem("tac fla*");?>
web33
好像过滤了一个“用上一题的方法也完全ok,不过记录的话就不写相同的方法了。
?c=require$_GET[123]?>&123=data://text/plain,<?php%20system("tac%20fla*");?>
web34~36
一直用那两个文件包含的pyload就行,这里就不浪费时间了(别的方法的话可以试试不用data伪协议,用用php://input,php:filter)36题把数字ban了,就换成a,不用加引号。
web37
换题目了,不过还是include,就当是为了flag,对它使用伪协议吧
c=data://text/plain,<?php%20system("tac%20fla*");?>
web38
多过滤了php和file,其实就是过滤了file协议
(用法是php://filter/read=convert.base64-encode/resource=flag.php)转化成base64就运行不了了,就可以输出出来。
这道题没过滤掉我最爱的data,继续使用data吧
web39
39少了过滤,不过后面加了一个.php,其实也不影响,因为include只会读取<?php ?>里的东西。
所以,还是对他使用data吧
文件包含
web78
文件包含,先用data伪协议看看flag在哪
?file=data://text/plain,<?php system('ls');?>
接下来就简单了,可以用php://filter协议输出flag.php的base64编码,下面给出原理
?file=php://filter/read=convert.base64-encode/resource=flag.php
include函数,这个表示从外部引入php文件并执行,如果执行不成功,就返回文件的源码。
而include的内容是由用户控制的,所以通过我们传递的file参数,是include()函数引入了index.php的base64编码格式,因为是base64编码格式,所以执行不成功,返回源码,所以我们得到了源码的base64格式
web79
其实很简单,原码中就是把php换成???了,大小写绕过就行
这里就换了一种方法
web80
这道题同时过滤了php和data
php仍可以大小写绕过。data被ban了,那就直接不用了被,用Php://input加post构造<?Php system("ls");?>查看一下文件
(我的HackBar总是post不上去,用来Max HackBar才可以,不过平常还是Hack bar好用)
文件名改了一下,然后继续构造<?Php tac fl0g*?>
web81
看题目发现为协议几乎都被绕过了,但是还可以通过日志注入木马getshell
日志文件(access.log)可以记录我们所有在服务器上的操作记录,我们可以通过再url后构造一句话木马(需要抓包后改,直接传的话会被url编码)也可以在UA(user-agent)输入木马(Hacker Bar就行)
日志文件路径为/var/log/nginx/access.log
其实这里就已经解决了,前面都看了的话,应该知道这里该怎么继续构造pyload了
(其实很离谱,这道题我自己一直没写出来,一模一样的pyload我电脑上就是会报错)