小站点,怎样不浪费每一个请求?
知识点: 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阶段去修改值。