热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

apache对于非法http请求的处理流程

一、无效请求的处理通常来说,系统都是为了给“合法”请求提供服务,但是总有一些异常发生,也就是意料之外的事情。类似的,如果异常发生在一些知名的公司,这些事件可能就是“公关危机
一、无效请求的处理
通常来说,系统都是为了给“合法”请求提供服务,但是总有一些异常发生,也就是意料之外的事情。类似的,如果异常发生在一些知名的公司,这些事件可能就是“公关危机”。对于软件来说,通常这些异常情况也就是考验一个产品健壮性的机会,不同质量的软件对于这种异常的处理在很大程度上决定了软件的质量。当然对于软件的学习和理解来说,通常不会提升到这么高的高度,但是对于理解一个软件的正常流程来说通常异常情况更能加深对于软件的理解。
由于apache是最为流行的http服务器,所以通常很容易用这个端口来测试一些端口行为,而这些测试大多发送的又是二进制协议,这些表示标准的http请求,那么apache对于这些异常的请求将会如何处理呢?
二、简单测试
在启动了httpd服务器的本地机器上执行向端口输入二进制数据,这里输入的是一个不包含回车符的0x1字符,下面是通过抓包获得的数据
1、不添加回车符
tsecer@harry: (echo -ne '\x1'; sleep 1000; ) >/dev/tcp/127.0.0.1/80
另一个窗口抓包,可以看到服务器在等待了20s之后主动关闭了链路,但是在apache的错误日志中默认没有打印这个链接的记录。
tsecer@harry: tcpdump -i any -nns0 -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
08:02:15.367902 IP 127.0.0.1.60740 > 127.0.0.1.80: Flags [S], seq 4067916201, win 43690, options [mss 65495,sackOK,TS val 9933863 ecr 0,nop,wscale 7], length 0
E..<..@.@.O+.........D.P.wy..........0.........
...'........
08:02:15.367982 IP 127.0.0.1.80 > 127.0.0.1.60740: Flags [S.], seq 2987582136, ack 4067916202, win 43690, options [mss 65495,sackOK,TS val 9933863 ecr 9933863,nop,wscale 7], length 0
E..<..@.@.<..........P.D.....wy......0.........
...'...'....
08:02:15.368045 IP 127.0.0.1.60740 > 127.0.0.1.80: Flags [.], ack 1, win 342, options [nop,nop,TS val 9933863 ecr 9933863], length 0
E..4..@.@.O2.........D.P.wy........V.(.....
...'...'
08:02:15.372126 IP 127.0.0.1.60740 > 127.0.0.1.80: Flags [P.], seq 1:2, ack 1, win 342, options [nop,nop,TS val 9933867 ecr 9933863], length 1
E..5..@.@.O0.........D.P.wy........V.).....
...+...'.
08:02:15.372260 IP 127.0.0.1.80 > 127.0.0.1.60740: Flags [.], ack 2, win 342, options [nop,nop,TS val 9933868 ecr 9933867], length 0
E..4v.@.@../.........P.D.....wy....V.(.....
...,...+
08:02:35.424961 IP 127.0.0.1.80 > 127.0.0.1.60740: Flags [F.], seq 1, ack 2, win 342, options [nop,nop,TS val 9953920 ecr 9933867], length 0
E..4v.@.@............P.D.....wy....V.(.....
.......+
08:02:35.425279 IP 127.0.0.1.60740 > 127.0.0.1.80: Flags [.], ack 2, win 342, options [nop,nop,TS val 9953921 ecr 9953920], length 0
E..4..@.@.O0.........D.P.wy........V.(.....
........
2、添加回车符
tsecer@harry: (echo -e '\x1'; sleep 1000; ) >/dev/tcp/127.0.0.1/80
对应的输出,可以看到服务器马上回包,提示Method Not Implemented
tsecer@harry: tcpdump -i any -nns0 -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
08:06:05.694009 IP 127.0.0.1.60741 > 127.0.0.1.80: Flags [S], seq 3305081832, win 43690, options [mss 65495,sackOK,TS val 10164189 ecr 0,nop,wscale 7], length 0
E..<.5@.@............E.P.............0.........
............
08:06:05.694114 IP 127.0.0.1.80 > 127.0.0.1.60741: Flags [S.], seq 4112322835, ack 3305081833, win 43690, options [mss 65495,sackOK,TS val 10164189 ecr 10164189,nop,wscale 7], length 0
E..<..@.@.<..........P.E.............0.........
............
08:06:05.694142 IP 127.0.0.1.60741 > 127.0.0.1.80: Flags [.], ack 1, win 342, options [nop,nop,TS val 10164189 ecr 10164189], length 0
E..4.6@.@............E.P...........V.(.....
........
08:06:05.702012 IP 127.0.0.1.60741 > 127.0.0.1.80: Flags [P.], seq 1:3, ack 1, win 342, options [nop,nop,TS val 10164197 ecr 10164189], length 2
E..6.7@.@............E.P...........V.*.....
.........
 
08:06:05.702118 IP 127.0.0.1.80 > 127.0.0.1.60741: Flags [.], ack 3, win 342, options [nop,nop,TS val 10164197 ecr 10164197], length 0
E..4..@.@.5..........P.E...........V.(.....
........
08:06:05.777740 IP 127.0.0.1.80 > 127.0.0.1.60741: Flags [P.], seq 1:214, ack 3, win 342, options [nop,nop,TS val 10164273 ecr 10164197], length 213
E.. ..@.@.4..........P.E...........V.......
...1....

Method Not Implemented

. to /index.html not supported.

 
08:06:05.777765 IP 127.0.0.1.60741 > 127.0.0.1.80: Flags [.], ack 214, win 350, options [nop,nop,TS val 10164273 ecr 10164273], length 0
E..4.8@.@............E.P...........^.(.....
...1...1
08:06:05.783629 IP 127.0.0.1.80 > 127.0.0.1.60741: Flags [F.], seq 214, ack 3, win 342, options [nop,nop,TS val 10164279 ecr 10164273], length 0
E..4..@.@.5..........P.E...........V.(.....
...7...1
08:06:05.824534 IP 127.0.0.1.60741 > 127.0.0.1.80: Flags [.], ack 215, win 350, options [nop,nop,TS val 10164320 ecr 10164279], length 0
E..4.9@.@............E.P...........^.(.....
...`...7
三、apache的处理方法
读取输入请求的调用链为
(gdb) bt
#0  0x0000003367aeaa8d in poll () from /lib64/libc.so.6
#1  0x00007f7181154afe in apr_poll (aprset=aprset@entry=0x7f717dc6fca0, 
    num=num@entry=1, nsds=nsds@entry=0x7f717dc6fc84, timeout=)
    at poll/unix/poll.c:120
#2  0x00007f717fefad28 in reqtimeout_filter (f=0x7f7178003638, 
    bb=0x7f7160001ae0, mode=, block=
    readbytes=) at mod_reqtimeout.c:280
#3  0x0000000000431d8f in ap_rgetline_core (s=s@entry=0x7f7160000990, n=8192, 
    read=read@entry=0x7f717dc6fdd8, r=r@entry=0x7f7160000960, 
    fold=fold@entry=0, bb=bb@entry=0x7f7160001ae0) at protocol.c:232
#4  0x0000000000433cef in read_request_line (bb=0x7f7160001ae0, 
    r=0x7f7160000960) at protocol.c:599
#5  ap_read_request (cOnn=conn@entry=0x7f71780031e0) at protocol.c:967
#6  0x0000000000455d29 in ap_process_http_async_connection (c=0x7f71780031e0)
    at http_core.c:135
#7  ap_process_http_connection (c=0x7f71780031e0) at http_core.c:228
#8  0x000000000044e950 in ap_run_process_connection (c=0x7f71780031e0)
    at connection.c:41
#9  0x00000000004604fc in process_socket (my_thread_num=0, my_child_num=0, 
    cs=0x7f7178003168, sock=, p=
    thd=) at event.c:917
---Type to continue, or q to quit---
#10 worker_thread (thd=, dummy=) at event.c:1744
#11 0x0000003368207f33 in start_thread () from /lib64/libpthread.so.0
#12 0x0000003367af4ead in clone () from /lib64/libc.so.6
(gdb) 
 
在其中的reqtimeout_filter函数中,会执行
static apr_status_t have_lf_or_eos(apr_bucket_brigade *bb)
{
    apr_bucket *b = APR_BRIGADE_LAST(bb);
 
    for ( ; b != APR_BRIGADE_SENTINEL(bb) ; b = APR_BUCKET_PREV(b) ) {
        const char *str;
        apr_size_t len;
        apr_status_t rv;
 
        if (APR_BUCKET_IS_EOS(b))
            return APR_SUCCESS;
 
        if (APR_BUCKET_IS_METADATA(b))
            continue;
 
        rv = apr_bucket_read(b, &str, &len, APR_BLOCK_READ);
        if (rv != APR_SUCCESS)
            return rv;
 
        if (len == 0)
            continue;
 
        if (str[len-1] == APR_ASCII_LF)
            return APR_SUCCESS;
    }
    return APR_INCOMPLETE;
}
如果找不到换行符并且不是输入结束,则需要继续等待。
 
默认初始值为
request_rec *ap_read_request(conn_rec *conn)
{
……
    r->status          = HTTP_OK;  /* Until further notice */
                                              
由于没有处理,所以这个地方会直接返回等待下一个输入。
 
 
static int process_socket(apr_thread_t *thd, apr_pool_t * p, apr_socket_t * sock,
                          event_conn_state_t * cs, int my_child_num,
                          int my_thread_num)  
……
 
    if (cs->pub.state == CONN_STATE_LINGER) {
        if (!start_lingering_close(cs))
            return 0;
    }          
四、对应的apache配置
httpd-2.4.2\modules\filters\mod_reqtimeout.c
#define UNSET                            -1
#define MRT_DEFAULT_HEADER_TIMEOUT       20
#define MRT_DEFAULT_HEADER_MAX_TIMEOUT   40
#define MRT_DEFAULT_HEADER_MIN_RATE      500
#define MRT_DEFAULT_BODY_TIMEOUT         20
#define MRT_DEFAULT_BODY_MAX_TIMEOUT     0
#define MRT_DEFAULT_BODY_MIN_RATE        500
……
static const command_rec reqtimeout_cmds[] = {
    AP_INIT_RAW_ARGS("RequestReadTimeout", set_reqtimeouts, NULL, RSRC_CONF,
                     "Set various timeout parameters for reading request "
                     "headers and body"),
    {NULL}
};
 
Allow at least 10 seconds to receive the request including the headers. If the client sends data, increase the timeout by 1 second for every 500 bytes received. But do not allow more than 30 seconds for the request including the headers:
RequestReadTimeout header=10-30,MinRate=500     

推荐阅读
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
小米-发烧友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有