精品成品中韩网站源码免费,天津市住房和城乡建设网站,学历提升机构,网站设计在线培训机构0x00#xff1a;前言关于sql注入#xff0c;经久不衰#xff0c;现在的网站一般对sql注入的防护也相对加强了#xff0c;2016年的***测试报告中#xff0c;出现最多的是xss#xff08;跨站脚本***#xff09;和明文传输等#xff0c;但是对sql注入的利用方式#xff0… 0x00前言 关于sql注入经久不衰现在的网站一般对sql注入的防护也相对加强了2016年的***测试报告中出现最多的是xss跨站脚本***和明文传输等但是对sql注入的利用方式也相对成熟详细了解sql注入可以参考之前的文章。http://wt7315.blog.51cto.com/10319657/1828167 今天主要分享下sql注入中的报错型在大多网上的文章会列出类似于公式的句子却没解释为什么要使用这样的函数为什么使用这个函数会出现报错而导致sql注入。0x01报错过程 我们先来了解几个函数。 1. rand()用于产生一个0~1的随机数。 2.floor()向下取整3. rand()函数生成0~1的函数使用floor函数向下取整值是固定的“0”我们将rand*2得到的值就是不固定的“0”或者“1”。4.我们再来查询下当前的数据库我使用的是“dvwa”数据库5.concat()将符合条件的同一列中的不同行数据拼接为了待会便于观察在此插入0x3a0x3a是十六进制的“:”。 6.将之前的rand()函数和floor()函数整合起来。7.查询名字太长我们来起个别名。8.我们再一次进行查询information_schema.tables有多少个表哥会显示多少列。9.group by 依据我们想要的规矩对结果进行分组。 10. count() 统计元祖的个数相当于求和。11.接着我们多重复几次。0x02 rand()和rand(0)1.加上随机因子后执行多次每次都会报错。为了更彻底的说明报错原因直接把随机因子去掉再来一遍看看。2.先看一条记录的时候一条记录的话 无论执行多少次也不报错3.然后增加一条记录两条记录的话 结果就变成不确定性了随机出现报错然后再插入一条三条记录之后也和2条记录一样进行随机报错。由此可见报错和随机因子是有关联的0x03不确定性与确定性floor(rand(0)*2)报错的原理是恰恰是由于它的确定性因为floor(rand()*2)不加随机因子的时候是随机出错的而在3条记录以上用floor(rand(0)*2)就一定报错由此可猜想floor(rand()*2)是比较随机的不具备确定性因素而floor(rand(0)*2)具备某方面的确定性。我们分别对floor(rand()*2)和floor(rand(0)*2)在多记录表中执行多次。可以看到floor(rand()*2)毫无规律可言而floor(rand(0)*2)是有规律的。那么mysql在遇到select count(*) from tables group by x;这语句的时候会建立一个虚拟表(实际上就是会建立虚拟表)整个工作流程就会如下图所示1.先建立虚拟表如下图(其中key是主键不可重复)2.开始查询数据取数据库数据然后查看虚拟表存在不不存在则插入新记录存在则count(*)字段直接加由此看到 如果key存在的话就1 不存在的话就新建一个key。其实mysql官方有给过提示就是查询的时候如果使用rand()的话该值会被计算多次那这个“被计算多次”到底是什么意思就是在使用group by的时候floor(rand(0)*2)会被执行一次如果虚表不存在记录插入虚表的时候会再被执行一次我们来看下floor(rand(0)*2)报错的过程就知道了从0x04可以看到在一次多记录的查询过程中floor(rand(0)*2)的值是定性的为011011…(记住这个顺序很重要)报错实际上就是floor(rand(0)*2)被计算多次导致的。我们做下整理。1.查询前默认会建立空虚拟表。2.取第一条记录执行floor(rand(0)*2)发现结果为0(第一次计算),查询虚拟表发现0的键值不存在则floor(rand(0)*2)会被再计算一次结果为1(第二次计算)插入虚表这时第一条记录3.查询第二条记录再次计算floor(rand(0)*2)发现结果为1(第三次计算)查询虚表发现1的键值存在所以floor(rand(0)*2)不会被计算第二次直接count(*)加1第二条记录查询完毕查询完毕4.查询第三条记录再次计算floor(rand(0)*2)发现结果为0(第4次计算)查询虚表发现键值没有0则数据库尝试插入一条新的数据在插入数据时floor(rand(0)*2)被再次计算作为虚表的主键其值为1(第5次计算)然而1这个主键已经存在于虚拟表中而新计算的值也为1(主键键值必须唯一)所以插入的时候就直接报错了整个查询过程floor(rand(0)*2)被计算了5次查询原数据表3次所以这就是为什么数据表中需要3条数据使用该语句才会报错的原因。0x04loor(rand()*2)报错由于没加入随机因子所以floor(rand()*2)是不可测的因此在两条数据的时候只要出现下面情况即可报错前面几条记录查询后不能让虚表存在0,1键值如果存在了那无论多少条记录也都没办法报错因为floor(rand()*2)不会再被计算做为虚表的键值这也就是为什么不加随机因子有时候会报错有时候不会报错的原因。0x05updatexml报错MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数分别是ExtractValue()和UpdateXML()我们要学习的便是mysql里的修改函数即updatexml函数其实也有extractvalue注入 以后的文章再做介绍。先来做如下操作执行一下报错payloadand updatexml(1,concat(null,(select version),null),1);updatexml的爆错原因很简单updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。updatexml的最大长度是32位的所以有所局限PS但是应对大多的已经足够。如果密码长度超过了32位就不会被显示出来。0x06其余报错函数extractvalue() id 1 and (extractvalue(1, concat(0x5c,(selectuser()))))exp() id 1 and EXP(~(SELECT * from(select user())a))这六个函数总的来说归于一类GeometryCollection()id 1 AND GeometryCollection((select * from (select * from(select user())a)b))polygon()id 1 AND polygon((select * from(select * from(select user())a)b))multipoint()id 1 AND multipoint((select * from(select * from(select user())a)b))multilinestring()id 1 AND multilinestring((select * from(select * from(select user())a)b))linestring()id 1 AND LINESTRING((select * from(select * from(select user())a)b))multipolygon()id 1 AND multipolygon((select * from(select * from(select user())a)b))基于篇幅问题剩下就不解释原理了有机会后面还会详细的介绍。 转载于:https://blog.51cto.com/wt7315/1891458