首先在源码中加入:
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字段
未完待续,继续努力!
领取专属 10元无门槛券
私享最新 技术干货