:老Y的CheckStr()函数、绕过逗号、通配符、另类手工注入、跨站[技术要点]

【关键词】:CheckStr()函数、LoseHtml()函数、绕过逗号、通配符、换行符、替代手动注入、跨站

【技术要点】:

1、探索老Y最新四个漏洞;

2、使用“.” 正则表达式中的“()”表示“匹配除换行符以外的任何字符”,在Html语句的标签中插入“换行符”可以绕过正则表达式过滤器;

3、绕过逗号,替代手动注入。CheckStr()函数过滤逗号,所以不能使用多参数函数,比如字符串截取函数mid(),也不能使用union语句,因为union语句必须保证字段数一致,并且“”和“=”不能使用。等符号,所以用select的like语句逐位猜测匹配密码的MD5码的字符,取值范围:0-9,AF(大小不敏感);

4、 给出了将字符串转换为 Unicode 字符的代码;

【主要内容】:

老Y使用的是伪静态页面(由/Html/Index.asp调用),代码相当简洁,过滤也很严格。数字类型使用LaoYRequest(),字符类型使用CheckStr()等函数防止注入,文本内容使用LoseHtml()函数过滤防止跨站;功能更全面,包括新闻置顶、公告、留言、评论、RSS、用户注册、网站风格、简繁体选择等,动态页面文件更少。

然而,智者必有疏。这篇文章对老Y做了一个全面的分析,我们再次觉得安全一定要仔细过滤!老Y的CheckStr()函数躲过了致命的劫难,因为它过滤了逗号,却忽略了括号,这样我们就可以巧妙的构造Sql语句,达到注入的目的。本文涉及另一种手动注入方法,即绕过mid等函数,使用like关键字进行字符猜测。第二个注入漏洞将彻底破坏旧的Y——删除所有文章,只留下“外壳”——网站框架。并且由于老Y的LoseHtml()函数在使用正则表达式方面存在缺陷,所以我们可以使用插入换行符的方式提交跨站脚本,而且跨站评论也会影响网站首页!如果提交页面跳转、关闭、无限循环等脚本,可以完成类似DDOS的攻击,还可以获得管理员cookies、网页挂马、传播蠕虫等跨站攻击。总之,这一切都是因为旧的Y函数过滤不充分!最后提醒大家:在使用老Y的时候,一定要修改管理员用户表名和后台管理目录。这一切都是由于旧的Y函数过滤不充分!最后提醒大家:在使用老Y的时候,一定要修改管理员用户表名和后台管理目录。这一切都是由于旧的Y函数过滤不充分!最后提醒大家:在使用老Y的时候,一定要修改管理员用户表名和后台管理目录。

漏洞一:js.asp页面漏洞。这个漏洞是由 Magic Springs (bl4ck) 发现的。js.asp页面处理CheckStr()函数过滤的字符时,“|” 其中的分隔符恢复为“,”(即逗号),导致注入。

使用链接:

代码:

|1|1)%09Union%09Select%091|cstr(id)%2Bchr(58)%2Badmin_name%2Bchr(58)%2Badmin_pass|3|4|5|6| 7|8|9%09来自%09yao_admin%09哪里%09(1

//maxlen和num参数不能少

//cstr()函数将数值字段id的值转换为字符串,

//%2B 是“+”,用作连接 id、admin_name、admin_pass 字段

// chr(58) 表示“:”是分隔符

注意:版本2.3和2.4后台认证方式的区别:前者使用16位MD5码作为管理员密码,使用Session进行登录认证;后者使用截获的 18 位 MD5 码作为管理员密码(adminpwd=Mid(md5(adminpwd,32),4,18)),使用 Cookie 进行登录认证。令人费解的变化: 2.3版本虽然Session不能伪造,但是16位MD5码可以在线或爆破。2.4版本改成截取的18位MD5码,虽然不能破解(除非你自己写爆破工具),但是可以被cookies欺骗!这比破解MD5码还方便。

漏洞2:User/UserAdd.asp页面漏洞。因为在User/UserAdd.asp页面中,edit()和saveedit()模块使用CheckStr()函数对数值变量ID进行过滤,从而可以通过手动注入获得管理员密码。del() 和 delAll() 模块不过滤变量 ID。,允许用户随意删除文章。此漏洞需要登录用户才能被利用。

edit() 模块漏洞利用:

编辑任何文章。从代码中不难看出,如果id为“168 OR 1”,保证Sql语句返回非空集合,就会打开id为168的文章编辑界面,saveedit()模块也有这个漏洞,它允许我们修改任何文章。. 请注意,已编辑的文章将变为未审阅。当然,如果只能修改任何一篇文章,这个漏洞的利用价值并不是很高,让我们继续探索。

注入管理员密码。从前面的介绍我们知道2.3版本不过滤逗号,所以构造联合语句相对容易,而2.4版本过滤逗号,使用起来需要一定的技巧,所以这里分别介绍。

绕过逗号,替代手动注入。CheckStr()函数过滤逗号,所以不能使用多参数函数,比如字符串截取函数mid(),也不能使用union语句,因为union语句必须保证字段数一致老y文章系统,并且“”和“=”不能使用。和其他符号,这对我们手动注入提出了挑战。所以考虑使用select的like语句,基本语法如下:

代码:

Select * from yao_admin where admin_pass like 1*

//因为admin_pass的长度是18,所以用“1”和17“?” 要匹配老y文章系统,如果密码的第一个字符是“1”,则Select语句返回,否则不返回。这与 IIF 函数具有相同的效果。

因为 CheckStr() 函数过滤单引号和双引号,所以引入了一个子查询来获取派生语句:

代码:

select top 1 * from yao_admin where admin_pass like (Select chr(49)+chr(42) from yao_admin)

图片[1]-:老Y的CheckStr()函数、绕过逗号、通配符、另类手工注入、跨站[技术要点]-老王博客

// chr(49) 是数字 1,chr(42) 是字符 “*”,chr(63) 是字符 “?”

修改“*”为自己添加的文章ID,如185,可以先“发布新文章”获取文章ID。现在给出要使用的 URL,如下所示:

代码:

(Select%09top%091%09185%09From%09yao_admin%09Where%09admin_pass%09Like%09(Select%09chr(49)%2Bchr(37)%09From%09yao_admin))

//通配符“*”和“?” 在ACCESS的查询界面中应该是”%”,如果用在ADO执行的JET SQL语句中是”_”,chr(37)是字符””%”

这里请注意:ACCESS查询界面中的通配符“*”、“?”等,如果在ADO执行的JET SQL语句中使用,则应为“%”、“_”等,即ANSI SQL 通配符“%”和“_”仅在 Microsoft Jet 4.X 版本和 Microsoft OLE DB Provider for Jet 中有效,如果在 Microsoft Access 或 DAO 中使用,它们将被视为文本。所以在给定的URL,将派生语句中的 chr(42) 即 “*” 替换为 chr(37) 即 “%”。

访问URL后提示“This is not good!”,如图8所示,表示admin_pass密码的第一个字符不是chr(49),即数字“1”,所以改为chr(50)~chr(57), chr(65)~chr(70), 对应数字2~9、@ > 字母A~F(like statements 不区分大小写),如果你正常打开ID为185的文章编辑界面,如图9所示,可以判断出admin_pass密码的第一个字符,然后猜测字符依次在 2、3…18 的第 18 个字符上。

del() 模块漏洞利用。id变量没有过滤,如果id为“1或1”,则网站内的所有文章都会被删除!危害应该非常严重。

这里请注意本文中“or 1”的用法,和大家熟悉的“or 1=1”不同,因为老Y的CheckStr()函数过滤了“”和“=”符号,所以我们使用“数字1”和0可以代表逻辑真假的特征”,构造Sql语句。

漏洞三、评论跨站。老Y在输出memContent即评论的内容时,使用ChkBadWords()和GlHtml()函数过滤Html标签和单双引号,所以不能跨站,但是我们可以使用未过滤的memAuthor来完成跨站-网站目的。在浏览文章的页面底部,“大牌”(即memAuthor)为单行输入字段,不可修改。我们必须修改提交页面如下。注意将Author输入域改为textarea元素,允许输入多行(即可以插入换行符),其中form的action值和ArticleID值根据实际情况修改, 而“ ”是换行符。

LoseHtml()函数代码如下:

代码:

函数 LoseHtml(ContentStr)

Dim ClsTempLoseStr,regEx

ClsTempLoseStr = Cstr(ContentStr)

设置正则表达式 = 新正则表达式

regEx.Pattern = “()”

regEx.IgnoreCase = True

regEx.Global = True

ClsTempLoseStr = regEx.Replace(ClsTempLoseStr,””)

//这一段的意思是:替换“”和空之间的所有字符

RegEx.Pattern = “(&.+?;)”

ClsTempLoseStr = RegEx.Replace(ClsTempLoseStr, “”)

ClsTempLoseStr = 替换(ClsTempLoseStr,VbCrlf,””)

ClsTempLoseStr = 替换(ClsTempLoseStr,VbCr,””)

ClsTempLoseStr = 替换(ClsTempLoseStr,VbLf,””)

//这三句话的意思是把回车换行换成空

…(省略)//过滤单引号、双引号、空格等。

LoseHtml = ClsTempLoseStr

结束乐趣

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论