ctfshow_web入门 sql注入(web171~248)
sql注入
这是算是学习+做题+记录的一个笔记吧,而且基本都是看着Y4师傅的博客做的
由于是做过sqli靶场,所以这个就记录快点了。如果靶场没遇到的,也会做笔记。
union 联合注入
web171
首先尝试1'--+
,发现有返回值;说明直接闭合正确;
接着找用来输出的列:1' order by 3--+
,发现一共有3行(就1,2,3,4,5慢慢试出来)
查看数据库:1' union select 1,2,database()--+
得到数据库名为ctfshow_web
爆破表名:-1' union select 1,2,group_concat(table_name) FROM information_schema.tables where table_schecma=database()--+
得到表名:ctfshow_user
爆破列名:1' union select 1,2,group_concat(column_name) FROM information_schema.columns where table_schema=database() and table_name='ctfshow_user'--+
,得到列名:id,username,password
爆破信息:1' union select 1,2,group_concat(id,username,password) FROM ctfshow_user--+
,得到信息:1adminadmin,2user1111,3user2222,4userAUTOpasswordAUTO,5userAUTOpasswordAUTO,6userAUTOpasswordAUTO,7userAUTOpasswordAUTO,8userAUTOpasswordAUTO,9userAUTOpasswordAUTO,10userAUTOpasswordAUTO,11userAUTOpasswordAUTO,12userAUTOpasswordAUTO,13userAUTOpasswordAUTO,14userAUTOpasswordAUTO,15userAUTOpasswordAUTO,16userAUTOpasswordAUTO,17userAUTOpasswordAUTO,18userAUTOpasswordAUTO,19userAUTOpasswordAUTO,20userAUTOpasswordAUTO,21userAUTOpasswordAUTO,22userAUTOpasswordAUTO,23userAUTOpasswordAUTO,24userAUTOpasswordAUTO,26flagctfshow{ce006303-26f7-473b-864d-3055a602ef42}
拿到flag。
整理一下:
有一个问题就是,这里用的是1而不是-1,居然能够爆出信息。可能是这里没有限定输出数据的量,所以能够用1,而不是用-1。
由于是第一题,所以就写的比较多
web 172
这题将ctfshow_user
修改为了ctfshow_user2
发现一个东西:是不是说明:我将最外层的引号给闭合了,那么就相当于将内部的包含完了;
本题,如果我只是传入一个'
,那么"
会被当做数据
web 173
思路一:对查询数据做限定,因为已经知道了,在密码一栏中没有flag
,就如同172最后
思路2:编码绕过,base64,hex
web 174
方法一:
替换:将数据to_base64加密,然后将里面所有的数字用replace()替换
替换方式:1 testa
,2 testb
3 testc
等等
得到base64加密切被替换了的flag
最后解码得到flag
web 175
将数据输出到一个文件中,然后访问对应文件
使用into outfile '/var/www/html/'
将信息输入到文件中去
过滤
web 176
过滤了select
,通过大小写即可绕过
解法二
万能密码:
最后一行是flag
web 177——/**/绕过空格
不知道为啥/**/在后面用不来了
解法一:万能密码
解法二:正常查询
web 178——%090a0b0c0d绕空格*
因为已经过滤了*
,那么就需要用其它字符来绕过空格,可以选择
万能密码
web 179
可以万能密码
把%09 %0a %0b %0d
过滤了,可以用%0c
把上面的那个全换成%0c
web180-182
web 183
对我来说的新姿势:利用正则表达式进行条件限定,就类似where username='flag'
这里用SQL注入靶场的数据做一个演示,以便理解表名列名
只要看得见返回值,是几,就能够说明注入是注入成功了的
然后这里通过盲注来进行解题;
web 184
过滤了:' " 反引号
,用right join
绕过过滤
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
[right join菜鸟教程](SQL RIGHT JOIN 关键字 | 菜鸟教程 (runoob.com))
这里是分别将ctfshow_uer重命名为a和b,接着在b中进行筛选,然后用right join
将b中筛选出来的值与a表的值进行匹配。
有一点奇怪的问题,就是说,在进行测试的时候,得到 $user_count = 22;
作为筛选条件,但是实际上用代码跑flag的时候,却是用 $user_count = 43;
作为筛选条件。
同样,跑出来的flag也有点问题,简单说就是我没做出来。
贴一个Y4tacker师傅的代码
web 185
这个是web184,然后将数字改成true相加即可
还是会遇到一些很奇怪的问题;例如,跑代码时上传的talbeName
能用,但是到网页端提交就不管用;又例如,flag开头应该是ctfshow
,但是跑代码跑出来却是111ihw
,实在有点不知道为什么。
这里贴一个代码,依旧是看着Y4大佬的代码改的,这里也将tableName
的值输出来了,不过改了之后有点不稳定
web 186
同web185
登录类——特性
web 187
用户名:admin
,密码:ffifdyop
题目中 $password = md5($_POST['password'],true);
说明$password
是将$_POST['password']
进行md5加密,再将加密字符串进行编码的结果
编码后正好有'or'6
绕过了密码判断
web 188
payload是:username=0 password=0
原因是:
在比较查询的时候,查询语句为:select pass from ctfshow_user where username = 0 and password = 0;
,由于username password
是字符串,弱比较成了0,0=0成立,所条件就成立了;最后查询语句就成了:select pass from ctfshow_user where 1;
web 189
首先找到flag的位置,接着再对flag进行盲注,这个题,是在web 188的基础上进行的修改
用来盲注的语句为:
布尔盲注
web 190
正常的布尔盲注
web 191
用上面的代码,将url改一下就行,因为过滤了ascii
函数 ,但是我们使用的是ord
。
因为看到了191中过滤有file into
,所以是不是190中可以直接写入木马呢?
web 192
过滤了file|into|ascii|ord|hex
,可以使用正则表达式
web 193
过滤了file|into|ascii|ord|hex|substr
,substr没了,可以用left() right()
,其实也可以用mid()
,这里将数据库名字给改了,和192的不一样,需要重新构造一个用来查询的语句。
看了Y4师傅的代码,惊讶的发现,居然可以将payload的left给去掉,可以直接正则匹配,不过需要起一个'ctfshow{'的头就行就行。Y4大佬的做法是,将{
放到了flagstr
的前边,太顶了!太顶了!实在是太顶了!
想一想,还是Y4大佬的做法比较严谨,以{
开头的话,就不用考虑flag
的前缀是啥了
web 194
过滤了file|into|ascii|ord|hex|substr|char|left|right|substring
,可以用mid
web193已经说过了,可以直接使用regexp
来进行匹配,不需要截断字符比较,所以可以直接白嫖一web193的代码
不过,还是看看Y4大佬的代码,多学习学习的好~
贴一个Y4大佬的宁一种思路
locate:返回要找的str1在str2中的位置;这里依旧是以ctfshow{
开头的
堆叠
web 195
利用堆叠注入:
Y4大佬做法如下
但是我还是理解不了这个包围,没懂题目背后的逻辑,
只是这里用0恰好能够绕过
web 196
真的不懂逻辑
web 199
看样子,像是在先查询了username=1的数据,查询数据库名;同时,由于username=1没有数据,就返回了tables的信息,接着同password进行比较;
web 190~200
Y4大佬真的牛批!!!
sqlmap
web 201_初步-referer
真贴心,还有sqlmap专栏粉了粉了
SQLmap使用顺序:
- 获取当前MySQL中的所有数据库
sqlmap -u http://xxx
- 获取当前数据库名字
- 获取数据库下的数据表
- 获取表下的列名
- 导出数据
要添加一个referer头
web 202_post
使用post方式进行注入,可以直接用--data="id=1"
,也可以--method=post
来触发
web 203_PUT
指定--method=PUT
方法,同时加上-headers="Content-Type:text/plain
,否则put接受不了。同时,要加上index.php,url/api/index.php
WEB 204_cookie
web 205_权限
通过F12中network抓包可以看见,有一个getToken.php
的请求token的动作;
所以paylaod:
web 206_闭合
因为sqlmap会自动闭合,所以直接注入就行
web 207~208 tamper绕过空格
开始编写tamper,用来绕过waf的脚本
看Y4大佬博客学习Sqlmap Tamper 编写
web 209
web 210-212 tamper 加密解密
时间盲注
web 214
Y4大佬这里用的是二分法来做这个,异常语句是用来判断if条件的,如果sleep(1)了,就会触发超时错误(设置了超时时间为1),于是就进入exception了。简单来说就是,用来掐head和tail来缩小范围。
如过用=
来进行判断,就需要用暴力算法,一个一个试了。
web 215
web 216
时间盲注过滤了sleep,其它时间盲注方式
web 221
考察的是limit后面的注入
可以利用 procedure analyse()通过extractvalue进行注入
额,flag居然就是 ctfshow_web-flag_x
,
web 222
group by后面的注入:group by注入原理
这个代码的sleep时间掐得很好,基本不用再跑第二次
web 223
ban了数字,用true代替
web 224——奇怪的文件上传
先扫描到有一个robots.txt文件,接着访问提示的地址(一个设置密码的界面),设置好密码值守,就能够登陆;结果是一个上传文件的操作。。。。
颖奇大佬的博客中提到了这一个题(CTFshow 36D Web Writeup – 颖奇L'Amore (gem-love.com))
(到群里面下载一个payload.bin文件上传,访问1.php,就可以rce)
web 225——堆叠plus
呜呜呜,终于遇到一个能自己做的了
- hander
- 预处理
- show 展示一下表名列名
web 226——堆叠plus
过滤了,handler ()
,可以用16进制绕过,所以,过滤了,但是没有完全过滤
我滴妈耶,为什么用16进制的concat不行喃?额,不知道为啥,concat不能够用;
不过突然绕过弯来,既然已经能够用hex绕过了,就不用concat了
payload大概长这样
web 227——堆叠-MySQL存储过程和函数
考察的是MySQL的存储过程: MySQL——查看存储过程和函数_时光·漫步的博客-CSDN博客_mysql查看函数命令
讲解:
( ctf php sql注入,CTFshow-WEB入门-SQL注入(下)(持续更新)_itwebber的博客-CSDN博客
在 MySQL 中,存储过程和函数的信息存储在 information_schema 数据库下的 Routines 表中,可以通过查询该表的记录来查询存储过程和函数的信息,其基本的语法形式如下:
其中,ROUTINE_NAME 字段中存储的是存储过程和函数的名称; sp_name 参数表示存储过程或函数的名称。
web 228-230
额,代码给得比较玄乎,换句话说就是,把过滤了的关键字函数放到了数据库里面。没有给到页面上。
16进制yyds
web 231——update
真的有点恼火,就是有点找不到他这个提交参数的位置在什么地方,和提交什么参数
整了很久终于整出来了
先来一手
能够修改成功,于是就可以通过username来修改值了
web 232
与231相同
web 233——update盲注
唔,,,为啥又不行了呢?看了Y4大佬博客,说的是要盲注,并且看了代码,唔,太顶了,万物杰克盲注
web 234——update,过滤quote——\逃逸
额,说的是没过滤,看了Y4大佬wp,原来题目将单引号给过滤了,妙啊妙啊
这题可以用\
将查询语句中的单引号过滤掉。原来的语句
$sql = "update ctfshow_user set pass = '{$password}' where username = '{$username}';";
但是传入单引号后
$sql = "update ctfshow_user set pass = '\' where username = 'username';";
这样pass里面的内容就是' where username =,接下来username里面的参数就是可以控制的了
看一眼payload就知道了
web 235——过滤information_schema
[mysql统计信息,表的信息,类似information_schema](概述MySQL统计信息_Mysql_脚本之家 (jb51.net))
CTF|mysql之无列名注入 - 知乎 (zhihu.com)
web 236——update,过滤flag—to_base64
???不是说的过滤了flag吗?有点没懂过滤时在什么地方
看了Y4大佬的博客,看到将查询值to_base64了
那么盲猜是对查询的结果进行了过滤,感觉以前的题目flag是flag{xxxx}
的形式,现在是ctfshow{}
。所以就直接绕过了
web 237——insert
额,这里就是直接点的添加,在弹出来的窗口中查询的
在添加数据的时候进行注入
web 238——insert过滤空格
可以用括号包围;先贴一个查询语句,免得下次看的时候以为多加了一个)
妙啊,过滤*,所以只能用常规方式了,其实于是不能用无列名查询,只是太麻烦了
web 239——insert
过滤了空格和or
用上题目试试,插入失败,盲猜过滤了单引号
果然是过滤了,唔,
还是不行,?难倒不止过滤了单引号?或者是过滤了其它的
唔,原来是过滤了information_schema
,用mysql.innodb_table_stats
代替
看见群里有师傅在问列名是怎么出来的。然后看到一个感觉可以用二分法猜,当时没有电脑,而且外卖刚刚到,就没验证。
验证之后发现:
二分法不行,只能够直接爆破(本质还是才出来的),好在数据库表名都只能小写(其实还是很多情况),这里就只演示一下用burp爆破出来的吧(我的代码能力太弱了,一直找不到时间练习)
爆(猜)表名
已知了列名,并且知道注入姿势
接下来:
burp抓包:
设置payload:
开始爆破,同时不断刷新页面,因为返回值解码后都是插入成功
,所以没有办法通过length
判断flag是否出来
注意:只有正确(数据库中存在)的列名查询出结果后才会添加到列表中,数据没有的列名查不出数据,其结果为空,不会添加到列表中
当跑到这里2000左右的时候出来了flag
brup大概就这么做的;
如果是写代码的话,大概要写两个进程,一个进程用来一直爆破列名,一个进程隔几秒检测一下页面是否有flag。感觉起码得有个什么半个多小时吧。主要俺不会写代码,俺也不知道具体多久。大概要跑1679616条数据。
web 240
唔,额,看了下题和提示,直接放弃,
不用想都知道没法查表名了,而且也不知道列名,,,,
看了看Y4大佬博客,大佬的意思是,列名就是flag,爆破表名就行,
唔,于是大佬写了一个pyhton脚本,额,我这里就用bp了,我比较喜欢用bp,代码写得太烂了
回来刷新一下
贴一下Y4大佬的代码
web 241
我用的盲注的方法,只会盲注,顺带提一下,时间盲注,yyds,
时间盲注的sleep是sleep数据库
哇塞,真的想请教一下师傅们,这个超时时间哪么算,呜呜呜
有点出乎意料的是:一个id可以重复提交
web 242——给导入的文件加上内容
web 243
过滤了php,可以利用文件包含的方式做题
由于是nginx的,所以先整一个auto_prepend_file=1.txt
接着1.txt中写入一句话木马
最后访问就行,但是,我做不出来,一直404,403,405。。。先去做一下244压压惊。
web 244
报错注入
web 245
唔,老老实实用extractvlue吧。。。
web 246
从bit爷那里抄来的第一个报错方式可以用
web 247
用floor代替ceil,马上两点了,有点昏了,是用ceil代替floor,bit爷太顶了
话说回来了,才注意到bit爷用的双注入,赶紧抄一波
web 248
堆叠注入
额,查了一遍发现,flag?中是flag not here。
于是试了一手写入木马,结果不行;查询后发现,@@secure_file_priv: null
就是不能写入文件
sql注入常见方法及udf提权_whojoe的博客-CSDN博客_udf注入
接着还是就不会了
CTFshow---WEB入门---(SQL注入)171-253 WP - Bit's Blog (xl-bit.cn)
过滤
1. 过滤关键字
- 大小写绕过 web 176
2.过滤空格
- 利用
/**/
绕过 web 177 %09 %0a %0b %0c %0d
绕过 web178- 利用用括号包括表名,where语句等 web183 web 238
3.过滤where,ord,ascii等限定字符
as
+right join
+substr(b.pass,1,1)regexp(char(46))
web 184- web 192
4.过滤数字或者字符
情况1:查询结果对数字进行过滤:利用替代 web
情况2:payload对数字进行过滤:利用true相加构造数字 web185
5.md5加密
- [SQL绕过]md5($str,true)类型绕过----题目来源CTFSHOW---web9_Y4tacker的博客-CSDN博客](https://blog.csdn.net/solitudi/article/details/107813286?ops_request_misc={"request_id"%3A"160631731619195283021913"%2C"scm"%3A"20140713.130102334.pc_blog."}&request_id=160631731619195283021913&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_blog_default-1-107813286.pc_v2_rank_blog_default&utm_term=md5 _POST password ,true&spm=1018.2118.3001.4450) web 187
后缀
编码:
新姿势:
- 利用正则表达式进行盲注
- 利用正则实现where功能
- 利用true相加得到指定数字
- 对于只能够输入数字的位置,可以采用盲注
- 盲注可以直接用regexp进行匹配,不需要进行截断
- \逃逸
- 无列名查询
sql 无列名注入_xiaolong22333的博客-CSDN博客
sqlmap
做一个简单的记录
bit爷的报错注入
看过的博客
前女友发来加密的 “520快乐.pdf“,我用python破解开之后,却发现。。。_lexsaints-CSDN博客
前女友婚礼,python破解婚礼现场的WIFI,把名称改成了_lexsaints-CSDN博客
ctf php sql注入,CTFshow-WEB入门-SQL注入(下)(持续更新)_itwebber的博客-CSDN博客
CTFshow-WEB入门-SQL注入(中)_feng的博客-CSDN博客
MySQL——查看存储过程和函数_时光·漫步的博客-CSDN博客_mysql查看函数命令
概述MySQL统计信息_Mysql_脚本之家 (jb51.net)
CTF|mysql之无列名注入 - 知乎 (zhihu.com)
sql 无列名注入_xiaolong22333的博客-CSDN博客太顶了,又学习了
sql注入常见方法及udf提权_whojoe的博客-CSDN博客_udf注入师傅们顶呱呱
感受:
各种大佬们太顶了太顶了,师傅们顶瓜瓜。
猫猫真可爱,我是真的菜
__EOF__

本文链接:https://www.cnblogs.com/upstream-yu/p/15185494.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix