2

我在一个网站上做自由职业者,该网站在我工作之前被黑了 3 次。

我现在正在工作,经过一些更改后,我将上传我使用这些步骤来确保安全。其他一些帮助完整的提示将不胜感激。

我认为服务器有问题,因为某些端口不安全。而且我无法找到并与服务器管理员沟通。

我想从黑客攻击中创建完全安全的网站:

我使用这两个函数来防止 sql 注入。

function escape($string) {
    if(get_magic_quotes_gpc()) $string = stripslashes($string);
    return mysql_real_escape_string($string);
}

还有一些时间使用:

function remove_spc_chr($str){
        $str=trim($str);

        $arr=array('%','$','/','\\','*','+','=','\'','"','#','@','(',')','^','~','`','&',
                ',',';','\'','?','<','>','!','{','}','[',']');

        $str=str_replace($arr,'',$str);

        $str=strip_tags($str);

        return $str;        
}

我将这段代码用于 htaccess 安全性:

RewriteEngine on
Options -Indexes

Options +FollowSymlinks
RewriteRule ^(.*)\.html$ $1.php [nc]


Options +FollowSymlinks
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} http:.*\/.*\/ [OR]
RewriteCond %{QUERY_STRING} ..*\/ [OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteCond %{QUERY_STRING} [^a-z](declare|char|set|cast|convert|delete|drop|exec|insert|meta|script|select|truncate|update)[^a-z] [NC]
RewriteRule (.*) - [F]


<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|aol|slurp|bing) [OR]
RewriteCond %{HTTP_REFERER} (google|aol|yahoo|search|bing)
RewriteCond %{REQUEST_URI} /$ [OR]
RewriteCond %{REQUEST_FILENAME} (html|htm|php|phps|shtml|xml|xhtml|phtml)$ [NC]
</IfModule>




#Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]

#Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]

#Block out any script that includes a script tag in URL
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]


#Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]

#Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})

#Send all blocked request to homepage with 403 Forbidden error!
#RewriteRule ^(.*)$ index.html [F,L]


#DirectoryIndex index.html

SetEnv TZ America/California
AddDefaultCharset utf-8
DefaultLanguage en-US
LimitRequestBody 10240000

        <FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
         Order Allow,Deny
         Deny from all
        </FilesMatch>

        <ifmodule mod_php4.c>
         #php_value zlib.output_compression 16386
        </ifmodule>

        AddType image/gif                       .gif .GIF
        AddType image/ief                       .ief
        AddType image/jpeg                      .jpeg .jpg .jpe .JPG
        AddType image/tiff                      .tiff .tifAuthName wapadik.net
        IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

        RewriteCond %{REQUEST_METHOD} (GET) [NC]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)https(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)https%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)http(%3A|:)(/|%2F){2}(.*)$ [NC]
        RewriteRule (.*) /huwad/blocker/blocker1.php   [L]

        RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
        RewriteCond %{QUERY_STRING} ^(.*)(%20SELECT%20|%20INSERT%20|CHAR\(|%20UPDATE%20|%20REPLACE%20)(.*)$ [NC]
        RewriteRule (.*) /huwad/blocker/blocker1.php   [L]

        RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
        RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR]

        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)http%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)ftp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)ht%20tp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)htt%20p(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)http%20(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
        RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)h%20ttp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]

        RewriteCond %{QUERY_STRING} ^(.*)base64_encode(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
        RewriteCond %{REQUEST_URI} ^(.*)_vti(.*)$ [OR]
        RewriteCond %{REQUEST_URI} ^(.*)MSOffice(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)/etc/passwd(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)//(.*)$ [OR]
        RewriteCond %{REQUEST_URI} ^(.*)ShellAdresi.TXT(.*)$ [OR]
        RewriteCond %{REQUEST_URI} ^(.*)\[evil_root\]?(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)\.\./\.\./\.\./(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)/proc/self/environ(.*)$
        RewriteRule (.*) /huwad/blocker/blocker1.php   [L]

        RewriteCond %{HTTP_USER_AGENT} @nonymouse|ADSARobot|amzn_assoc|Anarchie|ASPSeek|Atomz|^[^?]*addresses\.com|Advanced\ Email\ Extractor|ah-ha|aktuelles|almaden|Art-Online|AspiWeb|ASSORT|ATHENS|attach|attache|autoemailspider|BackWeb|Bandit|BatchFTP|bdfetch|big.brother|BlackWidow|bmclient|Boston\ Project|Bot\ mailto:craftbot@yahoo.com|BravoBrian\ SpiderEngine\ MarcoPolo|Buddy|Bullseye|bumblebee|capture|CherryPicker|ChinaClaw|CICC|clipping|Crescent\ Internet\ ToolPack|cURL|Custo|cyberalert|Deweb|diagem|Digger|Digimarc|DIIbot|DirectUpdate|DISCo|Download\ Accelerator|Download\ Demon|Download\ Wonder|Downloader|Drip|DSurf15a|DTS.Agent|EasyDL|eCatch|echo\ extense|ecollector|efp@gmx\.net|EirGrabber|EmailCollector|Email\ Extractor|EmailSiphon|EmailWolf|Express\ WebPictures|ExtractorPro|EyeNetIE|fastlwspider|FavOrg|Favorites\ Sweeper|Fetch\ API\ Request|FEZhead|FileHound|FlashGet|FlickBot|fluffy|frontpage|GalaxyBot|Generic|Getleft|GetRight|GetSmart|GetWeb!|GetWebPage|gigabaz|Girafabot|Go!Zilla|Go-Ahead-Got-It|GornKer|Grabber|GrabNet|Grafula|Green\ Research|Harvest|hhjhj@yahoo|hloader|HMView|HomePageSearch|HTTP\ agent|HTTPConnect|httpdown|http\ generic|HTTrack|^[^?]*iaea\.org|IBM_Planetwide|^[^?]*\.ideography\.co\.uk|Image\ Stripper|Image\ Sucker|imagefetch|IncyWincy|Indy\ Library|informant|Ingelin|InterGET|Internet\ Ninja|InternetLinkAgent|InternetSeer\.com|Iria|Irvine|iOpus|IPiumBot\ laurion(dot)com|Jakarta|JBH*Agent|JetCar|JustView|Kapere|KWebGet|Lachesis|larbin|LeechFTP|LexiBot|lftp|libwww|likse|Link*Sleuth|LINKS\ ARoMATIZED|LinkWalker|LWP|lwp-trivial|Magnet|Mac\ Finder|Mag-Net|Mass\ Downloader|MemoWeb|MCspider|Microsoft\ URL\ Control|MIDown\ tool|minibot\(NaverRobot\)|Mirror|Missigua\ Locator|Mister\ PiX|MMMtoCrawl\/UrlDispatcherLLL|MSProxy|multithreaddb|nationaldirectory|Navroad|NearSite|NetAnts|NetCarta|netfactual|netcraft|NetMechanic|netprospector|NetResearchServer|NetSpider|Net\ Vampire|NetZIP|NEWT|nicerspro|NPBot|Octopus|Offline\ Explorer|Offline\ Navigator|OpaL|Openfind|OpenTextSiteCrawler|OutWit|PackRat|PageGrabber|Papa\ Foto|pavuk|pcBrowser|PersonaPilot|PingALink|Pockey|Program\ Shareware|psbot|PSurf|puf|Pump|PushSite|QRVA|QuepasaCreep|RealDownload|Reaper|Recorder|ReGet|replacer|RepoMonkey|Robozilla|Rover|RPT-HTTPClient|Rsync|SearchExpress|searchhippo|searchterms\.it|Second\ Street\ Research|Shai|sitecheck|SiteMapper|SiteSnagger|SlySearch|SmartDownload|snagger|SpaceBison|Spegla|SpiderBot|SqWorm|Star\ Downloader|Stripper|Sucker|SuperBot|SuperHTTP|Surfbot|SurfWalker|Szukacz|tAkeOut|tarspider|Teleport\ Pro|Telesoft|Templeton|traffixer|TrueRobot|TuringOS|TurnitinBot|TV33_Mercator|UIowaCrawler|URL_Spider_Pro|UtilMind|Vacuum|vagabondo|vayala|visibilitygap|vobsub|VoidEYE|vspider|w3mir|web\.by\.mail|Web\ Data\ Extractor|Web\ Downloader|Web\ Image\ Collector|Web\ Sucker|WebAuto|webbandit|Webclipping|webcollector|webcollage|WebCopier|webcraft@bea|WebDAV|webdevil|webdownloader|Webdup|WebEmailExtractor|WebFetch|WebGo\ IS|WebHook|Webinator|WebLeacher|WebMiner|WebMirror|webmole|WebReaper|WebSauger|WEBsaver|Website\ eXtractor|Website\ Quester|WebSnake|Webster|WebStripper|websucker|webvac|webwalk|webweasel|WebWhacker|WebZIP|Wget|whizbang|WhosTalking|Widow|WISEbot|WUMPUS|Wweb|WWWOFFLE|Wysigot|Xaldon\ WebSpider|XGET|x-Tractor|Zeus.* [OR]

        RewriteCond %{REQUEST_URI} .*((php|my)?shell|remview.*|phpremoteview.*|sshphp.*|pcom|nstview.*|c99|r57|webadmin.*|phpget.*|phpwriter.*|fileditor.*|locus7.*|storm7.*)\.(p?s?x?htm?l?|txt|aspx?|cfml?|cgi|pl|php[3-9]{0,1}|jsp?|sql|xml) [NC,OR]
        RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
        RewriteCond %{QUERY_STRING} ^(.*)=/home(.+)?/(.*)/(.*)$ [OR]
        RewriteCond %{QUERY_STRING} ^work_dir=.*$ [OR]
        RewriteCond %{QUERY_STRING} ^command=.*&output.*$ [OR]
        RewriteCond %{QUERY_STRING} ^nts_[a-z0-9_]{0,10}=.*$ [OR]
        RewriteCond %{QUERY_STRING} ^c=(t|setup|codes)$ [OR]
        RewriteCond %{QUERY_STRING} ^act=((about|cmd|selfremove|chbd|trojan|backc|massbrowsersploit|exploits|grablogins|upload.*)|((chmod|f)&f=.*))$ [OR]
        RewriteCond %{QUERY_STRING} ^act=(ls|search|fsbuff|encoder|tools|processes|ftpquickbrute|security|sql|eval|update|feedback|cmd|gofile|mkfile)&d=.*$ [OR]
        RewriteCond %{QUERY_STRING} ^&?c=(l?v?i?&d=|v&fnot=|setup&ref=|l&r=|d&d=|tree&d|t&d=|e&d=|i&d=|codes|md5crack).*$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)([-_a-z]{1,15})=(ls|cd|cat|rm|mv|vim|chmod|chdir|mkdir|rmdir|pwd|clear|whoami|uname|tar|zip|unzip|tar|gzip|gunzip|grep|more|ln|umask|telnet|ssh|ftp|head|tail|which|mkmode|touch|logname|edit_file|search_text|find_text|php_eval|download_file|ftp_file_down|ftp_file_up|ftp_brute|mail_file|mysql|mysql_dump|db_query)([^a-zA-Z0-9].+)*$ [OR]
        RewriteCond %{QUERY_STRING} ^(.*)(wget|shell_exec|passthru|system|exec|popen|proc_open)(.*)$
        #RewriteRule  (.*)  /huwad/blocker/blocker3.php  [L]


ErrorDocument 400 /index.html
ErrorDocument 403 /index.html
ErrorDocument 404 /index.html
ErrorDocument 405 /index.html
ErrorDocument 408 /index.html
ErrorDocument 500 /index.html
ErrorDocument 502 /index.html
ErrorDocument 504 /index.html

        <Files 403.shtml>
        order allow,deny
        allow from all
        </Files>

Htaccess 参考

我在查询中使用之前检查变量是否正确。

如果有安全步骤对我有帮助吗?

如果有问题或任何漏洞,请回答安全步骤。

4

2 回答 2

2

我将首先关注您引用的这个函数:

function escape($string) {
    if(get_magic_quotes_gpc()) $string = stripslashes($string);
    return mysql_real_escape_string($string);
}

这里的意图是好的,但存在一些主要问题,主要是由于使用了过时的 PHP 技术。

  • 首先,不推荐使用Magic Quotes。最新版本的 PHP (5.4)get_magic_quotes_gpc()完全删除了该功能。PHP 5.3 包含它,但会引发弃用警告。

    如果您使用的是 PHP 5.4,则此代码根本不起作用。

    如果您使用的是 PHP 5.3,您应该已经注意到正在生成的错误消息。您可以将 PHP 设置为忽略它们,但这不是一个好主意。您应该确保魔术引号已关闭,并且您可以删除这行代码。

    如果您使用的是 PHP 5.2 或更早版本,则需要升级。5.2 两年来一直不受支持,并且已经知道永远不会修补的安全问题。

  • 其次,mysql_xxx()功能已被弃用。它们被认为是过时且不安全的,将从未来的 PHP 版本中删除。强烈建议不要再使用它们;应该切换到mysqli_xx()函数或 PDO 库。

    根据代码的质量(和大小),这可能是一项艰巨的任务,但如果您试图使代码更安全,这一点很重要。

    作为额外的好处,mysqli 和 PDO 扩展都提供了一种名为 Prepared Queries 的 SQL 技术,它允许您构建 SQL 查询而无需手动转义参数。这被认为是当前的最佳实践,可以完全替代使用这些escape_string功能。同样,在现有系统中实施这将是相当多的工作,但以安全的名义可能是值得的。

现在,您用来防止 SQL 注入的第二个函数:

function remove_spc_chr($str){ ... }

断然,这是行不通的。如果你依赖这个函数来做和这个函数一样的工作escape(),它很容易被破解。黑客可以使用多种方法绕过此代码,包括null在字符串中包含字符,并且根据您使用的字符编码,有多种方法可以使用非 ASCII 字符来攻击DB也不会在这里被选中。始终对发送到数据库的数据(或准备好的查询,如上所述)使用适当的转义机制。

关于你提供的 htaccess 代码,我可以看到你在这里做什么,试图阻止某些 SQL 和 PHP 关键字。如果脚本本身得到了适当的保护,那么这些都不是必需的。特别是,如果代码中的查询被正确转义/准备,SQL 关键字应该是完全安全的。此外,许多 SQL 关键字是常见的英文单词,因此阻止它们可能会导致人们在您网站的表单中发布合法文本时遇到问题。

您引用的所有内容的另一个问题是它只处理少数相当具体的攻击(据我所知,其中大部分不太可能是已经破坏该站点的攻击)。您还没有处理很多攻击媒介。

我建议采取一些更可靠的保护措施。如果您的服务器没有运行 PHP Suhosin 扩展,那么您应该升级 PHP 版本以包含它。这是 PHP 的通用安全强化扩展。它可以做很多事情来帮助保护 PHP 站点,但对你来说,我想说一个关键特性是能够禁用不安全的 PHP 特性和函数,例如exec()system()函数。仅此一项就会对入侵您的网站的能力产生重大影响,而您根本不需要任何代码更改。

于 2013-01-23T12:33:41.493 回答
0

这里有很多问题。

假设您已将 SQL 注入识别为漏洞(并且您还需要确定这是否是先前攻击中被利用的漏洞,以及调查和消除任何其他漏洞 - 这些漏洞很可能存在)然后......

我接受纠正围绕启用magic_quotes 构建的代码库的配置可能不切实际,但首先修复配置是解决问题的正确方法。此外,magic_quotes 的问题之一是某些扩展通过后门路由启用它们 - 您不一定要依赖 get_magic_quotes_gpc()。但是如果配置没有改变,那么行为将是一致的——所以测量行为并相应地调整你的代码。如果启用了魔术引号,那么理想情况下,您应该设置自己的指示器来指示当前是否启用了魔术引号 - 当有人能够正确解决问题时,这将使生活变得更简单。

但是这里的第一个大问题是,您为什么要使用自己的代码来转义数据?您应该这样做的唯一方法是通过 mysql_real_escape_string() 或通过绑定参数。您绝不应该使用 remove_spc_chr() 作为转义数据以拼接到 SQL 字符串中的方法。

这里的第二个 WTF 是您似乎正在尝试使用您的重写 tules 来解决不同类型的攻击 - 这意味着您不知道漏洞是什么。但是您的重写配置仅解决了一些非常具体的攻击。更好的解决方案是使用 mod_security 和/或 fail2ban。

将 index.html 用作通用错误处理程序并不能提供良好的用户体验。

我认为服务器有问题,因为某些端口不安全

如果是这种情况,那么您对网络服务器所做的任何事情都不会提高安全性。

我无法找到并与服务器管理员沟通

如果是这种情况,那么您几乎无法提高安全性。

于 2013-01-23T11:50:49.973 回答