【做题记录】CTFSHOW-WEB入门一千题


主要是记录做题过程以及题解,方便查缺补漏,而且看着也爽。

信息搜集篇:

WEB1:

F12查看源代码,拿到flag。

WEB2:

利用view-source协议查看源代码,拿到flag。

WEB3:

根据提示抓包查看返回包,拿到flag。

WEB4:

查看robots.txt,发现flagishere.txt文件。

访问拿到flag。

WEB5:

根据提示访问/index.phps,下载泄露源码,拿到flag。

也可以用dirsearch扫出来目录。

WEB6:

根据提示访问www.zip(用dirsearch扫也可以),下载源码。发现有两个文件,点进去

发现txt是假flag,访问/fl000g.txt,拿到flag。

WEB7:

根据提示判断为git泄露,访问/.git(也可以dirsearch扫),拿到flag。

WEB8:

根据提示可以判断为svn泄露,访问/.svn拿到flag

WEB9:

vim备份文件:

默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看。

如index.php的备份文件为index.php~

vim临时文件:

p~vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果源文件名是index.php,则它的临时文件名为index.txt.swp。如果文件正常退出,则此文件自动删除。


根据提示可知为vim文件泄露,访问/index.php.swp,下载文件,拿到flag。

WEB10:

根据提示查看cookie,在F12的console中输入document.cookie,然后url解码,拿到flag。

WEB11:

本题主要考察域名txt记录泄露,在dbcha.com查询ctfshow.com的txt记录便可拿到flag。

这里没有flag的原因题目简介写的很清楚了。

WEB12:

dirsearch跑出来robots.txt,进入管理页面发现要密码,我还以为是top100弱密码,试了发现没用,看hint才知道就在页面最下方有个Help Line Number,这个就是密码(笑,登录拿到flag。

WEB13:

根据提示在底部找到document选项

进去后发现文档泄露了后台地址和默认用户名与密码。

访问/system1103/login.php,输入默认用户名与密码拿到flag。

算是直接网上直接找到后台地址与默认用户名和密码的复现吧,虽然听起来把登陆地址和账户密码发网上挺离谱但还真有很多人这么干,就。。挺魔幻的。

WEB14:

根据提示查看源代码发现编辑器地址。

进去看看,根据提示找到和文件目录有关的地方,找到了上传图片。

 

点进去发现有个图片空间,打开发现可以查看服务器目录。

找到网站根目录,发现nothinghere文件夹。

进去发现有个fl000g.txt文件,访问/nothinghere/fl000g.txt,拿到flag。

 

WEB15:

首页找到qq邮箱。

根据提示访问/admin/(也可以用dirsearch扫,线程不能开太多),发现是一个后台登录界面。

登录admin,提示密码错误,进入忘记密码,发现问题是所在地。

根据拿到的qq邮箱在qq里搜索qq号,可以看到号主所在地。

 

填入后提示重置密码,用密码登录admin拿到flag。

WEB16:

php探针:

php探针是用来探测空间、服务器运行状况和PHP信息用的,探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。 url后缀名添加/tz.php,版本是雅黑PHP探针。

本体考察雅黑php探针,访问/tz.php,找到PHPINFO,查看php信息。

在phpinfo页面搜索拿到flag。

WEB17:

dirseach跑出backup.sql。

访问/backup.sql并下载,打开搜索ctfshow,拿到flag。

WEB18:

从js中找到分数大于100返回的结果。

unicode解码提示110.php。

访问拿到flag。

WEB19:

f12发现用户名和加密后的密码,并且在前端做的加密。

burpsuit改包可以绕过js加密。

拿到flag。

小插曲: 尝试将拿到的密码进行根据所给的js进行解密,可惜失败了。。

WEB20:

数据库文件泄露,dirsearch扫发现存在db目录。

带上db路径继续扫,扫到db.mdb文件。

访问下载db.mdb文件,用记事本打开搜索ctfshow,拿到flag。

爆破篇:

WEB21:

考察burpsuit的intruder模块,访问发现是个登录口,随便输个用户名和密码抓包,发现使用的Basic认证

Basic认证采用Base64加密方式,Base64解码字符串发现是用户名:密码的格式进行Base64编码。

将请求包发送到Intruder进行爆破,给字符串加上标记作为爆破对象。

修改Payload type为Custom iterator(自定义迭代器)。

第一个位置值为admin分隔符为:,第二个位置值为官方给的字典(我因为跑的时间太久了所以就去hint看了密码,然后把真正密码往前放了)。

还要进行Base64编码和关掉URL编码。

开始爆破发现有长度不一样的返回包。

查看拿到flag。

PS:

除了用迭代器,也可以直接生成字典,但一定要关掉URL编码,因为=会被编码导致认证失败。

生成需要的字典

import base64
with open('最新网站后台密码破解字典.txt','r') as rstream, open('最新网站后台密码破解字典1.txt','w') as wstream:
    data = rstream.readline()
    while data != '':
        data = 'admin:'+data
        data = base64.b64encode(data)
        wstream.write(data)
        data = rstream.readline()
    rstream.close()
    wstream.close()
    print('制作完成')

WEB22:

用子域名扫描器扫出flag.ctf.show拿到flag,但这个域名已经没了所以就直接交的官方提供的flag。

WEB23:

访问发现是一个做了一个md5值的过滤,绕过了即可返回flag。

根据代码编写相应的脚本。

我是用的python带的字符,从一个字符开始遍历,发现一个字符没有结果就改为了两个字符,发现3j和ZE都可以过。

import hashlib
import string

all = string.digits + string.ascii_letters
better_set = set(string.ascii_letters)

for a in all:
    for b in all:
        c = a + b
        t = hashlib.md5(c.encode(encoding='utf-8')).hexdigest()
        if t[1] == t[14] and t[14] == t[17]:
            t_set = {t[1],t[14],t[17],t[31]}
            if t_set.isdisjoint(better_set) and t[31] != '0':
                if (int(t[1])+int(t[14])+int(t[17]))/int(t[1]) == int(t[31]):
                    print(c)
                    print(t)

生成相应的结果。

提交参数token拿到flag。

WEB24:

发现会通过mt_srand()生成伪随机数,php伪随机数漏洞参考链接。

本地使用相同的种子编写一个随机数生成器,多次访问随机数没有改变。

提交该随机数,拿到flag。

WEB25:

审计可知,可以利用$rand = intval($r)-intval(mt_rand());得到mt_rand()生成的随机数。

传入r=0,得到mt_rand()的值311066071

参考链接,使用php_mt_seed爆破mt_rand()产生的随机数的种子。

在对生成的几个种子测试过后发现521939396可以得到所给的随机数值。

算出token的值(两个必须一起拿到,否则token就是错误的)。

传参拿到flag。

WEB26:

拿之前的字典直接爆破密码就可以拿到flag。

WEB27:

访问发现是一个教务管理系统。

点击录取名单下载,发现有学生姓名和身份证号码的一部分。

访问学生学籍信息查询系统,发现需要姓名和身份证号。

利用burpsuit的Intruder模块进行Cluster bomb(集束炸弹)方式攻击(遍历尝试所有位置的payload的笛卡尔积),配置如下(年份是看的别人的解答,我猜的是00后没想到是90年的)。

攻击,发现19900201返回包长度和其他不同。

尝试621022199002015237,拿到学号和密码。

登录,拿到flag。

WEB28:

发现有两个目录,进行爆破。

官方Hint建议是两个都从0-100开始爆破,用cluster bomb爆破,拿到flag。

命令执行篇:

WEB29:

参考链接
审计代码发现可以执行c传来的参数并且过滤了flag,构造echo "aaa";?><?php system('ls');传参,查看当前目录下文件。
第一种解法:
如果直接cat flag.php的话会被ban,可以用include包含,利用php://filter读取,再对得到的内容进行base64编码,达到绕过目的。 echo "";?><?php include($_GET['fxxk']);&fxxk=php://filter/read=convert.base64-encode/resource=flag.php Base64解码拿到flag。
第二种解法:
利用匹配符*,使用cat fla*读取开头为fla的文件,这样就能读取flag.php内容了。

WEB30:

php标记:

标准php标记:

<?php
echo "fxxk!";
?>
只写头部的php标记:
<?php
echo "fxxk!";

简短风格的php标记:

<?
echo "fxxk!";
?>

asp风格的php标记:

<%
echo "fxxk!";
%>

脚本风格的php标记:

<script language="php">
    echo "fxxk!";
</script>

审计代码可以看到ban了flag,system,php。

system可以用passthru函数或exec绕过,也可以用`执行参数绕过。

文件读取可以用cat加通配符cp到新文件然后访问绕过。

解法一:

使用passthru,传参passthru("ls"),得到文件名,然后传参passthru("cat fla*"),拿到flag。

解法二:

传参exec("cp fla* 1.txt"),将名字开头为fla的文件内容cp到1.txt,然后访问/1.txt拿到flag。

解法三:

传参echo `cat fla*`,拿到flag。

WEB31:

审计源码发现system被过滤可以用passthru函数绕过,cat被过滤可以用more、less、nl绕过,空格被过滤可以用${IFS}%09绕过。

传参passthru(more%09fla*);拿到flag。

WEB32:

在前面的基础上,过滤了括号,但没有过滤双引号,可以用文件包含绕过。

include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php,拿到flag。

WEB33:

在前面的基础上过滤了引号,用文件包含绕过。

include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php,拿到flag。

WEB34:

增加了过滤:,相同姿势include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php,拿到flag。

CTF