这个脚本的原理很简单:发送伪造的 HTTP POST(点赞)请求来欺骗服务端,使点赞数据发生变化。不调用任何服务端 API 接口,不使用第三方服务,更不需要人工点击,也算不上是一种攻击。
这有点像跨站请求伪造(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-Agent
、Referer
等信息,设置 POST 数据(分析目标网站及目标评论得到),然后进入“点赞”循环,每次循环会随机生成 X-Forwarded-For
以欺骗服务器访问是来自代理,“点赞”信息伪造完成后通过 cURL 客户端发给服务器。最后等待一个随机时间再次发送,目的是让这个“点赞”看起来像是人类做的。
在 HTTP 标准中 X-Forwarded-For 表示客户端是通过 HTTP 代理或者或者负载均衡服务器来访问服务端,它可以在客户端主动设置,并不代表客户端事实上使用的代理,如果服务端相信客户端的 X-Forwarded-For 那么服务端就上当了。当然,关于 X-Forwarded-For 很多网站后端也意识到这个问题并且会做处理,所以这条欺代理骗未必会起作用,但是不影响“点赞”。
脚本执行会输入三个参数:target
表示需要点赞的评论;count
表示点赞次数;max interval
表示最大的点赞随机间隔时间(秒),0 则关闭随机间隔。开头的图是点赞的效果,原理很简单,通讯协议可以分析,只要理解 HTTP,你也可以用别的语言来实现。八方点赞,谁都可以做。