0x01 前言

上周我用Modsecurity替换掉naxsi作为nginx的waf。但在实际应用中发现POST请求一直出现500错误,导致我无法正常登入后台与留言。

因为是刚接触Modsecurity,在问题排查上走了不少弯路。经过好几天的测试,我发现只需要将Modsecurity升级到3.0系列就好了。

0x02 BUG

因为我的日志已经删除,在这里引用GitHub上的一段日志,以下是引用地址:

以下是引用的日志内容:

#Modsecurity log
--398c3027-A--
[20/Feb/2014:12:11:56 +0100] AcAcxcAcAcAcAcYcAcACAcAc 11.22.33.44 54093 127.0.0.1 80
--398c3027-B--
POST /_layouts/login.aspx?ReturnUrl=%2f HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://pippo.pluto.it/_layouts/login.aspx?ReturnUrl=%2f
Accept-Language: it
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: pippo.pluto.it
Content-Length: 569
Connection: Keep-Alive
Cache-Control: no-cache

--398c3027-C--
__LASTFOCUS=&__VIEWSTATE=%2FwEPDwUKMTc0NDQ2ODg4OQ9kFgJmD2QWAmYPZBYCAgMPZBYCAjUPZBYCAgEPZBYCZg9kFgICDQ8QDxYCHgdDaGVja2VkaGRkZGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFJmN0bDAwJFBsYWNlSG9sZGVyTWFpbiRsb2dpbiRSZW1lbWJlck1l1qeKl1MHLq6QY7t46OHWkizdEl8%3D&__EVENTTARGET=&__EVENTARGUMENT=&__EVENTVALIDATION=%2FwEWBQKh1oXMDwLE96mtBQLLtsPBAgLkkP7MCgK%2FlZyyB7GYj%2B2NXtzlE%2BKZXCcgMOT2hSGC&ctl00%24PlaceHolderMain%24login%24UserName=admin&ctl00%24PlaceHolderMain%24login%24password=xxxxxxxx&ctl00%24PlaceHolderMain%24login%24login=Accesso&__spDummyText1=&__spDummyText2=
--398c3027-F--
HTTP/1.1 500 Internal Server Error

--398c3027-H--
Apache-Handler: IIS
Stopwatch: 1392894716000050 257181 (- - -)
Stopwatch2: 1392894716000050 257181; combined=73343, p1=1583, p2=70903, p3=0, p4=0, p5=701, sr=88, sw=156, l=0, gc=0
Producer: ModSecurity for nginx (STABLE)/2.7.7 (http://www.modsecurity.org/); OWASP_CRS/2.2.9.
Server: ModSecurity Standalone
Engine-Mode: "ENABLED"

--398c3027-Z--

我的网站使用Google的PageSpeed对网站内容进行优化,同时启用了pagespeed_beacon用于检查网站的健康度。使用浏览器的控制台可以看到POST的内容:

这个POST动作是自动在后台完成的,在前端看不到任何内容,所以不会对访客造成影响。可是当我需要登入后台和撰写文章时也出现同样的错误:

HTTP/1.1 500 Internal Server Error

这使得我无法正常使用wordpress的功能,其实是所有POST的请求都会出现500 error。

0x03 DEBUG

因为这个问题早在2015年就出现了,所以我可以很轻易地找到解决办法:

  1. 使用ModSecurity 3.0;目前从GitHub上clone的版本是ModSecurity v3.0.0rc1 (Linux)。虽然是RC1,但在使用上几乎没有很严重的问题。
  2. 需要使用modsecurity connector;目前的版本是ModSecurity-nginx v0.1.1-beta。

而我使用以上版本与openresty 1.11.2.5进行编译,经过近一周的测试并未发现异常。

0x04 结语

使用新版本进行编译的过程与我前些天发布的文章( nginx编译安装ModSecurity作为高性能WAF )的过程有一些区别,这周末我再撰写一篇相关的文章

请参考以下文章: