这是个实际演示,通过发送伪造的 HTTP Post 请求来欺骗网站服务器,达到人为的数据异常效果。这里欺骗的对象是一个新闻门户网站,伪造的请求是一条新闻评论的点赞。简单说就是一种机器“点赞”的效果。

浏览新闻偶然看到了下图的一则评论“八方点赞哪里去了”(第一条评论),既然这位网友需要“赞”,我就分析一下看能不能给他“赞”。在机器点赞之前,新闻的前三条评论点赞数分别为:442,241,183。

It's about the network
网易新闻评论

页面上的点赞功能一般都要和服务器发生数据交互,首先监听网络通讯数据包,分析其数据交互逻辑。下图抓到的是真人点第一条评论“顶”的数据包,我过滤了无关的内容。按一下“顶”会有连续 2 次 HTTP Post 请求,以下简称为 POST-1 和 POST-2。

It's about the network
POST-1 请求
It's about the network
POST-1 服务器回应

上面两张图是 POST-1 的数据包发送及服务器回应。POST-1 向一个地址 http://comment.api.163.com/api/.../DTR1ENL900097U7R/comments/gentoken...DTR1ENL900097U7R 与新闻的 URI 有关)发送一个 HTTP Post 请求,数据长度为 0。而服务器会回应 {"gentoken":"6b620b1a-d532-462b-95c2-f2a0be39d0ff"}(蓝框),数据长度是 51 bytes。这个信息在 POST-2 会用到,此外还需要注意一下 Cookie(红色框内),因为两次不一样。

It's about the network
POST-2 请求

完成 POST-1 后紧接着就会发送 POST-2,上图则是 POST-2 发送的数据包,向地址 http://comment.api.163.com/api/.../DTR1ENL900097U7R/comments/299766589/action/upvote...DTR1ENL900097U7R 与新闻的 URI 有关,299766589 与评论数据有关,upvote 与“顶”或“踩”有关)发送一个 HTTP Post 请求,数据是 ntoken=6b620b1a-d532-462b-95c2-f2a0be39d0ff(蓝框),数据长度是 43 bytes,此外再看看红框内的 Cookie,会多出 WEB_TOKEN=6b620b1a-d532-462b-95c2-f2a0be39d0ff 的信息,这些信息均来自 POST-1。对于 POST-2 服务器会回应“顶”是否成功,没有其他的信息,这一点后面会提到。

两次 POST 请求后“点赞”动作就完成,总结一下数据交互:页面点击“顶” —> 发送 POST-1 —> 服务器返回一个 TOKEN —> 附带 TOKEN 发送 POST-2 —> 服务器返回“顶”成功或者失败 —> 页面“顶”数据变化。从点击到数据变化这一过程一般不会超过 1 秒。

接下来是编写程序或脚本,构造同样的数据包用同样的逻辑与服务器交互。让服务器认为有个人点击“顶”,从而达到机器“点赞”的效果。从需求上看,浏览器插件、脚本代码、本地(原生)应用程序都可以做到,这里我用了 cURL 来构造数据包与服务器交互。

@echo off
for /f "delims=" %%t in ('curl --silent --data "" "http://comment.api.163.com/api/.../DTR1ENL900097U7R/comments/gentoken..."') do (
    set token_json=%%t
    set token_post=ntoken=%token_json:~13,36%
    set header_cookie="Cookie:WEB_TOKEN=%token_json:~13,36%"
    echo %token_post%
    curl --silent --header %header_cookie% --data %token_post% "http://comment.api.163.com/api/.../DTR1ENL900097U7R/comments/299766589/action/upvote..."
    echo.
)

上面代码即是一次“点赞”。curl 发送一个没数据的 POST-1,向服务器请求 Token。用服务器回应的信息生成 Token、Cookie 信息。curl 发送 POST-2,服务器返回“点赞”是否成功。这段代码不能调用太频繁,因为在疯狂的“点赞”过程中我发现服务器返回如下的信息:

ntoken=4ff00b22-6d09-4384-9274-62ee7d2cb9b3
""
ntoken=1d57dc34-39de-49ab-aaf9-b7249fac9362
{"code":"42900","message":"频率超出限制"}
ntoken=0e9031d2-e284-40fb-8fe9-653c68aab242
{"code":"42900","message":"频率超出限制"}
ntoken=cc5ab02c-06da-469b-84ab-90c91ea5d9be
{"code":"42900","message":"频率超出限制"}

第一次返回信息表明请求成功,而后面的都是“频率超出限制”。服务器会判断过于频繁的“点赞”,当间隔调整到 60 秒一次时均成功,即限制(一个 IP)一分钟最多“顶”一次。经过一番机器“点赞”之后,数据已经变成了这样:1568,275,204

It's about the network
网易新闻评论
  • 2018-10-27 更新
    目前发现网易新闻评论已经改为登录后才能点赞。本文发布于 2018-10-12,当时点赞不需要登录。

参考数据:网易新闻评论(网站、新闻、评论均为“素材”,不代表本人观点)
本文代码仅供参考。