昔日

关于having 1=1 和group by 爆表的思考和总结

黑狼's blog | 关注网络安全:

上次在网上看到一篇关于having 1=1 和group by 爆表注射的文章,看得我晕乎乎的,为了了解其根本原理,我稍微学习了下数据库知识,翻了下资料,但有些资料找不到,于是,开始发挥本天才的思维来自己感悟下(只见一块砖头灰过…哦,shit,流血了,shit,shit,shit)。
刚好,找到了一个注入点,自己练习了下,顺便也总结了下。

先说明下这个注射的中心思路:无论用什么方法,就是想办法让sql程序在编译时候出错。

(大家开始可能不知道什么意思,下面我会说清楚,大家带着这个思想去了解,印象会深点,了解之后,就相当难忘了)

还有,这个having 1=1 和group by 使用的条件就是网站是会返回错误信息的,就是所谓的显错模式。

为什么要让sql程序在编译时候出错呢,大家都知道(学过程序的),一般编译软件要运行一段程序,都要经过编译,才能运行,为啥呢。因为电脑不认识什么代码,只认识0 和 1 ,但是我们编程如果都用 0 和 1 来的写的话,那真的是太太麻烦了,所以,出现了编译软件,像c/c++ 啊 ,vb啊 等等,都是将我们的代码转换成 0 1 来让计算机执行。比如 我们的注入语句 select * from admin 这句话我们都认识,但是计算机就不认识了,要先通过我们的数据库程序,将它转换成 0 1 (也好像是十六进制的,具体是什么样子的 我就不清楚了,也没有必要去了解,哈!但道理是这个样子的)交给cpu来执行。

所以,一段代码在执行之前,编译程序会对这段代码进行编译,而软件在进行编译的时候,它会检测你的代码的语法错误,如果有错误,它就会返回一个错误,提示你哪个地方错了,错在什么地方,而且是尽量的详细,为什么会这样呢,因为为了方便程序员改正代码,

所以,这就给我们利用了。编译软件可以检查到语法错误,但检测不出逻辑错误。(关于程序的逻辑错误和语法错误的详细情况大家自己去网上查查吧)

好 下面来说group by 和having 1=1 是的语法规则

GROUP BY 子句

GROUP BY 子句指定查询结果的分组条件。其语法如下:

GROUP BY group_by_expression



参数说明如下:

group_by_expression:指明分组条件group_by_expression 通常是一个列名。



使用时,group by 后面的列名数要和前面的列名数要一致(注意哦仔细看),就是说前面有几个列,后面就要有几个列,除了用聚合函数的列可以不用

比如:

没有使用聚合函数:

select 列名1,列名2,... from admin where id>0 group by 列名1,列名2,...

这里group by 后面的列数就要和前面一致了



使用聚合函数:

select 列名1,sum(列名2) from admin where id>0 group by 列名1

这里的sum(列名2)可以不用,就这样

哦,说到聚合函数,我插一些内容

聚合函数有 sum(求和),avg(求平均值),max(最大值),min(最小值),count(数量) 好像就这些,哈



having子句

HAVING 子句指定分组搜索条件。HAVING 子句通常与GROUP BY 子句一起使用。

having的用法其时和where差不多,就是加了一个查询时的限制条件,其区别在于其作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。什么意思呢

比如

select * from admin where id=1 这里就加了一个条件id=1的项

having也一样

查询有多个员工的工资不低于6000 的部门编号:

select id, count(*) from employee where wage >=6000 group by id having count(*)>1

这里如果看不懂也没关系,和后面的关系不大,最好能看懂,哈,也算是一个知道点嘛



那为什么使用having 1=1 可以爆表呢。关键来了哦,先看刚刚的原文 HAVING 子句通常与GROUP BY 子句一起使用。

因为having 要与group by 一起使用,如果不一起使用,就会出现语法错误,出现语法错误,我们的编译软件就会有错误提示,所以,当一个存在注入点时(这个注入点应该是一个mssql的,access的应该不行),一般的语句是

select 列名1,列名2,列名3 from 表名 where id=xxx

当我们在后面加上having 1=1 时,语句就变成了

select 列名1,列名2,列名3 from 表名 where id=xxx having 1=1

程序在编译时,发现没有group by 就会爆错,提示你错误地方




这里把所有的列名都爆除了,但一般在网页上只能显示一列错误信息,所以就要用到group by 把显示的去掉(减少一个语法错误的地方),来显示下一个错误来爆下一个列名。

评论

热度(1)