惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
T
Threat Research - Cisco Blogs
量子位
Last Week in AI
Last Week in AI
aimingoo的专栏
aimingoo的专栏
Martin Fowler
Martin Fowler
F
Fortinet All Blogs
爱范儿
爱范儿
D
Docker
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
A
About on SuperTechFans
P
Proofpoint News Feed
博客园 - 司徒正美
Recent Announcements
Recent Announcements
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Webroot Blog
Webroot Blog
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
SecWiki News
SecWiki News
Attack and Defense Labs
Attack and Defense Labs
Hacker News: Ask HN
Hacker News: Ask HN
AI
AI
博客园_首页
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Recorded Future
Recorded Future
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
T
Tenable Blog
宝玉的分享
宝玉的分享
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Secure Thoughts
C
Check Point Blog
S
Security Affairs
L
LINUX DO - 最新话题
大猫的无限游戏
大猫的无限游戏
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
月光博客
月光博客
Y
Y Combinator Blog

博客园 - 疯子峰

oracle性能分析2 oracle性能分析 诡异的socket连接失败 ELK配置watcher 多进程 vs 多线程 关于时间 ELK日志平台 Java web项目 神舟笔记本安装ubuntu 10.10 安装vs2010 AOP, Aspect-oriented programming 获取淘宝商品描述和价格 - 疯子峰 - 博客园 SPQuery查询语法简要说明(转) - 疯子峰 - 博客园 SPEmailEventReceiver 之导入附件EXCEL 为incoming mail绑定事件,SPEmailEventReceiver 安装Windows 2003更新后导致moss 无法访问 - 疯子峰 Ubuntu 的启动过程概览 linux 全局配置文件 vim 用户配置
wordpress之客户端发布文章
疯子峰 · 2012-12-24 · via 博客园 - 疯子峰

利用客户端程序自动发送文章。

1)获取登录界面,拼装post数据。(引用HtmlAgilityPack)

            string postdata = null;
            HtmlWeb hweb = new HtmlWeb();
            HtmlDocument hdoc = hweb.Load(loginurl);
            foreach (HtmlNode hnode in hdoc.DocumentNode.Descendants("form"))
            {
                if (hnode.Attributes["name"].Value != "loginform") continue;
                foreach (HtmlNode subhnode in hnode.SelectNodes("//input"))
                {
                    if (!subhnode.Attributes.Contains("name")) continue;
                    string n = subhnode.Attributes["name"].Value;
                    string v = subhnode.Attributes["value"].Value;
                    if ( string.IsNullOrEmpty(v) )
                    {
                        if ( n.IndexOf("log") >=0) v = loginname;
                        if ( n.IndexOf("pwd") >=0) v = pwd;                        
                    }
                    v = System.Web.HttpUtility.UrlEncode(v,hdoc.Encoding);
                    postdata += string.Format("{0}={1}&",n, v);
                }
            }
            if (!string.IsNullOrEmpty(postdata)) postdata = postdata.Trim().TrimEnd('&');

2)登录。

必须设置request.AllowAutoRedirect = false,否则直接跳转管理界面,且由于cookie问题,再跳转回登录界面。

CookieContainer cc = new CookieContainer();
            HttpWebRequest request = GetHttpWebRequest(loginurl,"POST");
            request.CookieContainer = cc;
            request.AllowAutoRedirect = false;
            byte[] pbytes = Encoding.UTF8.GetBytes(postdata);
            using ( Stream stream =  request.GetRequestStream() )
            {
                stream.Write(pbytes, 0, pbytes.Length);
            }
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.Found)
            {                

3)获取管理界面。

理论上,cc 中已包含需要的cookie信息,可继续利用 HttpWebRequest 访问管理界面,但实际并不如此。利用fiddler查看程序和浏览器在登录后获取管理界面,比较后如下:

程序:Cookie: wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_33496cfac029fe8684ecd0304af8c268=admin%7C1355837731%7Cfaffab04dbd1b56428680070b340e099

浏览器:Cookie: wordpress_33496cfac029fe8684ecd0304af8c268=admin%7C1354800972%7C20a76f98dc39528a6d99de411b82120b; wp-settings-time-1=1354627518; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_33496cfac029fe8684ecd0304af8c268=admin%7C1354800972%7C5a1f7e076c62af9733457fd0ddca5482

显然Cookie丢失了。两者登录成功后response的内容是一致的,如下:

Set-Cookie: wordpress_33496cfac029fe8684ecd0304af8c268=admin%7C1354802748%7C2a761d1e3dcda51e283132a48d66b83f; path=/wp/wp-content/plugins; httponly
Set-Cookie: wordpress_33496cfac029fe8684ecd0304af8c268=admin%7C1354802748%7C2a761d1e3dcda51e283132a48d66b83f; path=/wp/wp-admin; httponly
Set-Cookie: wordpress_logged_in_33496cfac029fe8684ecd0304af8c268=admin%7C1354802748%7C67b3113747f9bfc16830c786893b54c0; path=/wp/; httponly

其中红色部分即CookieContainer丢失的部分。未继续研究HttpWebRequest,转战Socket,如下:

  3.1)从header中获取cookie信息

string setcookies = response.Headers[HttpResponseHeader.SetCookie];
                setcookies = setcookies.Replace(", ", " ");
                foreach (string sc in setcookies.Split(','))
                {
                    string path =null;
                    string scname = null;
                    string scvalue = null;
                    foreach (string svalue in sc.Split(';'))
                    {
                        string s = svalue.Trim();
                        if (s.Contains("expires")) continue;
                        if (s.Contains('='))
                        {
                            string[] nv = s.Split('=');
                            string n = nv[0];
                            string v = nv[1];
                            if (n == "path") path = v;
                            else
                            {
                                scname = n;
                                scvalue = v;
                            }
                        }
                    }
                    Cookie c = new Cookie(scname, scvalue);
                    cc.Add(new Uri(wpsiteurl + path), c);
                    if ( reqcookie==null || !reqcookie.Contains(scname))
                    {
                        reqcookie += string.Format("{0}={1}; ", scname, scvalue);
                    }
                }

  3.2)利用Socket发送数据

                //socket 方式获取发布文章界面。
                string reqstr = string.Format("GET {0} HTTP/1.1\r\nHost: {1}", adminurl, wpuri.Host);
                reqstr += "\r\nReferer: " + loginurl;
                reqstr += "\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
                reqstr += "\r\nCookie: " + reqcookie;
                reqstr += "\r\nConnection: Close\r\n\r\n";     
。。。

4)同1),从管理界面中获取发布文章的form(name="post")信息,拼装post内容。

5) 利用3.1中的cookie,仍然用socket方式发送数据。

                //发布文章。                
                reqstr = string.Format("POST {0} HTTP/1.1\r\nHost: {1}", posturl, wpuri.Host);
                reqstr += "\r\nReferer: " + adminurl;
                reqstr += "\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
                reqstr += "\r\nCookie: " + reqcookie;
                reqstr += "\r\nContent-Length: " + postdata.Length;
                reqstr += "\r\nContent-Type: application/x-www-form-urlencoded";
                reqstr += "\r\nConnection: Close\r\n\r\n";
                reqstr += postdata;