python检测404页面
某些网站为了实现友好的用户交互,提供了一种自定义的错误页面,而不是显示一个大大的404 ,比如CSDN上的404提示页面如下:

这样虽然提高了用户体验,但是在编写对应POC进行检测的时候如果只根据返回的HTTP头部信息判断,则很可能造成误报,为了能准确检测到404页面,
需要从状态码和页面内容两个方面来进行判断。
从状态码来判断比较简单。可以直接使用requests库发送http请求,得到响应码即可。
从页面内容上进行判断的话,采用的思路是访问web站点上明显不存在的页面,获取页面内容进行保存,然后访问目标页面,将二者进行比较,如果相似度达到某一阈值,则该页面为404页面,否则为正常页面。
为了判断两个页面的相似度,采用Python的simhash库,这个库具体实现的算法我不太懂,但是Python的好处就是:不懂无所谓,直接拿来用就行。这里也只是简单的拿来用一下:
#-*- encoding:utf-8 -*-
# 404 页面识别
from hashes.simhash import simhash
import requests
class page_404:
    def __init__(self, domain): #检测站点
        self._404_page = [] # 404页面
        self._404_url = [] #404 url
        self._404_path = ["test_404.html", "404_test.html", "helloworld.html", "test.asp?action=modify&newsid=122%20and%201=2%20union%20select%201,2,admin%2bpassword,4,5,6,7%20from%20shopxp_admin"] #404页面路径,用于生成一部分404页面
        self._404_code = [200, 301, 302] #当前可能是404页面的http请求的返回值
        #自己构造404url,以便收集一些404页面的信息
        for path in self._404_path:
            for path in self._404_path:
                if domain[-1] == "/":
                    url = domain + path
                else:
                    url = domain + "/" + path
                response = requests.get(url)
                if response.status_code in self._404_code:
                    self.kb_appent(response.content, url)
    def kb_appent(self, _404_page, _404_url):
        if _404_page not in self._404_page:
            self._404_page.append(_404_page)
        if _404_url not in self._404_url:
            self._404_url.append(_404_url)
    def is_similar_page(self, page1, page2):
        hash1 = simhash(page1)
        hash2 = simhash(page2)
        similar = hash1.similarity(hash2)
        if similar > 0.85: #当前阈值定义为0.85
            return True
        else:
            return False
    def is_404(self, url):
		if url in self._404_url:
			return True
        response = requests.get(url)
        if response.status_code == 404:
            return True
        if response.status_code in self._404_code:
            for page in self._404_page:
                if self.is_similar_page(response.content, page):
                    self.kb_appent(url, response.content) #如果是404页面,则保存当前的url和页面信息
                    return True
                else:
                    return False
        return False
上面的代码中,检测类中主要保存了这样几个信息:
_404_page:404页面,用于与其他请求的页面进行相似度判断,以便识别404页面,这里用列表主要为了防止一个站点有多种404页面,这段代码运行时间越长它的准确度越高
_404_url:404 页面的url,保存之前判断出页面是404的url,已经判断出来的就不再判断,为了提升效率
_404_path:构建不存在页面的url,最后一个是一个sql注入的代码,这里为了识别出那些被防火墙拦截而显示的错误页面
_404_code:可能返回404页面的响应码,如果响应码为这些,则需要对页面进行判断
类在初始化时需要传入一个域名,根据这个域名来拼接几个不存在的或者会被防火墙拦截的请求并提交这些请求,得到返回信息,将这些信息作为判断的信息进行保存。
在判断时首先根据之前保存的404 url信息进行判断,如果当前url是404页面则直接返回,提高效率。然后提交正常的http请求并获取响应信息,
如果响应码为404则返回True,否则再状态码是否在_404_code列表中,最后再与之前保存的404页面信息进行比较得到结果。
这段代码的测试代码如下:
from page_404 import page_404
if __name__ == '__main__':
    domain = "http://xzylrd.gov.cn"
    check_404 = page_404(domain)
    dest_url = "http://xzylrd.gov.cn/TEXTBOX2.ASP?action=modify&newsid=122%20and%201=2%20union%20select%201,2,admin%2bpassword,4,5,6,7%20from%20shopxp_admin"
    print (check_404.is_404(dest_url))
												
											python检测404页面的更多相关文章
- Python django 404页面配置和debug=false 静态文件配置 django版本1.10.5
		
django设置404页面 1.设置settings文件 DEBUG = False ALLOWED_HOSTS = ['127.0.0.1', 'localhost']或者 ALLOWED_HOST ...
 - python Django注册页面显示头像
		
python Django注册页面显示头像(views) def register(request): ''' 注册 :param request: :return: ''' if request.m ...
 - [zabbix] zabbix从内部检测web页面
		
环境说明: 两台机器各运行一个tomcat实例,通过阿里云slb到后端,假设后端服务挂了一个,从外部访问整个服务还是可用的,所以需要从内部检测web页面. zabbix自带的web场景都是从外部检测w ...
 - thinkphp访问不存在的模块或者方法跳转到404页面
		
使用的thinkphp 版本是3.2.0, 在config.php中配置 404地址,即可: 'TMPL_EXCEPTION_FILE' => './Application/Home/View/ ...
 - 网站设置404页面 --nginx
		
有的时候根据域名要先知道用的什么web 服务器 最简单的 http://tool.chinaz.com/pagestatus/ 输入域名,看返回的头部信息 用的那个web浏览器 下面的方法也是根据头 ...
 - JavaWeb 自定义404页面
		
本来,Tomcat中自定义404页面不过是在web.xml文件中写4行代码的事情. 直接引用 Tomcat官方FAQ 怎样自定义404页面? 编辑web.xml <error-page> ...
 - 如何在 Apache 中为你的网站设置404页面
		
一个好的网站,拥有一个好的 404页面 是标配. 为何要有 404页面?如何设置一个 404页面? why 404 pages? 在本地,比如我打开 localhost/fuck.htm(该文件不存在 ...
 - python检测文件的MD5值
		
python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权 ...
 - asp.net自定义404页面
		
网上有很多方法,不过大体相同,这只是其中一个方法,亲测有效,记录后面可能会有用 1. 先写好一个404页面 404.aspx在项目根目录下 然后在配置文件中添加 <!-- 注意这个模式,redi ...
 
随机推荐
- thinkphp5URL和路由
			
前面的话 本文将详细介绍thinkphp5URL和路由 URL访问 ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块.控制器和操 ...
 - Material使用08 MdDialogModule、MdAutocompleteModule
			
1 MatDialog 1.1 简要描述 MdDialog是一个服务,可以利用它来打开一个具有material风格和动画效果的对话框 技巧01:虽然已经在模块级别导入了MdDialogModule但是 ...
 - Web API的CORS
			
Web API中进行跨域需要在请求头中加入允许跨域请求 Access-Control-Allow-Origin=* 上面代码代表允许所有跨域请求.当然也可以只允许某个站点进行跨域请求,只需将'*' ...
 - Kafka详细的设计和生态系统
			
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 译者:人工智能资讯小编 本译文自Jean-Paul Azar 在 https://dzone.com 发表的 Kafka Detailed De ...
 - Pipeline in scala——给scala添加管道操作
			
linux系统中管道这一功能相信大家肯定使用过,比如现在想找到用户目录下文件名包含db的所有文件,ls ~的结果,作为grep db的参数: ➜ ~ ls ~ | grep db kv.mv.db ...
 - React的JSX语法及组件
			
最近一个同事很急没有做任何交接就请了陪产假,然后我来维护.说实在的我一开始是一脸懵逼的.因为MV*项目里用的最多的还是Vue:React听说也了解过,但毕竟不熟... 不过不管如何这也是工作:同事也恭 ...
 - python方法的延迟加载
			
数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果缓存起 ...
 - xamarin android menu的用法
			
在Android中的菜单有如下几种: OptionMenu:选项菜单,android中最常见的菜单,通过Menu键来调用 SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮 ...
 - bzoj 4012: [HNOI2015]开店
			
Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现 ...
 - 3、debian8安装和处理
			
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 本文写于2016年1月10日09:35:45,首先向debian的创始人Ian Murdock表示沉痛惦念! http://bai ...