SQL注入之less-3

首先在源码中加入:

echo "your sql statement is".$sql."

";

用来输出sql语句,可以更加方便直观的理解此过程。

设置?id=1进行测试,正常访问,可以成功显示数据:

可以看到其查询语句为:SELECT * FROM users WHEREid=('1')

加 ‘ 进行判断,结果显示语法错误:

查询语句变成了:SELECT * FROM users WHERE id=('1''),很明显出现了错误。因此,进行闭合 ‘)--+

执行结果如下:

正常执行,现在通过order by N(N为字段长度)来猜解字段长度

order by =3时,返回正常

order by =4时,出现错误

说明字段长度为3

使用如下payload进行拼接查询

结果如下

显示第2位和第3位的信息。

在前面

less-2

里面我们说过,在知道了显示位之后,可以通过显示位来显示我们想要知道的信息。构造payload需要用到数据库的连接函数,常用的是concat和concat_ws,其中concat_ws的第一个参数是连接字符串的分隔符。

user():返回当前数据库连接使用的用户

database():返回当前数据库连接使用的数据库

version():返回当前数据库的版本

:的十进制ASCII是58,空格的十进制ASCII是32,主要是以:进行分隔

如下

可以看到用户名为:root@localhost,数据库为:security,数据库版本号为:5.7.19

接下来查询security数据库中的表。我们在前面的文章里也总结过,现在我们在来重新回忆一下。

首先说一下mysql的数据库information_schema。它是系统数据库,记录是当前数据库的数据库,表,列,用户权限等信息,下面说一下常用的几个表。

SCHEMATA:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等。

TABLES:储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。

COLUMNS:储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等。

通过直接在mysql控制台实验可以看到,查询information_schema中的信息时,使用where语句值不能直接用英文,要用单引号包裹着,当然用十六进制表示也可以。

payload如下

猜解出users表,进一步猜解,构造如下payload

猜解出ID字段

猜解出username字段

猜解出password字段

未完待续,继续努力!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G01EZD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券