Skip to content

Instantly share code, notes, and snippets.

@tguruslan
Last active January 11, 2024 11:23
Show Gist options
  • Save tguruslan/ab4d3346da939f7a0b132665feccf857 to your computer and use it in GitHub Desktop.
Save tguruslan/ab4d3346da939f7a0b132665feccf857 to your computer and use it in GitHub Desktop.
Пошук в базі данник небажаного коду
<?php
// Параметри для підключення до MySQL серверу
$servername = "127.0.0.1";
$username = "";
$password = "";
error_reporting(E_DEBUG);
ini_set('display_errors', 'on');
$tags=[
'iframe'=>[
'attr'=>'src',
'accept'=>['(?:.+\.)?youtube\.com','(?:.+\.)?google\.com','(?:.+\.)?facebook\.com','(?:.+\.)?udpu\.(org|edu)\.ua','slideshare\.net','onedrive\.live\.com','prezi\.com']
],
'script'=>[
'attr'=>'src',
'accept'=>['(?:.+\.)?youtube\.com','(?:.+\.)?google\.com','(?:.+\.)?facebook\.com']
],
'object'=>[
'attr'=>'data',
'accept'=>['(?:.+\.)?youtube\.com','(?:.+\.)?google\.com','(?:.+\.)?facebook\.com']
],
'embed'=>[
'attr'=>'src',
'accept'=>[]
],
];
$ignore_databases=['information_schema'];
// Підключення до MySQL серверу
$conn = mysqli_connect($servername, $username, $password);
mysqli_set_charset($conn, "utf8mb4");
// Вибір всіх баз даних
$result = mysqli_query($conn, "SHOW DATABASES");
// Перебір кожної бази даних
while ($row = mysqli_fetch_assoc($result)) {
$database_name = $row['Database'];
if(!in_array($database_name,$ignore_databases)){
$filename=realpath(dirname(__FILE__)).'/results/result_'.$database_name.'.csv';
$fp1 = fopen($filename, 'w+');
$lines=0;
mysqli_select_db($conn, $database_name);
// Вибір всіх таблиць поточної бази даних
$table_result = mysqli_query($conn, "SHOW TABLES");
while ($table_row = mysqli_fetch_row($table_result)) {
$table_name = $table_row[0];
// Вибір всіх колонок таблиці та пошук вказаного слова у кожній колонці
$column_query = "SHOW COLUMNS FROM $table_name";
$column_result = mysqli_query($conn, $column_query);
while ($column_row = mysqli_fetch_assoc($column_result)) {
$column_name = $column_row['Field'];
$search_query = "SELECT * FROM $table_name WHERE ($column_name LIKE ".implode(" OR ".$column_name." LIKE ",array_map(function($el) {return '\'%</'.$el.'>%\'';}, array_keys($tags))).")";
$search_result = mysqli_query($conn, $search_query);
// Виведення результатів пошуку
while ($search_row = mysqli_fetch_assoc($search_result)) {
foreach ($search_row as $key => $value) {
$dom = new DOMDocument();
$dom->loadHTML($value);
$to_file=false;
$out="";
foreach ($tags as $tag => $opts) {
try {
$$tag = $dom->getElementsByTagName($tag);
$count=$$tag->length;
for ($i = 0; $i < $$tag->length; $i++) {
$attr=$$tag->item($i)->getAttribute($opts['attr']);
$print=true;
foreach ($opts['accept'] as $k) {
if(preg_match('/^(https?:\/\/|\/\/)'.$k.'/', $attr) || preg_match('/^\/[^\/]+.*/', $attr) || (preg_match('/^\w+.*/', $attr) && !preg_match('/^http.*/', $attr))){
$print=false;
$count--;
}
}
if($print){
$out.=$dom->saveHTML($$tag->item($i));
}
}
if($count > 0){
$to_file=true;
}
} catch (\Throwable $th) {
//throw $th;
}
}
if($to_file){
$lines++;
echo $database_name.', '.$table_name.', '.$column_name."\n";
fputcsv($fp1, [$database_name,$table_name,$column_name]);
//fputcsv($fp1, [$key,$value]);
fputcsv($fp1, [$key,$out]);
fputcsv($fp1, []);
fputcsv($fp1, []);
}
}
}
}
}
fclose($fp1);
if($lines==0){
unlink($filename);
}else{
echo "Результати в '".$filename.".csv'\n";
}
}
}
// Закриття підключення до MySQL серверу
mysqli_close($conn);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment