曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4181|回复: 0
打印 上一主题 下一主题

[ASP+ACCESS] ASP 注入基础

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-7-9 20:06:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在做这个基础注入实验之前,应先搭建好 IIS 服务环境以及 SQL 数据库。

这里,系统环境为 Windows XP,SQL 数据库使用 SQL Server 2000 。

在 SQL SERVER 中新建一个数据库 users,它有两个字段,分别是 USERNAME 和 PASSWORD,现在将一条管理员用户名和密码的记录存入其中,如:


创建数据库和建立相关记录可用下面语句:
[Plain Text] 纯文本查看 复制代码
Create database users;
use users;
CREATE TABLE USERS(USERNAME VARCHAR(20), PASSWORD VARCHAR(20));
Insert into users values('admin', 123456);



模拟管理员登录页面的 htm 文件代码为:
[Plain Text] 纯文本查看 复制代码
<html>
<head>
        <title>admin login page</title>
</head>


<body>
        <h1 align="center">Login</h1>
        
        <form action="login.asp" method=post name="loginform">
                UserName: <input type="text" name="username"><br>
                Password: <input type="password" name="password"><br>
                <input type="submit" value="登录">
                <input type="reset" value="重新登录">
        </form>
</body>
</html>

上面代码的效果如下图:


它通过 post 的方式将用户输入的用户名和密码交由 login.asp 这个文件处理,而 login.asp 的代码为:
[Plain Text] 纯文本查看 复制代码
<html>
<body>


<%@LANGUAGE = JavaScript %>
<%
function Login(cn) {
        var username;
        var password;
        
        username = Request.form("username");
        password = Request.form("password");
        
        var rso = Server.CreateObject("ADODB.Recordset");
        var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
        
        rso.open(sql, cn);
        if (rso.EOF) {
                rso.close();
%>
        <h1 align="center">登录失败</h1>
</body>
</html>


<% Response.end()
return;
} else {
        Session("username") = "" + rso("username");
%>


        <h1 align="center">登录成功</h1>
        欢迎, <% Response.write(rso("username")); Response.write("</body></html>"); Response.end()
        return;
}
}
function Main()
{
        var username;
        var cn = Server.createobject("ADODB.Connection");
        cn.ConnectionTimeout = 20;
        connstr = "Driver={SQL Server}; Server=(local); Database=users; UID=sa; PWD=123456789";
        cn.open(connstr);
        username = new String(Request.form("username"));
        if (username.length > 0) {
                Login(cn);
        }
        cn.close();
}
Main();
%>
</body>
</html>

如果用户输入了正确的用户名和密码,那么会出现下面的提示:


如果失败,那么会提示“登录失败”。

在 .asp 文件中,可以采用 VBScript 脚本语言,也可以使用 Javascript 语言,上面使用的是 Javascript ,它由 <%@LANGUAGE = JavaScript %> 这条语句指出。此外,脚本语言部分需要包含在 <%  %> 这对符号中。

在 login.asp 中,定义了 Main() 和 Login() 两个函数,而 Login() 函数由 Main() 函数来调用。下面仔细分析上面的代码:

1. Server.createobject("ADODB.Connection"); 这条语句用来建立 Connection 对象,在 ADO 中建立该象一般需要利用 Server 对象的 CreateObject 的方法。ADO全称为 ActiveX Data Object,它是 Microsoft 为数据库应用程序开发的一种面向对象的,与语言无关的通用数据访问接口。

2. cn.ConnectionTimeout = 20; 这条语句用来设置 Connection 对象的 Open 方法与数据库连接的超时时间,这里是 20 秒。

3. connstr = "Driver={SQL Server}; Server=(local); Database=users; UID=sa; PWD="123456789"; 这条语句是用来指定连接数据库所使用的参数。其中,Driver 指定数据库服务器类型是 SQL Server;Server 指定数据库的地址,本机则为 local ;Database 用来指出数据库名,此处的 users 就是我们上面所建立的数据库;UID 是登录 SQL SERVER 的用户名,这里是 sa,PWD 是 sa 的密码。

4. 接着使用 cn.open(connstr); 语句打开这个数据库连接。

5. 第 45 到 49 行表示,如果从 login.htm 中获取到输入的用户名为空,那么直接关闭连接,此时用户看到的是一个空白页。如果输入了用户名和密码,那么就调用 Login() 函数进行处理。

6. 第 11 行和第 12 行分别用来获得用户输入的用户名和密码。

7. 第 14 行用来建立一个 Recordset 对象。Recordset 对象也称为记录对象。一般用来返回一个记录集,当想查询数据库记录时,就是从数据库中根据指定条件返回一个记录集,该记录集包含了所要查询的全部数据。

8. 第 15 行则是关键 SQL 语句了,注入行为也发生在该条语句之中。需要注意上面的单引号和双引号的连接方法,如果不理解这一点,那么构造的 SQL 注入语句将导致 ASP 的语法错误,这也就是为什么我们经常在注入测试中会给相关的 URL 加一个单引号的原因,如果引起语法错误,那么说明该处很可能没有做相应的参数过滤,而可能发生 SQL 注入行为。

9. 第 17 行使用 Recordset 对象的 open 方法进行数据库查询,这里的 open() 方法里有两个参数,一个是 sql ,一个是传到 Login() 函数的 cn。 sql 是查询数据库语句,而 cn 正是 Connection 对象。可以理解为,我们正是在 cn 这个连接上执行的 sql 语句。

10. 第 18 到 27 行表示如果查询失败,那么返回“登录失败”的提示。这里需要注意,HTML 代码部分不需要包括在 <% 和 %> 之间。

11. 第 29 行建立了一个登录用户的 session 。session 是用来记载客户端信息的,即使一个客户从一个页面跳到另一个页面,session 信息仍然存在。它就像一个超市旁边临时存放个人物品的储物箱,如果你离开后你的储物箱就分配给别人使用。

12. 最后,在第 34 行处发出欢迎登陆用户的信息。

在了解了上面的每一条语句的作用后,下面将构造两种 SQL 注入语句。

第一种注入,可以让我们不用输入与数据库中相匹配的密码即可实现登陆。根据 ASP 文件中的第 15 行 SQL 语句代码,我们在密码输入框里输入:
[Plain Text] 纯文本查看 复制代码
' or '1'= '1

为什么着么写?
第 1 个分号表示促成 password='' 也就是,强制让用户输入的密码为空。但是,接着一个 or 关键字使情况峰回路转,它后面的 '1' = '1 将和 SQL 语句中最后一个单引号构成 '1' = '1' 这样完整的 SQL 语句,而不会导致语法错误。由于,OR 后面的 '1' = '1' 永远为真,因此 SQL 语句执行返回为真,因此这个非法用户可以登录了。被注入后的 SQL 语句变成:
[Plain Text] 纯文本查看 复制代码
select * from users where username='admin' and password='' or '1'='1';

第二种注入,将使而已用户删除掉我们整个数据表,在用户登录输入框里输入以下语句:
[Plain Text] 纯文本查看 复制代码
'; drop table USERS--

该注入输入使 SQL 语句变为:
[Plain Text] 纯文本查看 复制代码
select * from users where username='' ; drop talbe USERS-- and password=''

其中,分号 ; 表示一个查询的结束和另一个查询的开始;而 '--' 连接符号,在 Transact-SQL 中表示忽略 '--' 之后的语句。通过 '--' 字符,可以使这个用户名查询终止,并且不反悔错误,原先后面的 passowrd 验证部分被直接忽略掉,而执行了 drop table users-- 语句,这样就导致了数据库中的 USERS-- 表被删除,这样的后果比第一种绕过验证登陆的情况是更严重的。

上面是 ASP 的注入基础。ASP 的网站现在虽然已经越来越少了,很多网站对这种基本注入问题也会做过滤。因此上文只是一个理论派,然而理解了此基础,在更进一步的学习中将可以触类旁通。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:27 , Processed in 0.082131 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表