SQL注入常见方式

发布时间:2024年01月11日

数字型注入

许多网页都有如下的网址

ww.xxx.com/xxx?id=1

注入点 id 类型为数字,在大多数的网页中,例如查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。

这一类的 SQL 语句原型大概为 select * from 表名 where id=1

若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1,就能查询到关于这张表的全部信息,也就是猜解数据库

字符型注入

针对的是如下类型的网址

www.xxx.com/xxx?username=admin

可以采用:

  • 传入【username=admin' --】或者【username=admin' #】

在实际执行的sql语句中,可能就变成了

SELECT * FROM users WHERE user='admin' -- ' AND password='password'

【--】在数据库中会被解析为注释,实际上执行的是

SELECT * FROM users WHERE user='admin'

又或者,猜解其他内容,如

输入【admin' order by 1#】

实际执行的sql语句可能就会变成

ELECT * FROM users WHERE user='admin' order by 1#`;

在继续输入【admin‘ order by 2#】,以此类推,就可以知道这个users表中有多少列数据

再继续使用联合查询来获取信息,也就是 union select ,再配合一些函数,就会有效果,首先我们需要知道一共有多少列,因为union在查询的时候需要和主查询的列数相同,以两列为例:

我们可以输入【admin' union select database(),user()#】

database() :将会返回当前查询所使用的数据库名字

user() :会返回执行当前查询的用户名

那么实际执行的sql语句可能是:

SELECT first_name, second_name FROM users WHERE user='admin' union select database(),user()#`;

可以再继续输入【admin’ union select version(),@@version_compile_os#】

  • version() :获取当前数据库版本

  • @@version_compile_os :获取当前操作系统

同理的函数还有

  • @@datadir:返回MySQL数据目录的位置

  • @@basedir:返回MySQL安装目录

  • @@innodb_version:返回InnoDB存储引擎的版本号(如果已启用)

  • @@character_set_server和@@collation_server:分别返回服务器的默认字符集和排序规则

搜索型注入

这种注入方式是基于 LIKE 语句进行模糊匹配的查询,例如在一个简单的搜索功能里面,URL可能是:

www.xxx.com/xxx?keyword=【搜索关键字】

那么原始SQL语句可能是

ELECT * FROM xxx WHERE xxx LIKE '%原始搜索关键词%';

首先可以判断是否存在注入,例如修改url,如果页面异常或者报错,则可能存在注入漏洞

ww.xxx.com/xxx?keyword='

再按照上个标题中讲述的方法,进行数据拼接来获得数据

或者是通过表单来提交的,也可以通过这种方式来进行sql注入,上述讲的基本都是GET注入或者POST注入,下文会讲HTTP头部注入


HTTP头部注入

首先,可以了解一下HTTP头部的组成:HTTP详解(请求体,请求体,响应头,响应体) - Teamshare | 天书

Cookie注入

  • Cookie通常用于存储会话ID或其他用户身份识别信息

  • 如果服务器端在执行SQL查询时错误地将未经充分过滤的Cookie内容作为查询参数,就可能导致注入

  • 例如,如果一个网站仅仅将Cookie中的user_id值作为SQL查询的一部分,如 SELECT * FROM users WHERE id = $_COOKIE['user_id'],攻击者可以修改其Cookie值为类似于 'admin' OR '1'='1' 的形式,从而绕过身份验证或获取未经授权的信息

User-Agent注入

  • User-Agent字段被用来标识客户端浏览器的类型、版本以及其他相关信息

  • User-Agent注入的本质也是如果服务端使用了这个字段,并且没有加以过滤或处理,就可能导致注入

  • 例如,如果服务器使用类似 SELECT * FROM users WHERE user_agent = $_SERVER['HTTP_USER_AGENT'] 的查询,攻击者可能会设置一个包含注入内容的User-Agent字符串,如 'Mozilla/5.0 (compatible; SQLInjection; Windows NT 6.1)' UNION SELECT username, password FROM admin_table --,就可以尝试获取敏感数据

总结

  • SQL注入发生在应用将不受信任的用户数据直接嵌入到SQL查询字符串时,没有对这些数据进行充分的验证和转义

  • 攻击者通过构造特殊的输入内容,使得注入的SQL片段与原始查询语句结合后改变其原有意图

文章来源:https://blog.csdn.net/qq_17496235/article/details/135532020
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。