您的位置:积木首页 >> 黑客技术频道 >> 菜鸟入门 >> 正文:
标题:asp漏洞-基础篇
时间:2005-1-1 来源:不详 浏览数:

作者:009  OICQ:40631476   http://009web.yeah.net

今天给大家讲讲关于asp漏洞的初级知识,老鸟可以略过此文啦!

我第一次接触asp漏洞是著名的"1' or '1'='1",就从这个漏洞开始讲吧,相信大多数人都是从这个漏洞开始的,但是我在网上从来没有用这个漏洞成功过,可能是我知道得太晚了(笨小孩,总是慢人家一拍)。

废话少说,先做准备工作,我们先准备好一台支持asp的系统,我的asp文件放在"D:\wwwroot"目录下,同目录下有一个数据库文件为"user.mdb"(说道asp漏洞都是和数据库有关的),数据库中有一"user"表,表中两个段,分别是"user"和"pass",对应的有一个帐号为"009",密码为"chinese"(如图1),

 

然后开始写代码,重现一下这个漏洞,代码如下,先是"a.asp":


==========================================a.asp==========================================

'以get方式提交表单到b.asp文件,一般这里是post(get方式最多提交1024个字节的内容),这样用户看不到提交的数据
帐号:009

密码:

===========================================end===========================================

 

==========================================b.asp==========================================



数据库中密码:
'同上,显示密码
提交的变量pass为:
'以醒目的红色显示提交的变量

'判断指针是否到了数据的结尾(就是说找不到这样的用户),eof即"end of file"(我是这么认为的)


'这句话很重要,可以显示数据库实际的操作,省了很多事

===========================================end===========================================


OK,浏览http://127.0.0.1/a.asp,然后随便输入,显示错误,输入"chinese"显示成功,然后是关键,我们输入"1' or '1'='1"提交后,显示意料之中的成功。我们看一下执行的语句为,正常的是:"select * from user where user='009' and pass='chinese'",提交了特殊的数据后变成"select * from user where user='009' and pass='1' or '1'='1'",一个"or",就屏蔽了其它的"and",只要后面的为真,那么整个语句就为真,我们还可以这样,我们输入"aaa' or 'bbb'<>'ccc",同样显示成功,执行语句为:"select * from user where user='009' and pass='aaa' or 'bbb'<>'ccc'",不难理解这句话中,"bbb"永远不等于"ccc",总之,只要"or"后面的条件为真就可以。差点忘了还有一点要注意,如果程序员在编程的时候,"sql2"那句这样写:"sql2="select * from user where user='009' and pass="&request("pass")",那么,我们的提交的变量就得做一些相应的变化,"id"应提交的值为:"1 or 1=1",这时候的"1"是一个值,不是字符串了,而上面的用单引号括起来的则是字符串。总之,要把单引号,双引号的配对工作做好:)
基本上来说,asp漏洞主要是程序对用户提交的变量过滤不足造成的,类似如下的语句,肯定是存在问题的:

sql="select * from user where id="&request("id")
ser rs=conn.execute(sql)

仍然用刚才的b.asp做试验,一看就知道sql语句中的那个"request("pass")"变量没有经过严格地过滤,把用户提交地变量直接用于执行数据库操作是十分危险的。如果别有用心的用户提交了精心构造的"pass"变量为:"1' or len(pass)=7 and '1'='1",实际数据库操作的指令是:"select * from user where user='009' and pass='1' or len(pass)=7 and '1'='1'",意思是猜测这位id为1的用户的密码长度是否是7位,后面的" and '1'='1"是为了配对最后一个单引号加上的(还是配对的问题),只要真正的密码不是"1"(否则随便怎么猜都能访问到成功的页面),你就可以根据返回的信息判断密码长度,如果成功访问到页面,说明猜测正确(图2),

否则错误。然后再利用"left","right","mid"函数一位一位地猜测密码,例如提交的"pass"为:"1' or left(pass,1)='c' and '1'='1",意思是猜测密码的最 左边一位是否为字符"c"(图3)。

同样,如果编程者的那句"sql"这样写:"sql2="select * from user where user='009' and pass='"&request("pass")",就不用" and '1'='1"为最后一个单引号配对了,提交的变量为:"1 or left(pass,1)='c'",这种情况下,如果程序屏蔽了"'"的话(如:"replace(request("pass"),"'","")"),还可以用"chr"函数,上面的变量就可以这样提交:"1 or left(pass,1)=chr(99)"(如图4),

字符"c"的ASCII码为99,"chr(99)"就相当于字符"c"。我的经验是:只要不在引号里面,就可以用"chr"函数,否则程序就会把它当成字符串。

可以用"select"猜测用户密码,同样的方法,还可以用"update"修改数据库的内容,一般"update"常见的漏洞是程序对用户提交的数据和当前的用户做检查,还是举个例子比较直观。数据库改成如图5,

编写如下两个文件:

=======================c.asp=========================


输入新密码: '初衷是用来修改用户自己的密码的程序
'以hidden方式提交id,这个值是用户登陆后程序计算出来的

=======================end===========================

 

=======================d.asp=========================



数据库修改前密码:

'把指针指向下一个数据

提交的变量newpass为:


数据库修改后密码:

========================end==========================

程序的初衷是为了让用户修改自己的密码,当用户登陆之后,程序会自动生成这个"hidden"类型的变量"id",值也给出了,只是你表面看不到而已,其实这个"hidden型的数据还是可以改的,只要查看源文件,就可以看到这个"hidden"类型的变量,然后把它的"value"值改成你想要的,如果是"2",再把"form"中的"action"值改成完全的URL地址,然后把文件另存为一个html文件(如图6),

然后本地打开这个文件,在新密码中填入你的新密码,提交后,"id"号为"2"的用户的密码就被改成你刚才填入的密码(如图7)。

除了"selece","update"还有"insert","delete"等,用法都大同小异,只是执行后的效果可能不太一样,读者可以触类旁通,我在这里就不再多废话了,就请读者自行领悟。

说完了ASP+Access版的再说说ASP+MSSQL版,MSSQL给数据库提供了更强大的功能,同时这些功能也可以给别有用心的人利用,下面一起来看看sql给我们增加了那些功能,(先如图8建立数据库)仍然是举例子:

====================================e.asp============================================


帐号:009

密码:

=====================================end=============================================

====================================f.asp============================================



执行后的数据库资料:

====================================end=============================================

如果一个初学者从文章开始看到这里,应该马上可以看出来哪句有漏洞了吧?对,仍然是那个"request("password")"有问题,用Access版的方法同样有效(如图9)。

MSSQL版的肯定还有不同之处,我们还可以这样利用,"password"这样提交:"1';update bbsuser set password='009_password' where username='admin",这样,叫"admin"的这位用户的密码就变成你改的密码(如图10),

如果语句比较复杂,引号配对比较困难的话,还可以在后面加上"--"符号,把后面的语句注释掉(如图11),

如果程序屏蔽了空格(replace("request("password")," ",""),N.E.V.E.R是这样利用的:"1';update/**/bbsuser/**/set/**/password='8888888'/**/where/**/username='admin'/**/--",并没有空格,道理暂时不知道,我笔记上写的,试了一下,可以成功修改密码(如图12)。

MSSQL还提供了"xp_cmdshell"这个强大的扩展存储过程(默认安装,可以删除),我们可以跟用cmd命令一样,你当前什么权限就可以执行什么样的命令,现在我们提交这样的变量:"1';exec master.dbo.xp_cmdshell "net user hack hack /add"--",执行后在系统内添加一个叫"hack"的帐号(如图13,14),

如果系统屏蔽了"_"字符(replace(request("password"),"_",""),我是用wawa的方法,提交这样的变量:"1';declare @a sysname;set @a='master.dbo.xp'+char(95)+'cmdshell';exec @a "net user hack /del"--","declare"是定义变量用的,"char(95)"就是字符"_",执行后系统内的"hack"用户就被删掉了(如图15,16)。


其它的如"update","insert"等,读者可以触类旁通,总之,MSSQL比Acess好利用,利用的方法多。

下面讲讲实际拿到一个论坛的源代码是怎么开始找漏洞的,一般打开一个文件,然后搜索"request",然后找到相应的变量(这个变量必须是用户可以控制的变量),如果这个"request"在"sql"的执行语句里面,那么,恭喜你已经找到了一个漏洞,如果不是,编程者一般会把这个"request"回来的变量重新送给一个新的变量中,例如"UserID=request("ID")",,然后我们继续向下搜索"UserID",看有没有过滤,如果有给了另一个变量,再接着找,知道把变量给MSSQL执行为止。或者倒过来查找,先找"execute"这个字符串,然后找到相应的在MSSQL中执行操作的变量,然后再向上找这个变量,看有没有过滤,知道看到最初的提交的"request"字符串为止,然后看它过滤的程度,构造相应的畸形数据,个人感觉第二种方法较好。哦,别忘了,include的文件也检查一下。

本文总结了asp漏洞方面的基础知识,还有结合了自己的一些技术和经验,相信可以让初学者少走一些弯路,,如果有遗漏或者错误的地方,望指出!


(责任编辑:笑虎)
最近更新
今日推荐
热点文章