小站点,怎样不浪费每一个请求?


知识点: ngx.status ngx.header header_filter_by_lua

刚刚搭建的vps小站,每天都会有大量的扫描器请求,主要探测是否存在安全漏洞路径,而大部分时候,nginx解析请求,最终都会返回404,浪费了一次宝贵的资源。怎样将这些请求利用起来,不浪费每次请求?

根据一般扫描器的实现方式,常用方法,很多PoC列表,然后不断发送请求,判断返回结果状态码是否为200,如果是,有时可能判断就认为漏洞存在? 高级一些的扫描器,可能进一步判断内容,比如请求: FCKeditor/editor/filemanager/upload/test.html 判断返回内容是否包含 fckeditor(不区分大小写).

因此,思路就是当检测到当前请求返回状态码为404时,重写状态码和返回内容。

1) nginx_lua重写状态码

nginx_lua 使用ngx.status 读或者写返回的状态码, 官方说明,参考

https://www.openresty.com.cn/nginx-lua-module-zh-wiki.html#ngxstatus

发送响应头之前,设置返回的状态码。

因此,在 header_filter_by_lua 阶段,对返回的状态码进行检测,如果返回的是非200状态码,则将状态码修改为200

实现非常简单,在nginx的nginx.conf中添加如下过滤代码:

       header_filter_by_lua '
       if ngx.status ~= 200 then
         ngx.status = 200                    --修改状态码
       end 
       ngx.header.server="IIS/7.5"           --重写http返回头
       ngx.header.x_powered_by = "asp.net"   --重写powered_by
       ngx.header.a = "bbbb"                 --添加新头
    ';
测试,请求 /set.php
HTTP/1.1 200 OK
Date: Tue, 20 Jun 2017 22:24:06 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: asp.net
server: IIS/7.5
a: bbbb
Content-Length: 16

File not found.

获得到对应的access.log记录为

    "GET /set.php HTTP/1.1" 200

说明状态码在日志中也被改变了。这个要引起注意,在真实线上环境,经常通过分析日志,确认是否业务是否存在问题,因此,只有在小站点,骗点流量的情况下使用是可行的。

2) 根据请求URI,返回对应内容?

ngx.say是没有办法在header-filter-by-lua阶段使用的,因此还是需要在body-filter-by-lua阶段去修改值。

results matching ""

    No results matching ""