上次在网上看到一篇关于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 把显示的去掉(减少一个语法错误地方),来显示下一个错误来爆下一个列名。

这里,少了一个admin.id的错误信息。依次类推,就可以把所有的列明都爆出来了。

(转载)关于having 1=1 和group by 爆表的思考和总结的更多相关文章

  1. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  2. [转载][概念]Storage Pool, Private RAID Group, Private LUN

    Storage Pool的起源 ========================== Some time ago, EMC introduced the concept of Virtual Prov ...

  3. Linq中的group by多表多字段

    在sql中,如果有group by,那么select的字段只能包含分组内容,或者count.sum.avg这些统计字段. 但在linq里面,是:group 你想要什么字段 by 分组字段 比如: va ...

  4. Linq中的group by多表多字段,Sum求和

    //Line to Sql 写法 var data = (from a in Items group a by new { a.GroupId, a.Id } into b //orderby new ...

  5. Group by 两表联查取另一表与之关联数据的总数

    使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.Acti ...

  6. 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作

    一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...

  7. (转载)用C#实现MySQL建库及建表

    最近做一个项目,为了方便用户使用,希望可以在系统初始化的时候,自动实现MySQL数据库的建库和建表操作.在网上查了很多资料都没有找到合适的,偶尔在一个国外网站上看到了相关的内容,特把实现方法整理如下: ...

  8. 【转载】如何在Oracle中复制表结构和表数据

    1. 复制表结构及其数据: create table table_name_new as select * from table_name_old 2. 只复制表结构: create table ta ...

  9. 【转载】windows安装python2.7后的注册表问题

    原文出自:https://www.cnblogs.com/tlz888/p/6879227.html [提要]win平台上,python2.7官网的安装包在安装后不会添加环境变量且不会把安装信息写入注 ...

随机推荐

  1. c语言学习之基础知识点介绍(四):算术运算符和逗号表达式

    本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介 ...

  2. 用数据库管理SERV-U的用户时,如何修改密码及原理

    将serv-u设置成数据库管理用户的前提是先要建立数据源 如何用Serv-U连接ODBC|1.可以在 FTP所在服务器安装一个 SQL Server  数据库,也可以使用论坛自带的数据库.建议在 FT ...

  3. 文件上传利器SWFUpload使用指南

    这里就不再介绍什么是SWFUpload啦,简单为大家写一个简单关于SWFUpload的Demo. 1.把SWFUpload 相关的文件引用进来 2.创建upload.aspx页面(页面名称可自定义), ...

  4. PHP 学习笔记 (一)

    1. 在PHP中设置最长执行时间: PHP中的PHP.ini文件中,max_execution_time 项指定了PHP最长执行时间,默认是30秒.有两种方案可以对其进行修改: 1. 直接在PHP.i ...

  5. 图像处理简单实例[OpenCV 笔记1]

    几个入门的简单程序,和对应的CMakeList, 虽然简单重新测一下写一下也是好的. CMake教程传送门 图像显示 ShowImage.cxx #include <opencv2/opencv ...

  6. cmake简易教程

    用cmake替代makefile,构建项目还是蛮简单实用的. 工程目录下src放源代码,build保存所有的编译过程和结果. 首先看看src目录下的源代码结构: 最顶层CMakeLists.txt内容 ...

  7. 5shift shell

    echo offcopy %systemroot%\system32\taskmgr.exe %systemroot%\system32\sethc.execopy %systemroot%\syst ...

  8. JavaScript学习总结【6】、JS BOM

    1.BOM 简介 所谓的 BOM 即浏览器对象模型(Browser Object Model).BOM 赋予了 JS 操作浏览器的能力,即 window 操作.DOM 则用于创建删除节点,操作 HTM ...

  9. 对于volatile的理解

    哎.要学的东西太多,时间太少.一周的工作下来要总结的东西太多,还处理不完,越积越多.大周末的好想出去玩啊.... 得嘞,废话止于此. 无聊时候乱看网页发现了volatile的一篇文章,以前曾经对vol ...

  10. Colletion View 简单的备忘

    UIColletionView 这篇只是做UIColletionView的常用属性.代理方法和数据源方法的备忘,之后做一些自定义布局,增加删除动画等. UIColletionViewFlowLayou ...