C# 伪造请求的一些记录(遇到过的问题,心得,笔记)

写在开头:这种事好像python干的比较多,不过我还没学所以用C#来实现了,由于我本人比较菜,有理解错的地方请见谅。

前期准备,抓包工具

Fildder抓包工具使用心得

官网下载:Fiddler | Web Debugging Proxy and Troubleshooting Solutions

抓取HTTPS请求:导出CA证书——Tools——HTTPS——(全部勾选并在Actions选择第二个Export Root Certifiate to Desktop),浏览器安装CA证书,重启软件 PS:不同的浏览器导入的方式不一样,Chrome浏览器的是 设置——隐私设置或安全性——安全——管理证书——导入

设置Filters过滤请求:常用(request headers的show only if URL contains显示包含此字符串的URL路径)

增加Method(请求类型)列:右键列选择customize columns,在collection中选择最后一个Miscellaneous,然后field name里选择第一个RequestMethod并添加

Fiddler踩坑:设置代理网络的电脑,Fiddler意外关闭(如任务管理器强制关闭)会清除原来的代理状态,需要重新设置代理网络!

密码形式是JS加密:使用chrome 的F12,打开网站的登录页面——F12,刷新该页面,点击搜索,搜索密码等字段(pwdencrypt),会发现调用了哪个js文件的方法,复制该js文件的内容,VS新建js文件粘贴上去,闭包注释掉(//(function() {...}),js文件属性生成操作改为“嵌入的资源”,然后写个方法调用该js

        /// <summary>
        /// 执行JS
        /// this.ExecuteScript("get('{0}')".FormatWith(token0), File.ReadAllText(Server.MapPath("./encodejs.js"))).toUrlEncode();
        /// </summary>
        /// <param name="sExpression">参数体</param>
        /// <param name="sCode">JavaScript代码的字符串</param>
        /// <returns></returns>
        public static string ExecuteScript(string sExpression, string sCode)
        {
            MSScriptControl.ScriptControl scriptControl = new MSScriptControl.ScriptControl();
            scriptControl.UseSafeSubset = true;
            scriptControl.Language = "JScript";
            scriptControl.AddCode(sCode);//window未被定义 去js定义一个 var window = {};
            try
            {
                string str = scriptControl.Eval(sExpression).ToString();
                return str;
            }
            catch (Exception ex)
            {
                string str = ex.Message;
            }
            return null;
        }
        /// <summary>
        /// 调用Js的加密
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        public static string GetYYPwd(string password)
        {
            System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
            StreamReader txtStream = new StreamReader(asm.GetManifestResourceStream("Demo20220530.JS.pwd.js"));
            string str = txtStream.ReadToEnd();
            string fun = string.Format(@"enc('{0}')", password);//加密方法 PS:这个方法是没有的,自行在js创建并调用加密方法
            string result = ExecuteScript(fun, str);//要执行的方法,JS
            return result;
        }


        //js里自行创建的enc方法
        //function enc(pwd)
        //{
        //    return RSAUtils.encryptedString(pwd);
        //}

Chrome F12常用:

Fetch/XHR:HTTP数据请求的一种方式

文档(document):可以看到请求了哪些网页

这两个的数据,点击名称进去可以看到对应请求的信息,标头(请求头,响应头等),载荷(post请求的postData),响应(响应了什么东西,文本形式展示),然后再根据所需要的参数去伪造以达成目的。

遇到的问题:伪造ASP.NET的Post请求时有这几个参数:__EVENTTARGET、__EVENTARGUMENT、__VIEWSTATE、__EVENTVALIDATION,这几个参数,第一次访问页面时可以发现响应页面中有隐藏域存储着这些值

 我们通过正则来拿取这些值

            regex = new Regex("input type=\"hidden\" name=\"(?<Name>.*?)\".*?value=\"(?<Value>.*)\"");
            MatchCollection mc = regex.Matches(result);
            string postData = string.Empty;
            foreach (Match m in mc)
            {
                postData += m.Groups["Name"].Value.Trim() + "=" + HttpUtility.UrlEncode(m.Groups["Value"].Value.Trim());
                if (postData != null)
                {
                    postData += "&";
                }
            }

可以发现我这里进行了URL编码(HttpUtility.UrlEncode),这个坑卡了好久,最后查到是编码的问题,把值编码之后再添加进postData就过了。

Asp的网站基本上都有__VIEWSTATE这种验证,流程基本上都是第一次访问网站之后把隐藏域的内容(__VIEWSTATE)取出来,然后带上这个参数即可。

遇到的问题:在构造某个网站的请求时,发现了一个编码问题,比如说:正常的中文URL编码之后会是像这的%E6%98%9F%E7%A9%BA%E6%B8%AC%E8%A9%A67,然后遇到的问题是,传到后台去的编码实际上进行了二次编码,也就是HttpUtility.UrlEncode(HttpUtility.UrlEncode("文本")).ToUpper(),编码了两次,而且还要转成大写(ToUpper),不然验证还是过不了。

                string name = string.Empty;
                regex = new Regex("[A-Za-z0-9_]");
                foreach (char c in textBox1.Text.Trim())
                {
                    if (!regex.IsMatch(c.ToString()))//如果不匹配正则(英文不需要进行转码操作)
                    {
                        name += HttpUtility.UrlEncode(HttpUtility.UrlEncode(c.ToString())).ToUpper();//中文需要进行转码大写化操作
                        continue;
                    }
                    name += c;
                }

遇到的问题(src欺骗):要爬某个网站的图片,一般是去查看响应的网页,然后找到要爬的图片的控件,然后拿到他(们)的网络源地址,然后请求并保存,不过这里遇到一个问题,发现<img src='//c.......' data-original='aHR0cHM6Ly9zMS5jaHUwLmNvbS9zcmMvaW1nL3BuZy9....',这个img 的src里面的地址是假的,我理所当然的上钩了,经过问大佬和百度等各种操作之后发现这个 data-original 里面是base64加密的把它解密之后,F12审查页面元素跟该图片的地址进行对比,一模一样!

本篇文章是给自己做个记录,当然也欢迎大家学习交流。

猜你喜欢

转载自blog.csdn.net/qq_51502150/article/details/125160334