zoukankan      html  css  js  c++  java
  • 利用sql报错帮助进行sql注入

    我们可以利用sql报错帮助进行sql注入,这里以sql server 为例:

    sql查询时,若用group by子句时,该子句中的字段必须跟select 条件中的字段(非聚合函数)完全匹配,如果是select * ,那就必须将该表中所有列名都包含在group by 中;若少了哪个,就会报错,报错中会提示如下;

    选择列表中的列 '列名'无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

    这个提示的列名是按该表中的顺序来的,这时我们可以利用这点进行sql注入中枚举所有列的工作;

    先使用 select * from 表名, having 1=1 

    这时报错中提示的便是第一个列名,

    然后 select * from 表名, group by 第一个列名 

    这时报错中提示的便是第二个列名,

    以此类推,便枚举出所有列

    类似的,同过报错提示,还可以知道许多信息,比如,查询条件中与列名实际类型不符合时,会有类型转换失败提示,如:

    select * from Class
    where name=3

    会提示:在将 nvarchar 值 '高数' 转换成数据类型 int 时失败。

    这样我们就能知道 name 列的第一行内容;(在我尝试时发现报错都是尝试将字符转int,所以列名本来为int的,就无法使用,不知对不对?)

    或where name=11/USER

    提示:在将 nvarchar 值 'dbo' 转换成数据类型 int 时失败。

    这样得到user变量的值(这个可用在全局变量和内置函数上,如@@version等等,据说还可以知道任意列名的值,但我没成功)

    等等。

    当然,数据库的报错一般情况下不会直接显示在应用界面,出现在应用界面的提示完全由程序决定;(ps:想必这也是会有错误页面的原因)!

  • 相关阅读:
    composer "Illegal offset type in isset or empty"报错解决方案
    Yii2 使用a标签发送post请求
    YII2 项目安装步骤及异常记录
    三级城市联动菜单
    最新全国省、市、县数据库
    Sanic官翻-SSL示例
    Sanic官翻-WebSocket
    Sanic官翻-部署
    Sanic官翻-概述
    老子的道德经
  • 原文地址:https://www.cnblogs.com/zjdyl/p/4248950.html
Copyright © 2011-2022 走看看