论坛: 菜鸟乐园 标题: ASP字符过滤漏洞 复制本贴地址    
作者: shli [shli]    论坛用户   登录

/*-----------------------------------------------------------------------*
* Documents name - ASP 字符过滤漏洞
* Original - HNC
* Author - shli
*-----------------------------------------------------------------------*
* Information(s)
* Site - http://www.hnc.rr.nu/
* Mail - shenli990 by yahoo.com.cn
*-----------------------------------------------------------------------*/

/*[]---------------------------------------------------[]*/
/*| |*/
/*| This documents come from HNC. |*/
/*| (HNC - The hacker net of China.) |*/
/*| |*/
/*| Turn to carry to please note HNC with the author. |*/
/*| HNC All Rights Reserved. |*/
/*| |*/
/*[]---------------------------------------------------[]*/


对象:了解点 SQL 命令或了解 ASP 编程的
重点:了解一般的 ASP (Active Server Pages,服务器端的脚本编写环境)中的 SQL (select重点)语句,以及ASP中的字符过滤漏洞的原理
学点:学习重点


经过前面讲解的 ASP 基础以及 ASP 中最基本的 SQL 语句,你一定对 ASP 编程有了一定的了解.这期我们就讲网上曾火暴一时的 ASP 字符过滤漏洞的应用及其原理.

不要怪我废话多,在讲这节课前,请大家默想3分钟:我以前写的文章你看了吗?或者是你看懂了吗?好好的回答我这个问题就可以了,如果以前你没有看懂,或者没有看的话,而且又是一只大菜鸟,那剩下的你也别看了,看也看不懂啊,我赞成是弄懂,而不是死记.如果以前的文章或以后的文章中有什么不懂的地方,你可以到论坛去问.只要问题合理,只要我们知道,我想我们不会不回答的.
好了,在看了以前我的文章后,你一定知道了以下语句是什么意思:
SQL="SELECT USERNAME,PASSWORD FROM USER_DTA"
SET RS=CONN.EXECUTE(SQL)
对头,就是从数据库中的 USER_DATA 表中打开字段为 USERNAME\PASSWORD 的数据.好了,能弄懂就行了,我们今天重点分析的也就是这条语句了.
先分析一下下面代码:
<%
dim username,password
'定义变量 username,password
username=trim(request.form("username"))
'从提交的表单中获得 username 的值赋给 username
password=trim(request.form("password"))
'从提交的表单中获得 password 的值赋给 password
'其中的 trim 是去除两边的空格
sql1="select name,password from user_data where name='"&username&"' and password='"&password&"'"
set rs=conn.execute(sql1)
if rs.eof and rs.bof then
'判断数据是否到达最前一条或最后条,如果没有该条数据则显示
%>
<form method="POST" action="#">
<tr bgcolor='f0f0f0' height=300><td width="100%" align="center">
<p>用户登陆</p>
<p>Username:<input type="text" name="username" size="20"></p>
<p>Password:<input type="text" name="password" size="20"></p>
<p><input type="submit" value="提交" name="B1"> <input type="reset" value="重写" name="B2"></p>
</td></tr></form>
<%else
'如果有该数据则显示
%>
登陆成功
<%end if%>
还有种写法就是
.....
sql1="select name,password from user_data where name='"&username&"'"
set rs=conn.execute(sql1)
if rs("password")<>password then
.....
.....
else
....
end fi
从上面的代码看了,是个用户登陆的页面,if…then…else…end if这条判断语句就是判断当前用户是否存在,如果存在则显示 else 后面的内容,如果不存在则显示登陆框.假如数据中的 User_Data 表中的数据如下:

Id Name Email Web PassWord
1 shli shli@hnc.com http://www.hnc.com/ 223322
2 hnc hnc@hnc.com http://www.hnc.net/ 223322
3 test test@hnc.com http://www.hnc.com/ 332233
4 hoho hoho@hnc.com http://www.hnc.com 223322
5 测试 test2@hnc.com http://www.hnc.com 332233
6 黑客网 hnc@hnc.com http://www.hnc.com 223332
7 WebMaster Webmaster#hnc.com http://www.hnc.com 343244

可以看得出,用户(Name) shli 对应的密码(PassWord)是 223322
........
........

如果我们从表单中提交数据中没有的用户或提交用户对应的密码是错误的,那肯定无疑是错误的.
我们可以分析以下 SQL 语句
sql1="select name,password from user_data where name='"&username&"' and password='"&password&"'"
打开 where name='"&username&"' and password='"&password&"' 的数据,可以看得出 name 和 password 都为字符窜,而字符窜在 SQL 语句里得使用 '和' 包含起来,上次讲了 where 语句的 or \ and \ not (或 与 非)用法,看看 SQL 数据中的 where name='"&username&"' and password='"&password&"' 使用了与(and),在这里我们可不可以使点小手段呢?从 or 开始吧!如果我把 限制的条件改为 where name='' or ''='' and password='' or ''='' 的话?~_~_~_~就变成了当用户名为空或 空=空 密码为空 或 空=空,实际上 空是等于空的,所以我们改良的 SQL 语句也就成立了~_~_~_~_~换钟方式时思考,如果我知道其中的用户而不知道密码,是不是同样的也可以进入?这里那 shli 这个用做实验~_!_~_~,把 SQL 改为:
sql1="select name,password from user_data where name='shli' and password='' or ''=''"
就是当用户名为 shli 时,密码为空或空=空时,密码为空不成立,空为空成立,所以该语句成立.所以我们一样也可以进入.
在来看看 and, 与,我们不如果了,做个假设,刚刚我们能改为 or 什么的,主要是 or 的一个特性,只要有一个成立,它就成立,,而 and 是只要一者不成立就不成立,我当然希望成立的机会大些啊~~所以 and 的 成功几率就很低了,我也不想做如果了.试过了,几乎不可能成功,至少我试了没有成功过.关于 not 那就更不用试了,当某某不是的时候成立,你也许会说,SQL语句可以改为:
sql1="select name,password from user_data where not(name='"&username&"' and password='"&password&"')"
不就可以了吗?
你很聪明,学得很快,但如果你真的很聪明的话,你就不会说这么笨的话了,看看下面的就知道为什么我这样说了!_~_~_~_~_~_~
我们修改 SQL 语句主要的路径是从 FORM 表单中提交的数据,包含有 '或" 达到中断并修改 SQL 语句中的条件语句,当然这样做地得有个前提,那就是对方没有进行 ' 的过滤.之所以我们可以中断它的 SQL语句最主要的原因是在 SQL 中字符必须使用 ' 或者" 分割开来.于是我可以在提交数据时,在数据中带上 '或" 来达到中断 SQL 语句的目的,为什么我们不使用 " 呢?在 SQL 语句中 它回默认把 " 替换成 [ 或 ] 的.
关于 这次的文章主要内容到次结束,希望你能理解.下面我有要说少许的废话了,你不用看了~_~_~_~

上面所提的字符过滤漏洞,其实早就被发现了,只是很多初学者的疏忽和对 ASP 漏洞的了解甚少所造成的,希望这篇文章能过帮助那些 ASP 初学者,也捎带给"老学者"提个醒:在 ASP 中,最好能严格的控制字符和数据的判断,当然这是下次要讲的 SQL 注入漏洞了,关于 ASP 的漏洞,我会尽量的把我知道我全写上来,也会做个整理,整理个漏洞的解决方法的原理.其实我也是个 ASP 初学者而已,本站就是我的第一个 ASP 作品,属于全站程序,在这里我也要好好谢谢那些公开原代码的程序员!!!!!
此漏洞的解决方法如下:
⒈严格要求输入框中所输入的字符,如含有非法字符或你不想看到的字符,将不允许提交数据;
⒉严格限制用户输入数据的长度,和提交的来源;
⒊过滤掉用户提交的数据中的危险字符.

处于作者知识有限和个 ASP 出学者,文中不免会有遗漏或错误之处,欢迎大家的指出和指正!我的联系方式上面已经写了,你也可以到 中国黑客网 来讨论!

关于本文的相关动画教材在 中国黑客网 下载栏目里可以找得到,你也可以到在线教材栏目中在线收看.


相关动画: 点击下载


地主 发表时间: 04-04-28 10:14

回复: shli [shli]   论坛用户   登录
|

B1层 发表时间: 04-04-29 15:58

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号