Contents

凌虚平台CTF训练营(Web)

0x00 前言

菜狗想打CTF。

0x01 hash attack

进入环境,给出了代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
echo "已知一组role为admin,salt长度为4,hash为c7813629f22b6a7d28a08041db3e80a9,想要扩展的字符串是joychou"."<br>";
$flag = "**********";
$role = $_REQUEST["role"];
$hash = $_REQUEST["hash"];
$salt = "***********"; //The length is 4

if ($hash !== md5($salt.$role)){
    echo 'wrong!';     
    exit;
}

if ( $role == 'admin'){
    echo 'no no no !, hash cann\'t be admin';
    exit;
}

//echo "You are ".$role.'</br>';
echo 'Congradulation! The flag is'.$flag;

?> wrong!

先把hash值解一下,得到memeadmin,salt的值应该就是meme,想要扩展的字符串是joychou,构造role=adminjoychou,在填上salt,进行md5加密,得到189a928b5a79d07b96d464fb188eddc1,在HackBar上构造url,成功拿到flag。

0x02 后台管理系统

现在SKCTF管理系统注册一个用户,登录出现提示。

在注册页面注册admin,提示如下:

可以得到管理员的用户名为admin,这里需要用到sql约束攻击,数据库建表时约束了字段的长度,例如username如果约束长度是2的话,输入超长的长度是只会保留约束长度的。构造一个用户名为admin 且密码符合规范的用户,数据库只会存入admin,相当于存入了一个与admin的同名用户,而密码则是我们注册时所设定的密码。

0x03 成绩单

一看就知道是sql注入,1' order by 4#时能够正常显示,1' order by 5#时无法显示,得出列数为4,下面猜解数据库名,输入-1' union select 1,database(),3,4#,成功得到web1。

再来猜解表名,输入-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3,4#,得到fl4g。

根据fl4g表来查询列名,输入-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='fl4g'),3,4#

取出flag的值,输入-1' union select 1,(select flag from fl4g),3,4#

0x04 这里有几首歌

先把两首歌下载到本地进行音频分析,没有什么异常。

分析源代码发现下载链接为download.php?url=目标文件的base64编码,可以利用此漏洞进行任意文件下载。

download.php的base64编码为ZG93bmxvYWQucGhw,尝试下载分析源码,发现了好东西。

hereiskey.php的base64加密为aGVyZWlza2V5LnBocA==,下载到本地,得到flag。

0x05 warmup

有个hint,点开后发现了有意思的东西,想到phpmyadmin 4.8.1任意文件包含漏洞,通过目录穿越包含任意文件,在url后添加%253f/../../../../../../../../../ffffllllaaaagggg

0x06 shop

题目购买flag需要21元,可是余额只有20元,因此使用条件竞争购买,抓包,发送到intrude,清空变量,设置payload为Null payload ,发包数量为10000,线程数为25,开始攻击。

0x07 前女友

点开链接,得到

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

构造三个参数,v1和v2利用md5函数的特性,使用一个不可md5的数据类型传入的话那么md5函数将返回false,可以用两个值不同但不可md5的数据类型,v3利用strcmp函数的特性,如果出错,那么返回值是0,和字符串相等时返回值一致。构造?v1[]=1&v2[]=2&v3[]=3

0x08 uploading

分析代码,name和password可以利用sha1的特性,使用不可处理的数据类型来绕过,设置payload为:?name[]=1&password[]=2&file=upload.php

又得到一片代码,展现了过滤的规则。

0x09 排好队 绕过去

题目就是md5(uname)===md5(passwd),这里直接上数值就完事了,?uname[]=1&passwd[]=2