post类型sql注入漏洞扫描

一、背景

SQL注入漏洞是常见web漏的中危害最大的,是危害大的漏洞中最常见的。

幸运的是主流扫描器对SQL注入漏洞扫描识别准确率非常理想

缺陷是对post请求、有用户验权(是否登录)的请求通常无能为力。

二、解决方案

一句话说明:nginx搭建代理服务器,记录代理日志,web通过代理访问,根据日志扫描。

详细说明:

1.nginx代理服务器搭建

新建server 监听9999

server {
listen 9999;
resolver 8.8.8.8 233.5.5.5;

location ~.*\.(jpg|png|jpeg|gif|js|css)$ {
proxy_pass http://$http_host$request_uri;
}

location / {
proxy_pass http://$http_host$request_uri;
}
}

本地浏览器使用代理,访问网站,保证代理可用。

2.记录请求日志

在 “location /”中记录日志 ,这里我用lua处理(nginx与lua集成见百度)

location / {
		access_by_lua '
			
			function conv2str (o)
				local rs = ""
				if type(o) == "string" then
					rs = o
				elseif type(o) == "nil" then
					rs = "nil"
				elseif type(o) == "number" then
					rs = tostring(o)
				elseif type(o) == "boolean" then
					rs = tostring(o)
				elseif type(o) == "table" then
					for k,v in pairs(o) do
						if type(v)=="string" then
							rs = rs..k.."="..v.."&"
						else
							rs = rs..k.."="..conv2str(v).."&"
						end
					end
					if string.find(rs, "&", string.len(rs)-1) ~= nil then
						rs = string.sub(rs, 0, string.len(rs)-1)
					end
				else
					error("cannot serialize a " .. type(o))
				end
				return rs
			end

			function write(logfile, msg)
				local fd = io.open(logfile,"ab")
				if fd == nil then return end
				fd:write(msg)
				fd:flush()
				fd:close()
			end
			
			function logall()
				local remote=ngx.var.remote_addr or "-"
				local host=ngx.var.host or "-"
				local nowtime=ngx.var.time_local or "-"
				local reqMethod=ngx.req.get_method() or "-"
				local reqUri=string.gsub(ngx.var.request_uri, "?.*", "") or "-"
				local args=""
				local post=""
				local headers=ngx.req.get_headers()
				local cookies=conv2str(headers["Cookie"])
				local header=conv2str(headers)
				local line=""
				args=conv2str(ngx.req.get_uri_args())
				if string.len(args) > 0 then
					line="sqlmap.py -u \\"http://"..host..reqUri.."?"..args.."\\""
				else
					line="sqlmap.py -u \\"http://"..host..reqUri.."\\""
				end
				if reqMethod=="POST" then
					local postlength=tonumber(ngx.var.content_length)
					if postlength then
						if postlength < 10485760 then
						   	post=conv2str(ngx.req.get_post_args())
							line=line.." --data \\""..post.."\\""
						end
					end
				end
				
				if cookies~="nil" then 
					line=line.." --cookie \\""..cookies.."\\""
				end
				--line=remote.." - - ".."["..nowtime.."]".." - - "..reqMethod.." - - "..reqUri.." - - host:"..host.." - - [args]:"..args.." [post]:"..post.." [header]:"..header.."\\n"
				
				local filename = "/tmp/proxy.log"
				write(filename,line.."\\n") 
			end
			
			logall()
		';
		proxy_pass http://$http_host$request_uri;
	}

reload nginx 测试,检查/tmp/proxy.log下输出是否正常

不出意外的话,proxy.log 中将打印处理好的sqlmap扫描命令(出了意外百度解决)

3.设置扫描

新建sqlant_job.sh

#!/bin/bash
# auth:zhanghang.org#gmail.com
today=`date +%Y%m%d`
proj_dir="/opt/sqlant"
mkdir -p $proj_dir
mv /tmp/proxy.log $proj_dir/$today
/bin/sh $proj_dir/$today

设置此脚本每日定时执行,剩下的检查sqlmap扫描报告就可以了

发表评论

电子邮件地址不会被公开。 必填项已用*标注