爬蟲(chóng)-化被動(dòng)為主動(dòng)
一、前言
現(xiàn)在網(wǎng)上有很多被動(dòng)式掃描器,配置一個(gè)代理給瀏覽器設(shè)置,然后人去點(diǎn)擊瀏覽器上的網(wǎng)頁(yè),在這種模式下抓到的URL數(shù)量沒(méi)有用爬蟲(chóng)的效果好。
我個(gè)人是比較懶的,先也寫(xiě)了個(gè)被動(dòng)的掃描器,不想改以前寫(xiě)的東西,而且被動(dòng)也有被動(dòng)的優(yōu)點(diǎn),所以就想可不可以讓爬蟲(chóng)也設(shè)置個(gè)代理。就有了下面的東西,很方便。
二、實(shí)操
如何在不改變?cè)粍?dòng)掃描器的情況下讓被動(dòng)變成主動(dòng)。
主結(jié)構(gòu):
以phantomjs為核心,用JS模仿人對(duì)頁(yè)面的操作,代理軟件抓鏈接。以下流程是通用pychon腳本實(shí)現(xiàn)的。
1打開(kāi)瀏覽器并設(shè)置代理->2輸入網(wǎng)址->3填充表單->4點(diǎn)擊按鈕->5點(diǎn)擊超鏈拉->6關(guān)閉標(biāo)簽->7關(guān)閉瀏覽器,循環(huán)2-6。
1. 打開(kāi)瀏覽器并設(shè)置代理
- proxy_config = [
- '--proxy=127.0.0.1:8080',
- '--proxy-type=http',
- '--ignore-ssl-errors=yes',
- ]
- phantomjs_path='/home/ubuntu_235/proxyscan/phantomjs/phantomjs/bin/phantomjs'
- driver = webdriver.PhantomJS(executable_path=phantomjs_path,service_args=sys_config)
2. 輸入網(wǎng)址
- driver.get('http://demo.aisec.cn')
3. 填充表單
- _input_text = """
- var input_list=document.getElementsByTagName("input");
- for (i_i=0;i_i<input_list.length;i_i++){
- var input_type=input_list[i_i].attributes["type"].value
- if (input_type == "text" || input_type == "password"){
- input_list[i_i].value="ascan@ascan.com";
- continue;
- }
- if (input_type == "radio" || input_type == "checkbox"){
- input_list[i_i].setAttribute('target','_blank');
- input_list[i_i].checked="True";
- }
- }
- """
4. 點(diǎn)擊按鈕
- _but_click = """
- var but_list=document.getElementsByTagName("input");
- for (b_i=0;b_i<but_list.length;b_i++){
- var but_type=but_list[b_i].attributes["type"].value
- if (but_type == "button" || but_type == "submit"){
- but_list[b_i].setAttribute('target','_blank');
- but_list[b_i].click();
- }
- }
- """
5. 點(diǎn)擊超鏈接
- _a_click = """
- var a_list=document.getElementsByTagName("a");
- for (a_i=0;a_i<a_list.length;a_i++){
- a_list[a_i].setAttribute('target','_blank');
- a_list[a_i].click();
- }
- """
這里注意下,我在click前給標(biāo)簽加了一個(gè)target=”_blank”,在新的標(biāo)簽頁(yè)打開(kāi)鏈接
6. 關(guān)閉標(biāo)簽
- for h in driver.window_handles[1:]:
- driver.switch_to_window(h)
- driver.close()
注意:應(yīng)該先獲取有標(biāo)簽頁(yè)的handle在用switch_to_window
切換到該標(biāo)簽頁(yè),執(zhí)行quit()操作。driver.window_handles[1:]保留的是第一個(gè)頁(yè)面。
在完成所有操作后關(guān)閉瀏覽器
- driver.close()
通過(guò)burpsuite抓到的請(qǐng)求包
最終實(shí)現(xiàn)的結(jié)果展示
一些注意點(diǎn):
如何獲取當(dāng)前頁(yè)面的所有標(biāo)簽的href?
- url_list=[]
- a_list=self.driver.find_elements_by_xpath("//a[@href]")
- for a in a_list:
- url_list.append(a.get_attribute("href"))
- print(url_list)