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
- 类似结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
- (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 '
- 我们需要将这些烦人的引号给处理掉。
- 类似结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’ 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
- (3)搜索型注入点
- 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
- select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'
- 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 “keyword=关键字” 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’ 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:
-
- 按照数据提交的方式来分类
- 交数据的方式是 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的情况下的注入。
- 可以使用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),会解析 为一个汉字‚運‛,这样\就会失去应有的作用
- 宽字节注入主要是源于程序员设置数据库编码与 php 编码设置为不同的两个编码,这样就可能会产 生宽字节注入。GBK 占用两字节,ASCII 占用一字节。PHP 中编码为 GBK,函数执行添加的是 ASCII 编码(添加的符号为‚\‛),MYSQL 默认字符集是 GBK 等宽字节字符集。 输入%df%27,本来\ 会转义%27(’),但\(其中\的十六进制是 %5C)的编码位数为 92,%df 的 编码位数为 223,%df%5c 符合 gbk 取值范围(第一个字节 129-254,第二个字节 64-254),会解析 为一个汉字‚運‛,这样\就会失去应有的作用
- (3)基于报错注入
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix