题目
步骤
打开靶机页面,这是一个练习sql注入的专项靶场。
Less-1
提示输入参数id,我们设一个id=1并执行
显示了两行数据,我们更改id的值为2-1
发现数据变化了,id的数据类型应该是字符型,我们继续测试,输入id=2’
结果报错了
再次输入id=2’ and 1=1 --+ ,页面恢复正常,说明id的数据类应该是带单引号的字符
开始使用order by猜解当前表有多少个字段
当到4的时候出现了报错,所以该表应该只有3个字段
使用右联查发现显示在前端的数据分别是第2列和第3列,接下来就是查询出数据库的名称,使用database()函数
得到数据库名称是security,根据数据库名称,查询该数据库下有哪些表,通过MariaDB下的源数据库information_schema
group_concat函数的作用是将多个数据合并为一条
得到有四张表,分别是emails,referers,uagents,users
同样的方法可以根据表名,查询出表中的字段名,最终查询到具体数据
闯关目标为获取flag,将以上四个表字段查询了一遍未发现flag,说明flag不在当前数据库,我们查询下服务器内还有哪些数据库
可以看到里面有个ctftraining数据库,flag多半在这个数据库中
查询下flag表下有哪些字段
只有flag一个字段,那我们直接查询flag的值
得到flag值。
后续关卡将不再详细讲述以上基本sql注入方法,以获取数据库名为通关目标。
Less-2
通过id=3-1,但是显示的是id=2的数据可知,这次id字段的数据类型为字符型
我们直接order by获取字段数
结果还是只有3个字段,通过database()成功获取数据库名
Less-3
这一关通过测试发现id字段是字符型,且是带单引号的,但是后面加入命令后还是报错,说明id字段不仅带单引号可能还带括号,我们继续尝试
当我们加了一个反括号后数据成功显示,说明是带了单括号,剩余步骤与前面一致
Less-4
第四关,根据测试id字段应该是带双引号及单括号的字符型,剩余步骤与前面一致
Less-5
这一关和前面的就有很大不同了,页面回显的数据都是一致的,我们只能知道sql注入的代码执行是否成功
通过测试我们知道id是带单引号的字符型,所以可以采用基于字符型的错误回显注入
报错注入的方法主要有三种
1.floor报错,比较复杂
原理是利用数据库主键不能重复,使用group by分组,产生主键key冗余而报错
id=2' and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata LIMIT 5,1),floor (rand(0)*2)) as x from information_schema.tables group by x) as a) --+
通过爆库让数据库名显示到报错信息中
2.updatexml报错
UPDATEXML (XML_document, XPath_string, new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值,改变XML_document中符合XPATH_string的值
当我们XPath_string语法报错时候就会报错,updatexml()报错注入和extractvalue()报错注入基本差不多。
id=2' and updatexml(1,concat(0x7e,(database()),0x7e),1) --+
3.extractvalue
extractvalue(XML_document,XPath_string)
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
作用:从XML_document中提取符合XPATH_string的值,当我们XPath_string语法报错时候就会报错。
concat和我前面说的的group_concat作用一样
2' and extractvalue(1,concat(0x7e,(database()),0x7e)) --+
Less-6
和关卡5类似,id是双引号字符型
Less-7
这关我们先测试id字段数据类型
经过测试,id字段为字符型且被双括号包含。
同时报错信息为静态固定,无法使用报错注入,也因为正确信息也为静态固定信息,无法使用联合查询注入。
上面提示让我们使用outfile,outfile是sql的语法,可以通过into outfile命令,将查询到的结果写入目标路径,在知道目标系统的绝对路径时可以使用,如
-1')) union select 1,2,database() into outfile"/tmp/1.txt"--+
可以打开1.txt,里面被写入了查询到的当前数据库名
同样也可以写入一句话木马,通过webshell管理工具连接来控制目标主机
-1')) uni