【软件安全】一次投票活动带来的反思
作为一个开发人员,软件可用是最低要求,软件的健壮则是更高的要求,软件安全很多时候基本等于0。绝大多数企业的应用,都会忽略软件安全的因素,看不见的地方有时候才是真实的。
抽丝剥茧
投票页面:
![](http://outytxrp0.bkt.clouddn.com/15043949524433.jpg)
遍历会员数量
通过跟踪Ajax请求,发下提交之后,触发ajax
submit?mid=314925&set=2&DATA=85%7C0&voteId=85&voteCateIds=0
修改其中的mid返回以下内容
{"data":null,"message":"会员信息不存在!","status":"FAILURE"}
通过遍历mid,可以遍历出他的会员数量!
刷票
原理和上面是一样的,我们修改mid之后,就可以伪造投票
网站架构
修改网址之后,返回404
![](http://outytxrp0.bkt.clouddn.com/15043955835377.jpg)
JFINAL 1.6 这应该是个框架,经过查阅资料,发现这是个java框架,这时候事情就好办多了,我们稍微了解框架,就能获得这个后台页面的登陆地址。
获取网站数据
获得系统权限之后,事情就很简单了,系统总会要展示数据给前端,这时候基本就是ajax请求,我们看看他们的请求格式:
admin/member/list?sEcho=3&iColumns=12&sColumns=&iDisplayStart=0&iDisplayLength=14122&mDataProp_0=0&mDataProp_1=1&mDataProp_2=id&mDataProp_3=name&mDataProp_4=id_card&mDataProp_5=gender&mDataProp_6=card_no&mDataProp_7=birth&mDataProp_8=phone&mDataProp_9=&mDataProp_10=status&mDataProp_11=&iSortCol_0=0&sSortDir_0=asc&iSortingCols=1&bSortable_0=false&bSortable_1=false&bSortable_2=true&bSortable_3=true&bSortable_4=true&bSortable_5=true&bSortable_6=true&bSortable_7=true&bSortable_8=true&bSortable_9=false&bSortable_10=true&bSortable_11=true&name=&card_no=&phone=&_=1502437850901
重要的是这个字段
iDisplayStart=0&iDisplayLength=14122
他请求的是长度,我们可以通过修改iDisplayLength,获取所有资料。返回的数据包含了用户id,用户姓名,手机号,生日,地址,基本就是数据库所有字段了,开发根本没有做过滤!
可能他的SQL语句是这样:
SELECT * FROM table WHERE ID=id
数据分析
获取手机号之后,可以进行数据的分析,很容易看出这个活动的效果。
根据手机号获取归属地
https://github.com/SuperID/query-mobile-phone-area
根据归属城市获取地理坐标
https://github.com/lifebeatiful/lat_long_of_major_china_city
数据可视化
根据以上内容,结合百度的echarts,就可以实现数据的可视化!
fake
在查看数据的过程中,发现了大量的这样的数据
![](http://outytxrp0.bkt.clouddn.com/15043969110574.jpg)
嘿嘿,原来虚假投票已经大量的开始了。
总结
产品的开发总是困难的,从想法到实现,总是一段漫长的旅程,我们在实现产品的同时,也要充分考虑安全的因数,特别是这种面向外部的系统~