转眼我已经是一只毕业2年的“社会狗”了,近期工作不算忙,想着自己在学习学习,增长点个人兴趣。于是翻出了之前学过的HTML知识,想着自己复习复习,空了可以自己写个网页玩玩。开始了演练,脑子了思考这我的技术老师传授的知识框架,借助这网络知识库,开始敲自己的“网页”代码。
今天学习html页面知识,不曾想在简单的“逻辑”前面就踩坑了,还差点走不出来。相对路径问题。相对路径的问题,本就是2在1之后、1在2之前这样的问题。。排坑之久,让我这只社会狗极其怀疑自己的能力。
如图,根目录下,有如下路径:web\imgs下面是图片,web\css下是样式文件,wen\index.html 是网页文件。就这么一个相对路径问题处踩到坑。
文件相对路径
在web\css\***.css文件中写了下面这个代码引用网页背景图片。
background-image: url(../imgs/background.jpg) ;
代码
然而并不起作用,一直提示访问不到文件。懵逼树下懵逼果。万般折腾,折腾了好久,废了差不多2小时,才捋清楚应该像下面这样写路径。
最后路径
最后虽然是顺利地完成图片引用, 但费了太多功夫,一条道走到黑的方式不可取。思考要灵活变通,该放松就去放松,也许就是转念一想,问题就能想清楚。脑子不一定是越用力越能想通,牛角尖不能钻!
学习网络爬虫要掌握哪些技术?#
挑战升级!老板又为我设定了新的任务目标:利用C#开发一款超能爬虫,它必须深入挖掘我们网站的每一个细节,不论是主体内容、相关链接,甚至是细微至页面标题,都需快速精准获取,全程保持高效稳定的运行状态。
这不仅是一个任务,还是一次创新能力的试炼。那天,我坐在电脑前,心里琢磨着,这得怎么开始呢?
好吧,我得先熟悉我们网站的结构,就像了解一个新朋友一样。我打开了浏览器,一页一页地翻,仔细观察那些HTML代码,找到了BODY、链接和标题的蛛丝马迹。
根据我们网站结构,我开始了针对这个任务的计划:
需求分析:
抓取页面内容(BODY):需要从目标网页中提取出HTML的主体部分,这通常包括文字、图片、视频等内容。
抓取网站链接:我需要识别网页中的超链接(如<a>标签),并提取出它们的href属性,以获取其他相关页面的链接。
抓取页面标题:页面标题通常位于<title>标签内,我要能够提取并存储这些标题信息。
技术选型:
由于使用C#作为开发语言,我可以使用HttpClient来实现HTTP请求和响应处理。利用解析库(这次用AngleSharp)来解析网页内容,提取所需信息。
主要实现步骤:
初始化:设置爬虫的基本配置,如并发请求数、超时时间等。网页抓取:通过HTTP请求获取目标网页的HTML内容。内容解析:使用HTML解析库提取页面内容、链接和标题。数据演示(实际是要保存的):将提取的信息展示到控制台中显示,以便查看、分析和处理。错误处理:实现适当的错误处理机制,如展示异常记录等。
测试与验证:
对爬虫程序进行单元测试,确保每个功能模块都能正常工作。进行集成测试,确保整个爬虫流程的流畅性和稳定性。在实际网站上进行验证,确保抓取到的数据准确无误。
维护与更新:
定期检查爬虫程序的运行状态,及时处理可能出现的问题。根据网站结构和内容的变化,适时更新爬虫程序以适应新的抓取需求。当然,原来的爬虫程序需要改进,功能需要增强。
根据这个计划,我初步修改了原来的代码,把要求的三个功能都完成了,看效果:
关键实现代码:
// 发送HTTP GET请求并获取网页内容
public async Task<string> GetWebPageContentAsync(string url)
{
try
{
HttpResponseMessage response=await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content=await response.Content.ReadAsStringAsync();
return content;
}
catch (HttpRequestException e)
{
Console.WriteLine($"从URL {url} 获取内容时出错: {e.Message}");
return null;
}
}
// 解析网页内容,提取<body>、链接和标题
public async Task CrawlAndParseAsync(string url)
{
string content=await GetWebPageContentAsync(url);
if (content !=null)
{
var document=_htmlParser.ParseDocument(content);
// 获取并打印<body>的内容
var bodyContent=document.Body.InnerHtml;
Console.WriteLine($"网页<body>内容:\n{bodyContent}\n");
// 提取并打印所有链接
foreach (var link in document.QuerySelectorAll("a[href]"))
{
var href=link.GetAttribute("href");
Console.WriteLine($"找到的链接: {href}");
}
// 提取并打印页面标题
var title=document.Title;
Console.WriteLine($"页面标题: {title}");
}
}
如有需要完整代码的朋友,请关注我并留言。
准备启动信息收集工作,页面上有三个地方引起了我的注意:.do 的接口地址、登录功能、密码找回功能。
审查 .do 接口。看到 .do 自然联想到 struts2 命令执行全家桶。
安恒出品的 S2 漏洞验证工具扫描下:
扫描不出漏洞
审查登录功能。登录功能的审查点很多,比如账号是否可枚举、密码是否可暴破,但前提是没有验证码,显然这里存在图片验证码,所以,我先确认验证码是否可绕过。
拦截登录请求:
应答标志为 2,第二次重发,应答标志变为 1
显然,验证码防御机制有效,虽然 python 调用 tesseract 识别图片的手法可有效攻击图片验证码,但需要我爬取该站的大量图片来训练,这个阶段无需太深入,暂时放一放。
审查密码找回功能。密码找回功能很容易出现逻辑错误,经验来看,至少可从七个方面攻击密码找回功能:重置凭证接收端可篡改、重置凭证泄漏、重置凭证未校验、重置凭证可暴破、用户混淆、应答中存在影响后续逻辑的状态参数、token 可预测。
访问密码找回页面:
拦截密码找回的请求:
从应答描述可知,提示该用户不存在,重发几次,结果相同,说明图片验证码未生效,好了,第一个洞,用户名可枚举。
显然,用户名在该请求的 params 参数中,URL 解码可得明文:
于是,将 root 设定为枚举变量,加载中国人姓名(top500)、后台账号两个字典,进行枚举:(这里需要的注意的是,大部分的系统可能存在黑名单校验,枚举时可使用VPN进行IP轮换)
得到三个有效账号:nana、admin、liufei。
随意选个账号进入密码找回流程,liufei,应答为 JSON 数据,格式化后吓我一跳:
敏感信息大赠送!有邮箱,甚至有哈希密码。记下来,第二个漏洞,账号相关敏感信息泄漏。
我的目的很明确,获取登录密码,所以,我计划利用泄漏信息,从信息库和哈希反解两方面达到目的。
信息库。提取邮箱中的用户名,liufei 的 liufei、nana 的 18xxxxxx56、admin 的 legxxxxxxng,在信息库中查询历史密码。
只找到 liufei 相关的多个历史密码,逐一验证,均错误。
哈希反解。提取三个账号的哈希密码,liufei 的 a1e0476879cab2a76cc22c80bbf364dd、nana 的 208f0aba4a6d4b9afe94207e6c57d594、admin 的 3faf009c43bb39c5a37859bc48feaff3。
有了哈希密码,第一时间查彩虹表(https://www.cmd5.com/),反解明文密码:
只有账号 liufei 的密码解出为 !QAZ2wsx,nana、admin 无解,暂时放下。第三个漏洞,业务系统存在弱口令账号 liufei。
通过 liufei / !QAZ2wsx 登录网站:
功能非常有限,只有个回收站,里面没有业务任何数据。
上图中有几个输入框,应该是个查询功能,但是找不到查询按钮,尝试在前端 HTML 源码中翻找查询接口,无果;在 burp 的报文历史中审查 JS,也没找到有用的接口。看来,还得找个高权限的账号。
回到先前未反解出来的两个账号,nana 的 208f0aba4a6d4b9afe94207e6c57d594、admin 的 3faf009c43bb39c5a37859bc48feaff3。
https://www.cmd5.com/拥有海量的彩虹表数据,它反解不出来,很可能是个强口令。对于强口令的暴破,我习惯围绕用户名,制作具有社工属性的密码字典,如,用户名 nana,社工属性密码可能为 NaNa、na520na、nana@19901015。如何生成社工属性密码字典?hashcat!对滴,hashcat 不仅是哈希暴破神器,也支持基于规则生成密码字典,规则库位于 hashcat/rules/:
其中,dive.rule 含有我需要的规则,选之。我把 nana 视为基础信息存入 base.txt 中作为输入,让 dive.rule 模仿学习生成类似的密码字典,保存至 se_passwds.txt:接着用社工字典暴破哈希密码:
7 秒出结果,得到 nana 的密码 nanacnacnanac,第四个漏洞,业务系统存在社工属性口令账号 nana。用类似的手法,制作了账号 admin 的社工密码字典,遗憾,并未暴出 admin 的密码。没关系,用 nana / nanacnacnanac 登录系统,或许有新发现。
一旦进入后台,习惯上先找三类功能:上传功能、查询功能、命令功能。上传功能,通过各种任意文件上传攻击手法,上传 webshell;查询功能,审查是否存在 SQL 注入,拿数据(如,哈希密码);命令功能,指那些有著名工具实现的功能,比如,输入个 IP,业务功能探测该 IP 是否存活,服务端可能执行了 ping 命令,又如,上传个压缩包,页面显示压缩包内容,服务端可能执行了 unzip 命令,这时,用命令注入或命令选项注入的手法,攻击服务端。
登录 nana 账号,业务功能也不多,但有个上传功能:
我得深入审查它,或许是 getshell 的唯一通道。
先上传一个正常的 PNG 图片,页面报错,提示非管理员禁止上传:
这可不好玩了,admin 的哈希密码之前用彩虹表、社工字典都尝试过,无法反解,前进步伐再次受阻。
回想之前刺探过的密码找回功能,发现泄漏用户哈希密码就未再深入,应该再审查下,或许能重置 admin 密码。
用 admin 进入密码找回流程,先顺利通过服务端用户名是否存在的校验,然后向该账号绑定的邮箱地址发送密码重置 URL,请求如下:
显然,参数 email 存在不安全的直接对象引用(IDOR)问题,将其替换为攻击者的邮箱,90% 的概率会收到重置邮件。
于是,我找了个匿名邮箱,尝试劫持 admin 的密码找回邮件:
很快,匿名邮箱收到来信,访问带 token 的密码重置链接,还真能修改密码:
至此,已经拿到管理员的后台权限。后续便可以很方便的上传大马小马了。就不在一一列举。
另外参数 email 存在不安全的直接对象引用(IDOR)问题这是一个很常见的漏洞类型,通过抓包修改参数等操作很容易拿到修改密码链接。
*请认真填写需求信息,我们会在24小时内与您取得联系。