九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

admin 2023年12月27日22:10:39评论21 views字数 4919阅读16分23秒阅读模式

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

一、背景

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


对于一名合格的网络安全从业人员来说,平时接触的工作多多少少都会涉及到一些重复的内容,无论是梳理资产还是提交漏洞,只要有通用的步骤或者操作大部分都可以通过脚本的来实现,不仅可以提高工作效率,也可以锻炼自己的思维和开发能力。


那么什么才算是共性的东西?共性的东西应该如何思考通过脚本实现呢?为了解答这些疑问,本文通过一个具体的案例进行展开讨论。


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

二、目的

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


通过自动拉取表格数据并填报到web端的案例介绍,从而养成自动代替手动的思维,确保达到在短时间可完成超出预期的工作量的效果。


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

三、需求分析及确认

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


1、问题定位


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


由于系统没有开放可对接的接口,无法实现从平台1到平台2的数据同步,所以数据只能人工从一台pc通过u盘拷贝到另一台pc,并手动将word表格中的数据填写到web表单中,数量极大。


2、需求确认


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


编写工具,实现自动从word文档表格中拉取字段,并自动填充到web表单中的效果,需要注意的是填充到web表单时需要点击一个按钮后再进行操作,其中涉及到的文件上传点需要手动上传,并且人工确认填写无误后点击保存。


3、思路


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


功能实现方面,采用python的selenium库实现调用谷歌浏览器,并模拟爬虫的方式找到对应的填写位置实现代填,可以将上述思路通过某些AI平台先出一份大体的框架再进行完善。


团队合作方面,将需求拆分为两部分,第一部分是从word文档表格中拉取字段,第二部分是填充到web表单中。通过团队合作的方式实现该功能,其中成员A实现第一部分的功能,成员B实现第二部分的功能,成员C实现最终的汇总调试,确保每一步的质量和效果达到预期。


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

四、实现步骤

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


① 成员A代码部分:

选用python语言,导入docx库来实现读取word文档中的表格数据。

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


具体代码如下:

from docx import Documentif __name__ == "__main__":              name=input("请输入要填写的信息表绝对路径:")              doc = Document(name)              data = []  # 创建一个空列表来存储列数据              #获取表格              table = doc.tables[0]              for row in table.rows:                            cells = row.cells                            data.extend([cells[0].text, cells[1].text, cells[2].text, cells[3].text, cells[4].text,cells[5].text])              print(data)

*左右滑动查看更多


② 成员B代码部分:

a.导入selenium库来实现打开谷歌浏览器的操作,具体代码如下:

   url = "http://XX.XX.XX.XX/ca/XXX"       # 使用Selenium打开浏览器       chrome_options = webdriver.ChromeOptions()       chrome_options.binary_location = r'C:UsersXXXgoogleChromeApplicationchrome.exe'  # 修改为你的 Chrome 浏览器路径       chromedriver_path = r'D:XXXchromedriver.exe'  # 修改为你的 chromedriver.exe 路径       browser = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=chrome_options)       browser.get(url)    # 等待一段时间,以确保cookie已经生成       time.sleep(5)       cookies = browser.get_cookies()  # 修改这一行,将 driver 改为 browser    # 打印Cookie信息       for cookie in cookies:              print(f"Name: {cookie['name']}, Value: {cookie['value']}")    # 将cookie设置到浏览器中       for cookie in cookies:              browser.add_cookie(cookie)

*左右滑动查看更多


这里要注意选择与浏览器版本对应的chromedriver版本。

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


Chromedriver下载路径:

https://npm.taobao.org/mirrors/chromedriver/http://chromedriver.storage.googleapis.com/index.html

*左右滑动查看更多


比如谷歌版本是91.0.4472.77,那下载对应的chromedriver的版本是91.0.4472.19,点击进去之后,如果你是windows系统就选win32这个,苹果的系统就选相对应的下载就行了。


b.浏览器找到对应填写的具体位置,采用xpath路径的方式进行定位。

input_element_website = WebDriverWait(browser,1).until(EC.presence_of_element_located((By.XPATH,'//*[@id="XXXeupCo"]')))  #网站名称,标红的直接复制xpath路径即可input_element_websiteIp = WebDriverWait(browser,1).until(EC.presence_of_element_located((By.XPATH,'//*[@id="XXXsiteIp"]')))#网站ip

*左右滑动查看更多


九维团队-绿队(改进)| 一次从需求到交付到调优的“python脚本编写”的探索

c.实现点击按钮的操作,同样采用xpath路径的方式进行定位。

click=browser.find_element_by_xpath('//*[@id="XX_Details"]/div[1]/a[1]/span').click()

*左右滑动查看更多


九维团队-绿队(改进)| 一次从需求到交付到调优的“python脚本编写”的探索

d.将word表格取出来的字段按照xpath位置填写即可。

input_element_website.clear()  # 清空当前值input_element_website.send_keys(data[1])  # 输入新的值,其中data值对应的word表格数据的具体列表中的值。input_element_websiteIp.send_keys(data[11])  # 输入新的值

*左右滑动查看更多


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

五、后续调优

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


1、汇总测试发现,点击按钮处每次的xpath路径都不一致,后续采用手动输入xpath的方式实现解决。 

Xpath=input("请输入Xpath路径")  click=browser.find_element_by_xpath(Xpath).click()

*左右滑动查看更多


2、测试发现,点击按钮处每次的xpath路径都不一致,后续采用手动输入xpath的方式实现解决。

Xpath=input("请输入Xpath路径") click=browser.find_element_by_xpath(Xpath).click()

*左右滑动查看更多


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

六、完整代码

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


from docx import Documentimport timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitif __name__ == "__main__":       url = "http://XX.XX.XX.XX/ca/XXX"       # 使用Selenium打开浏览器       chrome_options = webdriver.ChromeOptions()       chrome_options.binary_location = r'C:UsersXXXchrome.exe'  # 修改为你的 Chrome 浏览器路径

chromedriver_path = r'D:XXXchromedriver.exe' # 修改为你的 chromedriver.exe 路径 browser = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=chrome_options) browser.get(url) # 等待一段时间,以确保cookie已经生成 time.sleep(5) cookies = browser.get_cookies() # 修改这一行,将 driver 改为 browser # 打印Cookie信息 for cookie in cookies: print(f"Name: {cookie['name']}, Value: {cookie['value']}") # 将cookie设置到浏览器中 for cookie in cookies: browser.add_cookie(cookie) while(1): # 打开Word文件 name=input("请输入要填写的信息表绝对路径:") doc = Document(name) name1 = input("请输入要代填的URL:") browser.get(name1) time.sleep(5) click=browser.find_element_by_xpath('//*[@id="XX_Details"]/div[1]/a[1]/span').click() input_element_website = WebDriverWait(browser,1).until(EC.presence_of_element_located((By.XPATH,'//*[@id="XXXeupCo"]'))) #网站名称 input_element_websiteIp = WebDriverWait(browser,1).until(EC.presence_of_element_located((By.XPATH,'//*[@id="XXXsiteIp"]')))#网站ip data = [] # 创建一个空列表来存储列数据 #获取表格 table = doc.tables[0] for row in table.rows: cells = row.cells data.extend([cells[0].text, cells[1].text, cells[2].text, cells[3].text, cells[4].text,cells[5].text]) print(data) input_element_website.clear() # 清空当前值 input_element_website.send_keys(data[1]) # 输入新的值 input_element_websiteIp.send_keys(data[11]) # 输入新的值

*左右滑动查看更多


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

七、改进延伸

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

①对方网站具备监测能力会轻易识别到异常行为,除了上述代码采用的修改User-Agent请求头的方式和设置合理的请求间隔时间之外,最好的方式是定期更换请求ip地址,可很大程度的避免被封禁。


代理ip参考代码:

proxy_list = [    'http://1.2.3.4:5678',    'https://5.6.7.8:1234',]proxy = random.choice(proxy_list)options.add_argument('--proxy-server=' + proxy)

*左右滑动查看更多


②xpath存在注入漏洞,采用特殊字符编码替换和屏蔽错误提示信息的方式减少被攻击的可能性。


九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索

八、小结

九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索


笔者一直认为,日常生活中懒到极致的时刻就是效率提升的关键节点,当你厌倦做一件事情的时候,就会想办法让自己解放双手,提高工作效率。其中代码编写的工程中最重要的是找到重复工作的”共性”,上述案例中的共性其实就是将手动从word中复制字段到web端的过程,当抓到核心点的时候,就可以考虑用最合理的方式来实现对应的效果,甚至超额完成工作。


原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| 一次从需求到交付到调优的“python脚本编写”的探索

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月27日22:10:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-绿队(改进)| 一次从需求到交付到调优的python脚本编写的探索https://cn-sec.com/archives/2340425.html

发表评论

匿名网友 填写信息