sql注入详解

目录

前言? ?

一、漏洞原因分析

二、漏洞危害

三、sql注入防范

四、如何挖掘sql注入漏洞

五、常见的注入手法

联合查询(union注入)

报错注入

基于布尔的盲注

基于时间的盲注

HTTP头注入

宽字节注入

堆叠查询

二阶注入

六、sql注入getshell的几种方式


前言

结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)

即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询

在学习sql注入前,我们需要了解sql语句的基本语法 ——>mysql基础学习

一、漏洞原因分析

我们都知道web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源,即然有资源,那么就需要有存储资源的地方——如mysql数据库。那服务器如何对数据获取了?就需要使用SQL语句这一语法结构进行查询获取。SQL语句通过特有的语法对数据进行查询

我们可以举一个例子,以sqli-labs第一关为例,按要求在url后面加上id=1,显示如下

当我们改变id的值为2是,页面发生了改变。说明它将我们输入的数据代入到了数据中进行查询,页面根据输入数据的不同展示的内容也不同。

ps:url中代表传值的意思,id代表变量,后面的"="代表变量的值

为了更清楚的看清sql语句的执行与变化过程,我们先修改源代码,打开Less-1/index.php,在源码中添加如下语句将执行的sql语句打印出来,方便我们查看

echo '执行的sql语句为:'.$sql;
echo '<br/>';
echo '<br/>';

访问页面如下,打印出了执行的sql语句

在1后面加上单引号, id=1’,页面显示有语法错误,说靠近 ‘1’’ limit 0,1有语法错误,我们输入的数据 1’ 被完整的带入到了SQL语句中,即直接与原有的sql语句进行了拼接。然后执行的sql语句变成了

$sql=“SELECT * FROM users WHERE id=’ 1 ’ ’ LIMIT 0,1”;

我们输入的那个单引号和前面的单引号产生了闭合,导致原有后面的那个单引号变成了多余,而sql语法中引号是必须成对出现的否则就会报错。

既然输入的单引号成了多余也就证明程序没有对我们的输入进行过滤,那我们就构造语句将单引号进行闭合就好了。我们在1后面加上单引号,与前面的引号构成闭合,再接着在后面插入我们自己想要查询的语句就可以查询我们想要查询的数据,就这样被脱库的风险就悄悄的发生。

二、漏洞危害

SQL注入漏洞对于数据安全的影响:

  • **数据库信息泄漏:**数据库中存放的用户的隐私信息的泄露。
  • **网页篡改:**通过操作数据库对特定网页进行篡改。
  • **网站被挂马,传播恶意软件:**修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  • **数据库被恶意操作:**数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • **服务器被远程控制,被安装后门:**经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  • 破坏硬盘数据,瘫痪全系统。

三、sql注入防范

解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。通常修复使用的方案有:

代码层面:

  1. 对输入进行严格的转义和过滤
  2. 使用参数化(Parameterized):目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
  3. PDO预处理 (Java、PHP防范推荐方法:)

没有进行PDO预处理的SQL,在输入SQL语句进行执行的时候,web服务器自己拼凑SQL的时候有可能会把危险的SQL语句拼凑进去。但如果进行了PDO预处理的SQL,会让MYSQL自己进行拼凑,就算夹带了危险的SQL语句,也不会进行处理只会当成参数传进去,而不是以拼接进SQL语句传进去,从而防止了SQL注入

网络层面:

  1. 通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
  2. 云端防护(如阿里云盾)

四、如何挖掘sql注入漏洞

1. 注入可能存在的地方

竟然是sql注入,那么这个地方肯定是与数据库有数据交互的,所以我们可以优先观察那种页面存在传值或者查询的地方。比如url中的GET型传参,如id=1

如我们看见这种就可以考虑

或者是搜索框,前端将用户输入的数据代入到数据库中进行查询,这种以POST方法进行发送数据。如下这种地方

或者是HTTP请求头部字段如Cookie值,下面会讲到。

2. 漏洞探测

此时需要我们用burp截取查询的数据包,找到传参的变量然后在其后面加上单引号、双引号等如下payload进行测试

#判断如下闭合方式是否会报错,会报错则肯定存在注入
=test'                         
=test"                         

#若不报错则判断是否存在布尔盲注,如果页面会有不同的显示在可能存在漏洞
=test" and -1=-1 or '
=test" and -1=-2 or '  
         
=test" and -1=-1 or "
=test" and -1=-2 or "

ps:目前网站的sql注入基本都能通过漏洞扫描器xray检测出来 ——> xray与burp联动,但是这样动静太大(公网上),如果在内网中可以直接挂上xray进行检测。所以在公网时可以手动检测是否存在漏洞,然后在存在漏洞的地方打上*,接着复制整个请求包在txt文档中用sqlmap -r进行注入 ——>sqlmap -r

补充:

get型

1. 进行url编码

在url中进行测试payload需要先进行url编码

不进行编码的话,也可以用+代替空格,#代替–+ 。%23代表#,也是注释符

  • 9
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SQL注入是一种利用Web应用程序对数据库进行恶意攻击的技术。它通过在用户输入的数据中插入恶意的SQL代码,从而导致数据库执行非预期的操作。引用介绍了一些SQL注入的常见手段和工具,例如使用--注释符号来闭合注入点、使用#进行闭合注入点、以及使用自动化注入工具sqlmap。sqlmap是一种自动化注入工具,可以自动扫描、发现和利用SQL注入漏洞,并支持多种数据库。引用指出,学习SQL注入的同时,了解和掌握sqlmap工具可以帮助更有效地进行注入测试。另外,引用提到了在注入测试中可能使用的一种技术:在注入点中插入特殊注释符号,如/*!*/内联注释符号,以绕过一些Web应用程序防御措施。 对于您提到的"ifnull",它是一种SQL函数,用于判断字段是否为NULL,并在字段为NULL时返回指定的替代值。它通常用于处理空值的情况,以避免在处理过程中出现错误。例如,可以使用IFNULL函数来判断一个字段是否为NULL,并在为NULL时返回一个默认值。但是,如果在构建SQL查询语句时没有正确过滤和处理用户输入,攻击者可能利用这个函数进行SQL注入攻击。因此,在编写Web应用程序时,应该采取适当的防御措施,如使用参数化查询或输入验证,以防止SQL注入攻击的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [web安全sql注入](https://blog.csdn.net/weixin_54584489/article/details/129139546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [SQL注入详解(下)](https://blog.csdn.net/weixin_59571952/article/details/121728307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值