SQLi-Labs系列之堆叠注入

目录

  • 预备知识
    • 堆叠注入
    • 关于SQL基础语句
    • phpstudy介绍
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二

预备知识

堆叠注入

1)概念
Stacked injections:堆叠注入。从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,在mysql中,主要是命令行中,每一条语句结尾加分号;来表示语句结束。这样我们就想到了是不是可以多句一起使用。这个就叫做stacked injection。
2)堆叠注入使用条件
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_query()函数,其只能执行一条语句,分号后面的内容将不会被执行。

关于SQL基础语句

增:

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

删:

delete from tableName where …

改:

update tableName set columnName=value where …

查:

select * from tableName where …

phpstudy介绍

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

实验目的

掌握SQL堆叠注入的基本方法、测试流程。

实验环境

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

实验步骤一

我们的任务分为2个部分:
首先先根据报错或注入测试分析出SQL语句中如何闭合参数,同时我们构造语句闭合前面的参数进行堆叠注入。
1.任务一中是基于GET型的堆叠注入。
2.任务二中是基于POST型的堆叠注入。
任务描述:基于GET型的堆叠注入。
1.启动phpstudy,打开http://localhost/sqli-labs-master/,点击page-3 stacked injections,打开less-38 GET-Stacked Query injection-string。
2.页面提示我们将id作为参数,我们加入参数后,在值后面加入特殊字符,比如单引号,来测试是否具有sql漏洞,且测试参数为字符型还是数字型:

localhost/sqli-labs-master/Less-38/?id=1'

SQLi-Labs系列之堆叠注入_第1张图片
看到蓝色标记处,提示我们多了一个单引号,故可知该参数闭合为单引号闭合。
3.我们尝试在当前查询后面加入分号,构造下一条sql语句。比如此处我们创建一个新的数据表,表中有一个列为id:

localhost/sqli-labs-master/Less-38/?id=1';create table less38(id int(3))%23

SQLi-Labs系列之堆叠注入_第2张图片
4.我们来到后台phpstudy中的mysql命令行,来验证是否sql语句执行成功。

mysql>show databases;
mysql>use security
mysql>show tables;

SQLi-Labs系列之堆叠注入_第3张图片
可以看到语句成功执行,创建了less38的数据表。
5.我们可以做的操作就不止于此,通过一些其他方式,实验者可以自由发挥,可手工注入,可工具注入,得知查询sql语句所在的数据库为security,数据表为users,列名分别为id、username、password,如此,我们可以试着添加一个新的用户进去。

localhost/sqli-labs-master/Less-38/?id=1'; insert into users values ('100','less38','heetian')%23

SQLi-Labs系列之堆叠注入_第4张图片
SQLi-Labs系列之堆叠注入_第5张图片
6.Less-39、less-40实验步骤和less-38是一样的,通过插入特殊字符报错发现只是参数闭合不一样。实验者自行实验。less-41中错误不回显,这时我们可以通过构造sql语句的真假,而页面返回不一样来判断出了参数为整型,那我们在语句后加上分号,之后和less-38一样,如图:

localhost/sqli-labs-master/Less-41/?id=1;insert into users values('101','less41','heetian')--+

SQLi-Labs系列之堆叠注入_第6张图片
SQLi-Labs系列之堆叠注入_第7张图片
7.切换到less-41的后台源代码中来分析漏洞产生的原因:
SQLi-Labs系列之堆叠注入_第8张图片
可以看到在46行源代码中传入参数没有做任何防护,且在48行查询时使用mysqli_multi_query函数进行sql查询。我们直接输入特殊字符分号,加上我们需要执行的sql语句,后台数据库直接代入sql语句执行。

实验步骤二

任务描述:基于POST型的堆叠注入。
1.打开lesson-42,可以看到界面和之前不一样,任务一中我们直接在url上构建sql注入语句,属于get型,less-42是在表单中提交我们构造的sql语句,属于post型。
SQLi-Labs系列之堆叠注入_第9张图片
2.我们尝试使用弱口令进行注入,发现密码处能进行注入。我们猜测后台sql查询语句为select * from users where username=‘$username’ and password=‘$password’,其中username可能做了过滤,而password处没有做过滤,那我们尝试在password处进行堆叠注入。
todo
3.我们在密码处直接用分号结束上一条sql语句,接着创建less42这个数据表。
todo
SQLi-Labs系列之堆叠注入_第10张图片
我们看到后台数据库中已经创建该数据表。
4.同样在密码处我们尝试进行其他操作。比如增加一个用户到users表中。username随便输入,password密码处直接输入:

';insert into users values('110','less42','heetian')#

SQLi-Labs系列之堆叠注入_第11张图片
SQLi-Labs系列之堆叠注入_第12张图片
后台数据库中已经插入,我们尝试使用自己添加的用户名密码登陆。
todo
可以看到已经登陆成功。
5.我们切换到后台源代码中来分析漏洞产生的原因:
SQLi-Labs系列之堆叠注入_第13张图片
在21、22行可以看到和我们猜测的一样,在username参数传入后使用mysql_real_escape_string做了一次过滤。而在password中直接传入后没有做任何过滤,直接代入了sql查询语句。同样在34行进行查询时使用了mysqli_multi_query函数进行查询,导致堆叠注入可能实现。
6.less43、less44、less45和less42原理一样,望实验者自行实验。

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