写在开头:这种事好像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审查页面元素跟该图片的地址进行对比,一模一样!
本篇文章是给自己做个记录,当然也欢迎大家学习交流。