Web 服务器日志中包含 'A=0 或 '0=A 的奇怪 URL
Posted
技术标签:
【中文标题】Web 服务器日志中包含 \'A=0 或 \'0=A 的奇怪 URL【英文标题】:Strange URL containing 'A=0 or '0=A in web server logsWeb 服务器日志中包含 'A=0 或 '0=A 的奇怪 URL 【发布时间】:2016-02-25 08:50:54 【问题描述】:在上周末,我的一些网站记录了错误,暗示我们的网址使用错误:
...news.php?lang=EN&id=23'A=0
或
...news.php?lang=EN&id=23'0=A
而不是
...news.php?lang=EN&id=23
我发现只有一页最初提到了这一点 (https://forums.adobe.com/thread/1973913),他们推测附加的查询字符串来自 GoogleBot 或编码错误。
我最近更改了我的网站以使用 PDO 而不是 mysql_*
。也许这种变化导致了错误?任何提示都会很有用。
此外,所有请求都来自如下所示的同一个用户代理。
Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)
这导致我找到以下线程: pt-BR 和 Strange parameter in URL - what are they trying?
【问题讨论】:
无法从站点本身的 HREF 生成此类链接。奇怪的是 5 个不同的网站在周末的不同时间生成了相似的链接 好的,那你为什么生成了错误的链接? 这是我的问题。我没有生成 A=0 或 0+A 的 URL。我想知道是什么生成了这些 URL @zerkms 也许你不了解 SQL 注入扫描器。它与站点或代码无关。大量的 VPS/计算实例不断地访问站点测试简单注入 ('A=0
) 或运行 JS 的方法。如果可行,他们就知道该站点易受攻击,将其报告给扫描仪 OP,然后扫描仪 OP 就会发挥作用。就在本周,有 6 个亚马逊实例进入了我们的网络探测,就像上面的评论所说,代码中没有“生成它们”。
您可能还想获得一个可靠的 CDN,它将代理请求到您的站点,并提供基本的注入保护(以及其他安全功能,如 DDoS 保护)。
【参考方案1】:
这是一个测试 SQL 注入漏洞的机器人,通过用撇号关闭查询,然后设置一个变量。还有类似的注入处理 shell 命令和/或文件路径遍历。无论是“好机器人”还是坏机器人都不得而知,但如果注入有效,您就有更大的问题需要处理。您的网站有 99% 的可能性不会生成这些样式链接,除非您使用简单的正则表达式字符串或更复杂的 WAF(例如 ModSecurity)阻止请求,否则您无法阻止他们制作这些网址。
基于用户代理的阻塞不是一个有效的角度。您需要查找请求启发式并基于此进行阻止。在 url/request/POST/referrer 中查找的一些示例,包括 utf-8 和十六进制字符:
双撇号 双句点,尤其是在各种编码中的斜线之后 诸如“script”、“etc”或“passwd”之类的词dev/null
之类的路径与管道/回显 shell 输出一起使用
%00 用于初始化新命令的空字节样式字符
网址中的http不止一次(除非您的网站使用它)
关于cgi
的任何信息(除非您的网站使用它)
coldfusion、tomcat 等的随机“企业”路径
如果您不使用 WAF,这里有一个正则表达式 concat,它应该捕获 url 中的许多内容。我们在 PHP 应用程序中使用它,因此您可能/将需要根据您使用它的位置调整一些转义/外观。请注意,这有 .cgi
、wordpress
和 wp-admin
以及正则表达式中的一堆其他内容,如果需要,请删除它们。
$invalid = "(\(\))"; // lets not look for quotes. [good]bots use them constantly. looking for () since technically parenthesis arent valid
$period = "(\\002e|%2e|%252e|%c0%2e|\.)";
$slash = "(\\2215|%2f|%252f|%5c|%255c|%c0%2f|%c0%af|\/|\\\)"; // http://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work
$routes = "(etc|dev|irj)" . $slash . "(passwds?|group|null|portal)|allow_url_include|auto_prepend_file|route_*=http";
$filetypes = $period . "+(sql|db|sqlite|log|ini|cgi|bak|rc|apk|pkg|deb|rpm|exe|msi|bak|old|cache|lock|autoload|gitignore|ht(access|passwds?)|cpanel_config|history|zip|bz2|tar|(t)?gz)";
$cgis = "cgi(-|_)0,1(bin(-sdb)?|mod|sys)?";
$phps = "(changelog|version|license|command|xmlrpc|admin-ajax|wsdl|tmp|shell|stats|echo|(my)?sql|sample|modx|load-config|cron|wp-(up|tmp|sitemaps|sitemap(s)?|signup|settings|" . $period . "?config(uration|-sample|bak)?))" . $period . "php";
$doors = "(" . $cgis . $slash . "(common" . $period . "(cgi|php))|manager" . $slash . "html|stssys" . $period . "htm|((mysql|phpmy|db|my)admin|pma|sqlitemanager|sqlite|websql)" . $slash . "|(jmx|web)-console|bitrix|invoker|muieblackcat|w00tw00t|websql|xampp|cfide|wordpress|wp-admin|hnap1|tmunblock|soapcaller|zabbix|elfinder)";
$sqls = "((un)?hex\(|name_const\(|char\(|a=0)";
$nulls = "(%00|%2500)";
$truth = "(.1,4)=\1"; // catch OR always-true (1=1) clauses via sql inject - not used atm, its too broad and may capture search=chowder (ch=ch) for example
$regex = "/$invalid|$period1,2$slash|$routes|$filetypes|$phps|$doors|$sqls|$nulls/i";
使用它,至少与 PHP 一起使用,与preg_match_all()
一起使用非常简单。这是一个如何使用它的示例:https://gist.github.com/dhaupin/605b35ca64ca0d061f05c4cf423521ab
警告:如果将此设置为 autoban(即,fail2ban 过滤器),请小心。 MS/Bing DumbBots(和其他人)经常通过在截断的 url 中输入奇怪的三点之类的东西来弄乱 url,或者尝试将 tel:
链接作为 Uri 进行点击。我不知道为什么。这就是我的意思:带有文本www.example.com/link-too-long...truncated.html
的链接可能指向正确的url,但必应可能会尝试“按其外观”访问它,而不是遵循href
,从而导致由于双点而导致WAF 命中。
【讨论】:
请注意,如果您最终使用 ModSecurity,请先将其设置为详细 + 无进程模式。有很多规则会试图拒绝 Googlebot —— 奇怪的是,其中一个规则是 IP 信誉规则。在无进程模式下,您可能会看到日志泛滥,但未采取任何措施,因此您可以禁用严格规则。 我也在我的网址末尾看到了这些 'A=0。我浏览了很多代码,想知道我做了什么导致这种情况,当然什么也没找到。然后我检查了 IP 地址,它们都不是来自我认识的任何客户 IP 地址。真的是有人在尝试注射。【参考方案2】:因为这是一个非常旧的 FireFox 版本,所以我在我的 htaccess 文件中阻止了它 -
RewriteCond %HTTP_USER_AGENT Firefox/3\.5\.2 [NC]
RewriteRule .* err404.php [R,L]
【讨论】:
以上是关于Web 服务器日志中包含 'A=0 或 '0=A 的奇怪 URL的主要内容,如果未能解决你的问题,请参考以下文章
web开发问题HTTP请求POSTDATA中包含多层对象如何获取?