Как правило, в целях безопасности приложения, входящие символы очищают. Когда дело доходит до SQL инъекции, причина в большинстве случаев заключается в том, что входные данные не были должным образом очищены. Мне было интересно узнать о языке Windows Management Instrumentation Query - WQL, который является SQL для WMI. Можем ли мы проэксплуатировать WQL, если входящие данные не очищают?
Я написал простое приложение на C++, которое получает служебную информацию из класса Win32_Service. Приложение будет отображать такие элементы, как Name, ProcessId, PathName, Description и т.д.
Это WQL Query.
Как вы видите, я использую метод
Как только пользователь введет имя службы, приложение отобразит его участников.
Я подумал, возможно ли сделать запрос и вернуть им все сервисы целевого хоста. Что-то вроде
Так как в этом случае входящие данные (пользовательский ввод) должным образом не очищены, мы можем использовать ключевое слово
Также вы просто можете использовать «%».
Это простая демонстрация, чтобы доказать существование WQL injection. Я уверен, что есть и другие, более удачные, варианты демонстрации бага. Тем не менее, Extended WQL, который является надмножеством WQL, можно использовать для объединения операторов и выполнения более интересных задач. Он используется System Center Configuration Manager - SCCM. Всегда санируйте входящие данные приложения.
Вы можете скачать приложения отсюда, чтобы потестировать материалы, о которых мы говорили выше.
оригинал
автор @ Osanda Malith Jayathissa
Перевод: tabac, специально для https://xss.pro
Я написал простое приложение на C++, которое получает служебную информацию из класса Win32_Service. Приложение будет отображать такие элементы, как Name, ProcessId, PathName, Description и т.д.
Это WQL Query.
Код:
SELECT * FROM win32_service where Name='User Input'
IWbemServices::ExecQuery для выполнения запроса и перечисления пользователей с помощью метода IEnumWbemClassObject::Next.
Код:
IWbemServices* pService = NULL;
BSTR input = L"SELECT * FROM win32_service where Name='User Input'";
if (FAILED(hRes = pService->ExecQuery(L"WQL", input, WBEM_FLAG_FORWARD_ONLY, NULL, &pEnumerator))) {
pLocator->Release();
pService->Release();
cout << "Unable to retrive Services: 0x" << std::hex << hRes << endl;
return 1;
}
IWbemClassObject* clsObj = NULL;
int numElems;
while ((hRes = pEnumerator->Next(WBEM_INFINITE, 1, &clsObj, (ULONG*)&numElems)) != WBEM_S_FALSE) {
if (FAILED(hRes)) break;
VARIANT vRet;
VariantInit(&vRet);
if (SUCCEEDED(clsObj->Get(L"Name", 0, &vRet, NULL, NULL))
&& vRet.vt == VT_BSTR) {
wcout << L"Name: " << vRet.bstrVal << endl;
VariantClear(&vRet);
}
Я подумал, возможно ли сделать запрос и вернуть им все сервисы целевого хоста. Что-то вроде
id=1 or 1=1 в SQLi, где мы делаем утверждение логически истинным.Так как в этом случае входящие данные (пользовательский ввод) должным образом не очищены, мы можем использовать ключевое слово
and и перечислить все сервисы, используя ключевое слово like.
Код:
SELECT * FROM win32_service where Name='Appinfo' or name like '[^]%'
Также вы просто можете использовать «%».
Это простая демонстрация, чтобы доказать существование WQL injection. Я уверен, что есть и другие, более удачные, варианты демонстрации бага. Тем не менее, Extended WQL, который является надмножеством WQL, можно использовать для объединения операторов и выполнения более интересных задач. Он используется System Center Configuration Manager - SCCM. Всегда санируйте входящие данные приложения.
Вы можете скачать приложения отсюда, чтобы потестировать материалы, о которых мы говорили выше.
оригинал
автор @ Osanda Malith Jayathissa
Перевод: tabac, специально для https://xss.pro