问卷星自写算法
声明:本教程从安全角度出发讲解,只为增加读者的安全知识,提升读者数据安全意识,以及对于病毒和钓鱼网站的防护能力。绝无其他任何目的与用途。
在学校里经常会填写调查问卷,那这些调查问卷到底需要我们的什么信息呢?传输的时候是否会把我们的个人信息传输上去?再就是我们填写的选项到底是以怎样的形式传输的,让笔者为您详述。
笔者为了测试,自己创建了一个问卷星,接下来我选择前两项,点击提交,抓包看看到底会传输什么数据。
依然是我们的POST请求包,不过这次后边有一大堆的参数,我们来详细看看,笔者的params如下:
curid: 76628639
starttime: 2020/5/10 16:00:12
source: directphone
submittype: 1
ktimes: 47
hlv: 1
rn: 3727396004.04013384
t: 1589097777417
jqnonce: eecfe203-8472-40f7-b32c-d0070fbc07c9
jqsign: bbdab574*?305*37a0*e45d*c7707aed70d>
我们发现有两个很显然是经过加密的参数jqnonce和jqsign,我们先直接在search里边搜索jqnonce,只有两个匹配的,而第二个里边声明了变量jqnonce,我们查看上边的参数,发现并不匹配,那就只能是第一个了,我们点入第一个js脚本。
这里有件很奇怪的事,那就是jqnonce取自window,也就是说直接从页面获取,那照这样说,我们上边就该直接取第二个JS脚本里的数值。其实也确实如此,我们之所以看到不一致是因为这里声明了的jqnonce是下一次请求的,也就是说你按下了提交键后才会用的,而我们params里的jqnonce是本次的,根本不是一回事儿。
搞清楚了jqnonce之后,我们来看看jqsign,它调用了一个函数dataenc,既不是rsa,也不是aes,只是自己写了个名字,我们看到这里心里就明白了半分,这必定是开发者自己写的函数,可能会很麻烦,也可能会异常简单,我们来看一看。按下F11,进入dataenc函数,我们发现它把jqnonce当做参数,为了以防万一,我们把这个jqnonce数值和写死在window里边的jqnonce数值对比一下:
我们发现它们一模一样,显然就是同一个参数,那这样就没问题了!我们继续看它的自写加密。它对ktimes进行了取模运算,那我们就需要找到ktimes才行,因为它是个变量,我们就全局搜索一下。发现有9个符合的,它的初始值是0,但是没有哪个函数能让我们具体知道它是多少,我们根据下边的this.onmouseover函数大致推测是鼠标移动到某个控件上,这个数值就会+1。
看代码得不出具体的值,那我们就打开console,在里边输出一下ktimes,发现它是37!
那我们暂时就把它当做37处理,编写以下JS脚本:
function dataenc(a) {
var ktimes=37;
var c, d, e, b = ktimes % 10;
for (0 == b && (b = 1),
c = [],
d = 0; d < a.length; d++)
e = a.charCodeAt(d) ^ b,
c.push(String.fromCharCode(e));
return c.join("")
}
用Python执行一下,得出结果为`3f6cbd?7*b651*33cc*?5bd*ba163122eea2`。
我们让网站恢复运作,把新的提交的POST参数拿过来,笔者的参数如下:
curid: 76628639
starttime: 2020/5/10 16:21:24
source: directphone
submittype: 1
ktimes: 37
hlv: 1
rn: 3727396004
t: 1589098876075
jqnonce: 4a1dec80-e126-44dd-82ec-ef614655bbf5
jqsign: 3f6cbd?7*b651*33cc*?5bd*ba163122eea2
jqsign取出来了,确实如此!
至此,问卷星的自写算法已分析完毕,希望读者能有所得。