其实这个话题很早就想说说了,发现国内不少PHP站点都有XSS漏洞。今天偶然看到PHP5的一个XSS漏洞,在此小结一下。顺便提醒,使用PHP5的朋友最好打下补丁,或者升级一下。
如果你不懂什么是XSS,可以看这里,或者这里(中文的也许会好懂一些)。
国内不少论坛都存在跨站脚本漏洞,例如这里 有一个Google Hack+XSS的攻击例子,针对的是Discuz 4.0.0RC3。国外也很多这样的例子,甚至Google也出现过,不过在12月初时修正了。跨站攻击很容易就可以构造,而且非常隐蔽,不易被查觉(通常盗取信息后马上跳转回原页面)。
如何攻击,在此不作说明(也不要问我),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用<font color="#000000"><font face="新宋体"><font color="#0000bb"><?php<BR>$str </FONT><FONT color=#007700>= </FONT><FONT color=#dd0000>"A quote is <b>bold</b>"</font></font><font face="新宋体" color="#007700">;<br><br></font><font face="新宋体"><font color="#ff8000">// Outputs: A quote is <b>bold</b><br></font><font color="#007700">echo </font><font style="BACKGROUND-COLOR: rgb(49,106,197)" color="#ffffff">htmlentities</font><font color="#007700">(</font><font color="#0000bb">$str</font></font><font face="新宋体" color="#007700">);<br><br></font><font face="新宋体"><font color="#ff8000">// Outputs: A 'quote' is <b>bold</b><br></font><font color="#007700">echo </font><font style="BACKGROUND-COLOR: rgb(49,106,197)" color="#ffffff">htmlentities</font><font color="#007700">(</font><font color="#0000bb">$str</font><font color="#007700">, </font><font color="#0000bb">ENT_QUOTES</font></font><font face="新宋体" color="#007700">);<br></font><font face="新宋体"><font color="#0000bb">?><br><br><br>这样可以使非法的脚本失效。<br></font> </font></font>
<font color="#000000"><font style="BACKGROUND-COLOR: rgb(49,106,197)" face="新宋体" color="#ffffff">htmlentities()</font></font>
默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。
这里提供一过滤非法脚本的関数:function RemoveXSS($val) { <br> <font style="COLOR: rgb(51,153,102)" color="#6fe16f">// すべての印刷不可能な文字を削除します。 CR(0a)、LF(0b)、TAB(9) は許可されます</font><span style="COLOR: rgb(51,153,102)"> </span><br style="COLOR: rgb(51,153,102)"><span style="COLOR: rgb(51,153,102)"> </span><font style="COLOR: rgb(51,153,102)" color="#6fe16f">// これにより、<javascript></font><span style="COLOR: rgb(51,153,102)"> </span><br style="COLOR: rgb(51,153,102)"><span style="COLOR: rgb(51,153,102)"> </span><font style="COLOR: rgb(51,153,102)" color="#6fe16f">// などの一部の文字の再間隔が妨げられることに注意してください。分割を処理する必要があります
、、、および以降は、一部の入力で *許可されているためです</font><span style="COLOR: rgb(51,153,102)"> </span><br> $val = preg_replace(<font color="#cf41cf">/([x00-x08][x0b-x0c][x0e-x20])/</font>, <font color="#cf41cf"></font>, $val) ; <br> <br> <font color="#6fe16f">// 直接の置換。これらは通常の文字であるため、ユーザーはこれらを必要としません</font> <br> <font color="#6fe16f">// これにより、<IMG SRC=@avascrip& のようなことが防止されます#X74:alert('XSS')></font> <br> $search = <font color="#cf41cf">abcdefghijklmnopqrstuvwxyz</font>; <br> $search .= <font color="#cf41cf">ABCDEFGHIJKLMNOPQRSTUVWXYZ</font>; <br> $search .= <font color="#cf41cf">1234567890!@#$%^&*()</font>; <br> $search .= <font color="#cf41cf">~`";:?+/={}[]-_|</font>; <br> for ($i = 0; $i <strlen> <font color="#6fe16f">// ;? ; に一致します。これはオプションです</font> <br> <font color="#6fe16f">// 0{0,7} は、オプションで最大 8 文字までの埋め込みゼロと一致します</font> <br> <br> <font color="#6fe16f">// @ @ 16 進数の値を検索します</font> <br> $val = preg_replace(<font color="#cf41cf">/([x|X]0{0,8}</font>.dechex(ord($search[$i])).<font color="#cf41cf">;?)/i</font>, $search[$i] ], $val); <font color="#6fe16f">// ;</font> <br> <font color="#6fe16f">// @ @ 0{0,7} は 0 に 0 回から 7 回一致します</font> <br> $val = preg_replace(<font color="#cf41cf">/({0,8) }</font>.ord($search[$i]).<font color="#cf41cf">;?)/</font>, $search[$i], $val); <font color="#6fe16f">// ;</font> <br> }<br> <br> <font color="#6fe16f">// 現在、残っている空白攻撃は ,
、および </font> <br> $ra1 = Array(<font color="#cf41cf">javascript</font>, <font color="#cf41cf">vbscript</font>, <font color="#cf41cf">expression</font>, <font color="#cf41cf">アプレット</font>, <font color="#cf41cf">meta</font>, <font color="#cf41cf">xml</font>, <font color="#cf41cf">blink</font>, <font color="#cf41cf">link</font>,スタイル<font color="#cf41cf">、</font>スクリプト<font color="#cf41cf">、</font> embed<font color="#cf41cf">、</font>object<font color="#cf41cf">、</font>iframe<font color="#cf41cf">、</font>frame<font color="#cf41cf">、</font>frameset<font color="#cf41cf">、</font>ilayer<font color="#cf41cf">、</font>layer<font color="#cf41cf">、</font>bgsound<font color="#cf41cf">、</font>title<font color="#cf41cf">、</font>base<font color="#cf41cf">); </font> $ra2 = Array(<br>onabort<font color="#cf41cf">, </font>onactivate<font color="#cf41cf">, </font>onafterprint<font color="#cf41cf">, </font>onafterupdate<font color="#cf41cf">, </font>onbeforeactivate<font color="#cf41cf">, </font>onbeforecopy<font color="#cf41cf">, </font>onbeforecut<font color="#cf41cf">, </font>onbeforedeactivate<font color="#cf41cf">, </font>編集フォーカス前<font color="#cf41cf">、</font>ペースト前<font color="#cf41cf">、</font>印刷前<font color="#cf41cf">、 </font>onbeforeunload<font color="#cf41cf">、</font>onbeforeupdate<font color="#cf41cf">、</font>onblur<font color="#cf41cf">、</font>onbounce<font color="#cf41cf">、</font>oncellchange<font color="#cf41cf">、</font>onchange<font color="#cf41cf">、</font>onclick<font color="#cf41cf">、</font>oncontextmenu<font color="#cf41cf">、</font>oncontrolselect<font color="#cf41cf">、 </font>oncopy<font color="#cf41cf">、</font>oncut<font color="#cf41cf">、</font>ondataavailable<font color="#cf41cf">、</font>ondatasetchanged <font color="#cf41cf">、</font>ondatasetcomplete<font color="#cf41cf">、</font>ondblclick<font color="#cf41cf">、</font>ondeactivate<font color="#cf41cf">、</font>ondrag<font color="#cf41cf">、</font>ondragend<font color="#cf41cf">、</font>ondragenter<font color="#cf41cf">、</font>ondragleave<font color="#cf41cf">、</font>ondragover<font color="#cf41cf">、ドラッグスタート</font>、<font color="#cf41cf">
</font><fo><p align="left">http://www.bkjia.com/PHPjc/508507.html</p>
<div style="display:none;">
<span id="url" itemprop="url">www.bkjia.com</span><span id="indexUrl" itemprop="indexUrl">true</span><span id="isOriginal" itemprop="isOriginal">http://www.bkjia.com/PHPjc/508507.html</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">技術記事</span><span id="genre" itemprop="genre">この問題はかなり早い時期に行われ、国内のあらゆる PHP ステーション ポイントに XSS 洞があることが判明しました。今日、PHP 5 の 1 つの XSS 洞をここで発見しました。 </span>
<span id="description" itemprop="description"></span>
</div></fo></strlen>