Виконайте команду оболонки під час події клацання на веб-сторінці


11

Чи є спосіб виконати команду bash, коли натискаю текст у браузері?

Веб-сторінка знаходиться на комп'ютері A, браузер - на комп’ютері B: Я хочу виконати код на комп’ютері B, наприклад, hsetrootзмінити шпалери при натисканні на зображення.

Відповіді:


5

Не дуже, ні. Це матір усіх дірок у безпеці. Ви запитуєте, чи можете ви створити веб-сторінку, яка виконує довільні команди на комп'ютері клієнта. Що робити, якщо я налаштував веб-сторінку, яка виконує цю команду:

rm -rf ~/

Це видалить усі файли у вашому $HOME. Насправді, нещодавно виникло заворушення, коли було виявлено помилку, яка дозволила це статися. Одним із можливих векторів атаки було обманювати клієнта (комп'ютер B у вашому випадку) на виконання команди bash.

Так ні, ви не можете виконувати довільний код на локальній машині через веб-браузер. Не без того, щоб якось увійти в систему спочатку. Ви можете запускати JavaScript або подібні мовні команди, але вони не матимуть доступу до сеансу вашого користувача.


Дякую за відповідь, я розумію очевидну проблему там. Я намагаюся цього досягти за допомогою спеціального браузера: stackoverflow.com/questions/30963508/…
bob dylan

@bobdylan Я не думаю, що це можливо. Я, звичайно, сподіваюся, що це все одно. Це, до речі, маленька програма. Я не мав уявлення, що це зробити так просто! Суть, однак, полягає в тому, що я не думаю, що можна запустити локальний сеанс оболонки з браузера.
тердон

Ну, скажімо, я хочу зробити гібридний веб-сайт / програму з деякою функціональністю, пов'язаною з моєю ОС. Тож мій браузер не буде нормальним "браузером". Тож я не бачу, як це неможливо.
bob dylan

Звичайно, це можливо для програми. Поміркуйте: в принципі немає різниці між FTP-клієнтом і браузером (HTTP-клієнтом) - вони взаємодіють як з місцевим користувачем, так і з сервером. Тривіально клієнт FTP може змінювати локальні файли та виконувати (деякі) локальні команди. Звичайно, це лише за бажанням користувача, але це не є реальною обмеженням. Тож браузер може зробити те саме. Близько десяти років тому я чув, що деякі основні веб-переглядачі мали налаштування безпеки настільки низько, що вони дозволяли це робити, але я не пригадую деталей, і, мабуть, з тих пір все посилилося.
G-Man каже: "Відновіть Моніку"

@ G-Man, я не знаю, чи можливо повернення кліку до браузера і спричинить запуск сеансу оболонки. FTP дуже відрізняється тим, що ініціює сеанс за визначенням. Я не кажу, що це на 100% неможливо, я насправді не знаю, я просто думаю, що це неможливо, і це, звичайно, неможливо з існуючими браузерами.
terdon

3

Це не можна робити взагалі, але у визначеному середовищі, де ви можете керувати клієнтською машиною B, ви можете запропонувати, що машина B запускає послугу setroot, ви можете просто написати самостійно, наприклад, з nodejs або golang і поговорити з цим послуга при отриманні події. Але в будь-якому випадку у вас немає шансів (або принаймні у вас ніколи не повинно бути шансів), якщо ви не встановите додатковий сервіс на машині B.


Я ніколи раніше не використовував NodeJs. Ви маєте на увазі, що я можу використовувати простий JavaScript, наприклад run("whatever command on machine B");:?
bob dylan

так, nodejs дуже простий у використанні для таких знижених потреб.
ikrabbe

@ikrabbe: Вітаємо з досягненням 500 репутації. (І, BTW, симпатичний граватар. Тільки не дозволяйте вашій супер білці вільно біля моїх котів! :-)
G-Man каже: "Відновіть Моніку"

3

Я вирішую це за допомогою сервера nodeJS. (не чистий / остаточний код, але його працює)

Комп'ютер A: (сервер)

function change_wallpaper(image){
    var objReq = new XMLHttpRequest();
    objReq.open("GET", "http://localhost:8888" + "?image=" + image, false);
    objReq.send(null);
}
<img src="./img/1.jpeg" onclick="change_wallpaper(this.src);" />
<img src="./img/2.jpeg" onclick="change_wallpaper(this.src);" />

Комп'ютер B: (клієнтський) файл, який називається server.jsans, виконаний за допомогоюnodejs server.js

var http = require("http");
var sys = require('sys')
var exec = require('child_process').exec;
var url = require("url");

function onRequest(request, response) {
    var params = url.parse(request.url,true).query;
    function puts(error, stdout, stderr) {sys.puts(stdout)}
    exec("/usr/bin/feh --bg-center " + params.image, puts);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Wallpaper');
}

http.createServer(onRequest).listen(8888);

так як моя відповідь привела вас до використання методу, який ви запитували, було б добре просто попросити редагування моєї відповіді, включаючи ваш код і за винятком нього, як я описую метод виконання команди оболонки, як ви запитували для та його загальний підхід. Написання портативних служб для клієнтських машин може зробити багато, багато речей. Якби ви проголосували за мою відповідь, це теж було б нормально.
ikrabbe

2
@ikrabbe ОП не може голосувати, у них немає представника. Що стосується прийняття, так, ваша відповідь (яку я підняв) дійсно дала їм вказівник, але ви не пояснили, як вони можуть використовувати nodejs, і не навели приклад. Ваша відповідь була дуже корисною, але вона насправді не вирішила проблему ОП, вона лише вказала на них у правильному напрямку. Опублікувати власну відповідь і прийняти її цілком нормально.
тердон

0

PHP може змінити вміст текстових файлів через браузер, наприклад в /var/www/.../folder/mytextfie.txt Ви повинні отримати лише рядок із цього файлу, який може бути командою або навіть командою для запуску файлу сценарію .

cronjob може запуститись, щоб перевірити, чи текстовий файл містить будь-який виконуваний файл.

#!/usr/bin/env bash
echo $(cat /var/www/.../folder/commandsperline.txt)
#or 
while read line
    do
    echo "$(${line})"
done< "/var/www/.../folder/commandsperline.txt"

контекст цього текстового файлу:

#!/bin bash
#you need to declare absolute path
# chmod 755 /home/user/*.sh -to make executabble all scripts there
/home/user/backup.sh
/home/user/anyscript.sh

З циклом te while можна виконувати команди з цього текстового файлу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.