SQL注入

1.sql注入原理

    • sql注入原理
    • SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来实现对数据库的任意操作。 举例说明: id=GET[‘id’] sql=SELECT * FROM users WHERE id=id LIMIT 0,1
    • 1 、SQL 注入漏洞产生的条件 A:参数用户可控:前端传入的参数内容由用户控制 B:参数带入数据库的查询:传入的参数拼接到 SQL 语句,并且带入数据库的查询
    • 2、关于数据库
    • a) 在 MySQL5.0 版本后,MySQL 默认在数据库中存放一个information_schema的数据库,在该库中,我们需要记住三个表名,分别是 schemata,tables,columns。
    • b) Schemata 表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库名的字段名为 schema_name。
    • c) Tables 表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库 库名和表名的字段分别是 table_schema 和 table_name.
    • d) Columns 表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为 table_schema、table_name、columns_name。
    • 1. 数据库查询语句:
    • 数据库查询语句如下: 想要查询的值 A= select 所属字段名 A from 所属表名 where 对应字段名 B=值 B
    • 关于几个表的一些语法:
    • // 通过这条语句可以得到所有的数据库名
    • 1 | select schema_name from information_schema.schemata limit 0,1
    • // 通过这条语句可以得到所有的数据表名
    • 1 | select table_name from information_schema.tables limit 0,1
    • // 通过这条语句可以得到指定security数据库中的所有表名
    • 1 | select table_name from information_schema.tables where table_schema='security'limit 0,1
    • // 通过这条语句可以得到所有的列名
    • 1 | select column_name from information_schema.columns limit 0,1
    • // 通过这条语句可以得到指定数据库security中的数据表users的所有列名
    • 1 | select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1
    • //通过这条语句可以得到指定数据表users中指定列password的数据(只能是database()所在的数据库内的数据,因为处于当前数据库下的话不能查询其他数据库内的数据)
    • 1 | select password from users limit 0,1
    • 2.Limit 的用法 Limit 的使用格式是 limit m,n,其中 m 指的是记录开始的位置,从 m=0 开始,表示第一条记录; n 是指取几条记录。
    • 3.需要记住的几个函数
    • (a) Version();当前 mysql 的版本
    • (b) Database();当前网站使用的数据库
    • (c) User();当前 MySQL 的用户
    • (d) system_user(); 系统用户名
    • (e)session_user();连接数据库的用户名
    • (f)current_user;当前用户名
    • (g)load_file();读取本地文件
    • (h)length(str) : 返回给定字符串的长度,如 length(“string”)=6
    • (i)substr(string,start,length) : 对于给定字符串string,从start位开始截取,截取length长度 ,如 substr(“chinese”,3,2)=“in”
    • substr()、stbstring()、mid() 三个函数的用法、功能均一致
    • (j)concat(username):将查询到的username连在一起,默认用逗号分隔
    • concat(str1,’’,str2):将字符串str1和str2的数据查询到一起,中间用连接
    • group_concat(username) :将username数据查询在一起,用逗号连接
    • 4.注释符号 三种注释符号: i. 1. #
    • ii. 2. --空格 空格可以使用+代替 (url 编码%23 表示注释)
    • iii. 3. /**/
    • 2.sql注入的类型介绍
  • 2.sql注入的类型介绍
  •             按照注入点类型来分类
          • (1)数字型注入点
            • 类似结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
            • select * from 表名 where id=1 and 1=1
          • (2)字符型注入点
            • 类似结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’ 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
            • select * from 表名 where name='admin' and 1=1 '
            • 我们需要将这些烦人的引号给处理掉。
          • (3)搜索型注入点
            • 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
            • select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'
  •            
    •             按照数据提交的方式来分类
                                    (1)GET 注入   
  •                                             交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。
  •                                  (2)POST 注入
  •                                            使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
  •                                  (3)Cookie 注入
  •                                            HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某
  •                                  (4)HTTP 头注入
  •                                            注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字
  •                                     按照执行效果来分类
  •                                                  (1)基于布尔的盲注
  •                                                            即可以根据返回页面判断条件真假的注入
  •                                                  (2)基于时间的盲注
  •                                                           即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
          • (3)基于报错注入
            • 即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
            • 单引号
            • 双引号
            • 基于数字型注入
          • (4)联合查询注入
            • 可以使用union的情况下的注入。
          • 5)堆查询注入
            • 可以同时执行多条语句的执行时的注入。
          • (6)宽字节注入
            • 宽字节注入主要是源于程序员设置数据库编码与 php 编码设置为不同的两个编码,这样就可能会产 生宽字节注入。GBK 占用两字节,ASCII 占用一字节。PHP 中编码为 GBK,函数执行添加的是 ASCII 编码(添加的符号为‚\‛),MYSQL 默认字符集是 GBK 等宽字节字符集。 输入%df%27,本来\ 会转义%27(’),但\(其中\的十六进制是 %5C)的编码位数为 92,%df 的 编码位数为 223,%df%5c 符合 gbk 取值范围(第一个字节 129-254,第二个字节 64-254),会解析 为一个汉字‚運‛,这样\就会失去应有的作用
          •  
 
posted @   fangdada  阅读(5)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示