sql注入方式
SQL注入
sql注入的原理
SQL注入的原理是利用应用程序对用户输入的处理不当,导致恶意用户可以通过构造特定的SQL语句来干扰和改变原始查询的意图,最终达到执行未经授权的数据库操作的目的。
当应用程序将用户输入直接拼接到SQL查询语句中,而没有对用户输入进行适当的过滤、验证或转义时,攻击者可以输入恶意的SQL片段,进而改变查询的结构和逻辑。这样,攻击者能够绕过应用程序的预期逻辑,执行自己的恶意查询,可能导致泄露敏感数据、执行恶意操作或获取未授权访问权限。
SQL注入可以发生在任何依赖用户输入构建SQL查询的地方,如登录表单、搜索框、URL参数等。攻击者可以通过注入恶意SQL语句,绕过身份验证、访问控制等安全措施,以获取敏感数据或执行非授权操作。
sql注入类型
按照注入点类型来分类
(1)数字型注入点
许多网页链接有类似的结构 http://xxx.com/cnblog.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1
(2)字符型注入点
网页链接有类似的结构 http://xxx.com/cblog.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%'
(4)联合查询注入
它利用UNION关键字将两个或多个SELECT语句的结果合并为一个结果集。攻击者可以通过构造恶意的UNION查询,从数据库中获取敏感信息或执行未经授权的操作。
联合查询注入通常发生在应用程序没有对用户输入进行适当的验证、过滤或转义处理的情况下。攻击者可以构造特殊的SQL语句,通过UNION关键字将其与原始的SQL查询联合在一起,从而改变查询的逻辑和结构,导致意外的结果。
防御联合查询注入攻击,首先,对用户输入进行严格的验证和过滤,确保只接受符合预期格式和范围的数据。其次,使用参数化查询或预编译语句,避免直接拼接用户输入到SQL查询中。这样可以防止恶意用户改变查询的结构。
(5)堆查询注入
它的原理是在SQL查询中,分号(;)用于表示一条SQL语句的结束。攻击者可以尝试在分号后继续构造下一条语句,如果这些语句一起执行,那么攻击者就可以通过添加新的查询或者终止查询,达到修改数据和调用存储过程的目的。
(6)宽字节注入
它发生在使用GBK编码的情况下,GBK编码会将一个字符编码为两个字节。在宽字节注入中,攻击者通过在用户输入中添加特定的字符序列,导致应用程序对其进行错误的解码,进而改变SQL查询的结构,达到注入的目的。
例子一:
在一个简单的用户输入场景中,比如一个表单的输入框,用户输入的内容直接拼接到SQL查询语句中。正常情况下,输入的内容应该被正确地处理和转义,以防止SQL注入。然而,如果应用程序没有正确地处理宽字节字符,攻击者可以利用宽字节注入漏洞。比如,攻击者在输入框中输入%df'
,其中%df
代表一个宽字节字符。在拼接到SQL查询语句时,这个宽字节字符可能会被错误地解析,导致原本的查询逻辑被改变,从而执行攻击者构造的恶意查询。
例子二:
另一个例子是在一个网站的搜索功能中。假设搜索功能的实现是将用户输入的关键词直接拼接到SQL查询语句中进行搜索。攻击者可以尝试输入类似keyword%df' OR '1'='1
的搜索关键词。这个输入中的%df'
会干扰查询语句的解析,使得OR '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 是头部的一个字段。
按照执行效果来分类
基于布尔的盲注
在基于布尔的盲注中,攻击者构造SQL语句时,使用逻辑操作符(如AND、OR)来改变查询的条件,进而根据页面返回的结果(通常是True或False)判断条件是否成立。通过这种方式,攻击者可以逐步猜测和获取数据库中的敏感数据。
这种注入方式适用于页面没有详细错误提示或回显的情况下。攻击者通过不断尝试和调整注入语句中的条件,观察页面返回的布尔结果,进而推断出正确的数据。
例子一:
假设有一个登录页面,用户输入用户名和密码进行登录。攻击者可以在用户名输入框中输入类似于admin' AND '1'='1
的语句。如果页面返回登录成功,那么攻击者就能推断出第一个用户名的字符是admin
。这是因为'1'='1'
这个条件永远为真,所以攻击者通过不断变换猜测的字符并观察页面的返回结果,可以逐步获取到正确的用户名。
例子二:
在一个搜索功能中,用户可以输入关键词搜索相关信息。攻击者可以尝试输入1 AND LENGTH(database())>10
,并观察页面返回结果。如果返回正常结果,说明数据库名称的长度大于10个字符。通过不断调整猜测的长度,攻击者可以逐步获取到数据库名称的准确长度。
基于时间的盲注
基于时间的盲注的特点是不依赖于页面的返回内容来判断注入语句是否执行成功,而是通过观察页面返回的时间差异来判断。
在基于时间的盲注中,攻击者构造的SQL语句中包含了能够影响系统运行时间的函数,如sleep函数。当注入的语句被执行时,会引入额外的时间延迟。攻击者可以通过观察页面返回的时间来判断注入的语句是否被成功执行。
这种注入方式适用于那些无法直接通过页面回显获取数据的情况。攻击者可以通过不断尝试和调整注入语句,观察时间延迟的变化,逐步推断出数据库中的信息。
例子一:
在一个电商网站上,用户可以通过输入商品名称进行搜索。攻击者可以在搜索框中输入类似以下的语句:1; WAITFOR DELAY '00:00:05'; --
。这条语句中包含了一个等待时间的函数,会导致系统延迟5秒钟才返回搜索结果。如果攻击者观察到页面出现了明显的延迟,就可以判断注入语句被执行,进而尝试进一步注入其他恶意语句,获取敏感信息。
例子二:
假设有一个论坛网站,用户可以提交评论。攻击者可以在评论框中输入类似以下的语句:1; SELECT * FROM users WHERE id=1 AND SLEEP(3); --
。这个语句中包含了SLEEP函数,会导致系统停顿3秒钟。如果攻击者观察到提交评论后页面加载明显变慢,就能推测出存在注入漏洞,并尝试进一步利用该漏洞获取其他用户的敏感信息。
基于报错注入
它利用数据库的报错信息来获取敏感数据。攻击者通过构造特定的SQL语句,让数据库产生错误,并将错误信息返回到应用程序的页面上。这些错误信息可能包含数据库名、表名、字段名等敏感信息,攻击者可以通过分析这些错误信息来进行注入攻击。
基于报错的注入通常需要满足两个条件:首先,Web应用程序未关闭数据库报错函数,这样攻击者构造的错误信息才能被数据库返回并被应用程序页面显示;其次,后台未对一些具有报错功能的函数进行过滤,这样攻击者才能利用这些函数来触发注入漏洞。
例子一:
在一个简单的登录页面中,用户需要输入用户名和密码。攻击者尝试在用户名字段中输入如下内容:admin'--
。这是一个基于报错的盲注尝试,如果数据库查询没有做好防护,那么这条查询语句就会导致数据库报错。报错信息可能会包含数据库的内部信息,如表结构、字段名等,这样攻击者就能获取到额外的信息。
例子二:
假设某个网站有一个搜索框,攻击者在搜索框中输入:1' or updatexml(1,concat(0x7e,(select * from information_schema.tables where table_schema='database()' limit 0,1),0x7e),0) or '1'='1
。这个输入尝试使用了updatexml函数来触发数据库报错,通过报错信息泄露数据库中的敏感数据。如果应用程序没有合适地处理这种情况,攻击者可能会成功获取到数据库中的表信息。
防御基于报错的注入攻击措施:关闭不必要的数据库报错函数,避免将错误信息直接返回到页面上。其次,对于具有报错功能的函数进行严格的输入验证和过滤,确保不会被恶意利用。此外,采用参数化查询和使用安全的API也是预防SQL注入攻击的有效方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!