危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18982327

对某aspshll登录密码的简单分析

这天在某论坛随便逛的时候,发现有人发了这样一个帖子《看看这个aspshell的密码是怎么加密的》的文章,这勾起了我的兴趣,一般常见的aspshell的密码都是在代码开头处明文定义的,这个shell看来不是这样,马上下载回来,研究研究。

一、初步测试

放在asp环境下运行看看先,访问后登陆界面。

标题是“企业网站后台管理系统”,还有账号密码的输入框,乍一看,还真的挺像某个企业网站的后台管理界面呢,呵呵,有点意思。OK,我们直接EditPlus打开该asp文件,可以发现大部分都是明文代码,并没有经过VBScript Encode的加密,省了我们不少事。开头处代码如下:

UserPass="137298272144298272144298272137298272"


mName="111"


mNamctitle="111"


Copyright="by:111"

看起来像是定义密码和版权等信息的,首先把一串数字赋值给UserPass变量,然后把字符串111分别赋值给mName和mNametitle变量,最后是一个版权相关变量的赋值。常见的aspshell中,UserPass后面的字符串应该就是该shell的密码,这里我们试一下用账号111和密码137298272144298272144298272137298272来登录该sheLl,提示非法登录。

很显然,UserPass变量中的数字串应该是被加密后的内容,而不是明文密码。

二、代码分析

很显然,这里就是此shell登陆验证的相关代码了。首先是两个变量Pos和Pn的赋值,然后定义了一个函数Serinf,注意该函数的参数名有一个是Pos,这里和刚刚赋值的Pos变量名称一样,但是由于变量作用域的原因两者是没有联系的,猜测作者这样定义应该是出于迷惑别人的目的。

这里先把登陆界面密码输入框里输入的内容通过Serinf函数处理,然后把结果和shell开头定义的UserPass变量的内容相比较,如果相同则验证通过,登陆成功。同时我们也发现,此shell登陆验证的流程中,并没有和开头定义的mName等变量相联系,而只和UserPass变量有关,那么我们就可以猜测,登陆的时候只需要在管理密码中输入正确的密码就可以登陆,管理账号是不需要输入内容的。OK,说到这里,大家可能就会明白,前面我们说到的Serinf函数,其功能就是加密字符串,而UserPass变量中存放的就是正确的密码加密后的内容。

这里的加密函数Serinf就是关键了,我们一行行讲解下该函数实现的功能。首先Function

Serinf(getstr,Pos)是声明函数名称为Serinf,两个参数名称分别是getstr和Pos。然后Dim i,newStr分别定义了两个变量i和newStr,接下来一个for循环。循环体的内容就是对参数getstr中每一个字符逐次进行asc变换,将每个字符的ANSI值和参数Pos的值相加运算,得到的结果再和(298361 - Pos)这个数值连接,最后将结果返回。

三、举例说明

到这里大家可能有点犯晕,我们实际处理一段字符串,让大家更好的理解。

如果我们要对字符串abc加密处理,那么首先是将字符a转换成ANSI值97,然后把97和Pos的值相加,假设Pos的值是89(事实上,此sheU中调用该加密函数时Pos的值就是89,我们前面分析代码的时候已经提到Pn变量被赋值为89,调用函数处的代码为Serinf(request.form("pass"),pn),那么传递到形参Pos的值就是Pn变量的值89),那么得到的就是97和89加法运算后的值186,再把186和(298361 - Pos)连接,而(298361 - Pos)的值就是减法运算298361 - 89=298272,那么连接后就是186298272;再对第二个字符b进行相同的变换,得到的结果187298272拼接在上一个结果之后,就是186298272187298272;最后对字符c进行变换。同理,最后得到的完整的abc加密后的字符串就是186298272187298272188298272。

到这里可能大家就了解清楚Serinf函数的具体功能了吧?

将上面的代码保存成jiami.vbs。

大家看,我是不是和我举的例子中得到的结果一样?

现在我们把加密后的字符串替换掉shell开头代码的,UserPass=”137298272144298272144298272137298272”中双引号之间的数字串,替换后为:

UserPass=”186298272187298272188298272”,保存后这个shell的登陆密码就变成abc啦。我们试试看,在asp环境下访问替换后的shell,在管理密码处输入abc,点击登陆系统,看,已经成功登陆了。

四、如何解密

到这里,我们就结束了吗?不,我们还没有完成解密,这个shell的密码只是被我们替换掉了,但是我们怎样才能知道别人的密码是多少呢?

下面,跟我来分析下怎么逆向这个加密函数,首先,我们发现加密后的密文中298272是固定的,这是加密每一个字符后产生的干扰数字,并没有实际的意义,我们将其替换,然后分别对每一个字符加密后产生的数字进行如下逆运算:1、减去Pos得到ANSI值,2、将ANSI值转换成对应的字符。

保存成jiemi.vbs,运行。

我们把未替换密码的原始shell中UserPass变量后的字符串137298272144298272144298272137298272复制到输入框中,点击确定,看,密码明文已经出来了。

OK,到这里我们就知道此shell的原始密码就是0770。我们测试下,成功登陆。

好了,到这里,这个aspshell的登陆密码对我们而言就不再是秘密了,我们可以修改随意修改登陆密码,也可以查看别人的密码了(密码是汉字也可以哦)。

文章结束,谢谢大家的观看。