前置知識:
漏洞檢測:
在了解漏洞概念前,應該先知道一下這個漏洞如何檢測的,我們應該或多或少聽過白盒測試(白盒),黑盒測試(黑盒)。
白盒測試:
白盒測試是對源代碼和內部結構的測試,測試人員是可以知道內部的邏輯和結構的,差不多就是代碼審計。
黑盒測試:
黑盒測試是對功能需求的測試,測試人員不知道系統內部如何實現的,只知道相應的功能和性能需求,通過模擬用戶使用來進行測試。
了解Windows和Linux基本命令
Windows如
ping #測試連通性
tracert #追蹤路由
telnet #遠程連接
dir #列出目錄
ipconfig #查看 ip
arp -a #查看路由表
calc #打開計算器
regedit #打開注冊表
netstat -ano #查看服務器端口信息
Linux如
cd #切換目錄
ls #顯示當前目錄下的文件
ifconfig #查看 IP 地址
cat /etc/passwd #查看 password 文件內容
id #查看當前用戶的 id 號
cat /etc/group #查看用戶組文件內容
pwd #顯示當前目錄
uname -a #查看當前系統版本
natstat -pantu #查看當前服務器的端口信息
netstat -nr #查看網關和路由
以及拼接符的使用
| 只執(zhí)行|后面的語句
|| 如果前面語句是錯的就執(zhí)行后面的語句,否則只執(zhí)行前面的語句
& &前面和后面的語句都會執(zhí)行,無論前面真假
&& 如果我前面為假后面的語句就不執(zhí)行了,如果前面為真則執(zhí)行兩條語句
; 前面都執(zhí)行,無論前面真假
大致了解php語言(當然偶爾上網查一查很正常)
那么隨便記錄一下魔法變量吧
FILE(左右都是兩個下劃線的) 獲取當前文件路徑
LINE 獲取當前代碼所在行數
__
漏洞講解:
漏洞產生原理:
有地方可以讓攻擊者對服務器進行遠程的注入操作系統命令或者代碼,從而到達控制后臺系統的目的。
漏洞產生條件(利用條件):
1.可控變量(別人的一句話:無論是注入還是RCE都有傳參數。。
2.對用戶的輸入過濾不嚴格。
3.用戶的輸入內容直接拼接到命令當中。
命令執(zhí)行:
常見命令執(zhí)行危險函數
PHP:exec、shell、system、popen 等
ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.Process
StartInfo 等
Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec
等
以上除了PHP的,另外兩種我還沒有碰到過(抓頭)。
講解一下命令執(zhí)行函數
system函數
該函數會將執(zhí)行結果輸出并將輸出結果最后一行作為字符串返回,執(zhí)行失敗就返回false
<?php
highlight_file(__FILE__);
system('ipconfig',$result);
echo $result;
?>
exec函數
該函數沒有輸出結果,但是會將執(zhí)行結果最后一行返回
<?php
highlight(__FILE__);
exec('pwd',$a);//此處$a存放著命令返回值
var_dump($b);
?>
passthru函數
該函數只調用命令,將運行結果輸出,但是沒有返回值
<?php
highlight(__FILE__);
passthru('pwd');
?>
shell_exec函數
該函數不會輸出結果,但返回執(zhí)行結果
<?php
highlight_file(__FILE__);
var_dump(shell_exec('pwd'));
?>
案例分析:
下面將從pikachu靶場來講解
pikachu靶場
輸入|dir,|是只執(zhí)行后面語句,當然你也可以使用其他的拼接符如&等等,具體效果取決于對于用戶輸入內容過濾的情況
效果得到
至于拼接符過濾,可以去DVWA靶場根據難度調試來測試
代碼執(zhí)行
常見代碼執(zhí)行危險函數
PHP: eval、assert、preg_replace()、+/e 模式(PHP 版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval
Python: exec
講解一下代碼執(zhí)行函數
${}執(zhí)行代碼
該格式會對中間的php代碼進行解析
<?php
${phpinfo()};
?>
eval函數
該函數會將字符串當作代碼執(zhí)行,不過需要語句需要完整且以;結尾
<?php
eval('echo "Hello NIKO"; ');
?>
assert函數
該函數判斷是否為字符串,如果是則代碼進行執(zhí)行,且可以被可變函數進行調用,不過在php7.0.29之后的版本都不支持動態(tài)調用
(可變函數即變量名加括號,PHP系統會嘗試解析成函數,如果有當前變量中的值為命名的函數,就會調用。如果沒有就報錯。
可變函數不能用于例如 echo,print,unset(),isset(),empty(),include,require eval() 以及類似的語言結構。需要使用自己的包裝函數來將這些結構用作可變函數。該段話摘抄自https://blog.csdn.net/weixin_43669045/article/details/107093451)
<?php
assert($_POST['a']);
?>
<?php
$a = 'assert';
$a(phpinfo());
?>
array_map函數
該函數是為數組每個元素應用回調函數
構造的payload
?a=phpinfo();
案例分析
繼續(xù)使用pikachu靶場
操作exec‘‘eval’’
直接查看那一關的php代碼
發(fā)現如果沒有報錯,代碼將會直接執(zhí)行
可以輸出phpinfo();
記住一定要;結尾,因為使用的是eval()函數
也可以使用魔法變量
這種我們也可以用其他的方式來利用這個漏洞,比如用一句話木馬,再用蟻劍連接
或者來讀取文件內容
1)Windows
C:\boot.ini //查看系統版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
C:\windows\repair\sam //windows 初次安裝的密碼
C:\program Files\mysql\my.ini //Mysql 配置信息
2)Linux
/etc/passwd //linux 用戶信息
/usr/local/app/apache2/conf/httpd.conf //apache2 配置文件
/usr/local/app/php5/lib/php.ini //php 配置文件
/etc/httpd/conf/httpd.conf //apache 配置文件
/etc/my.cnf //Mysql
如這樣構造a=var_dump(file_get_contents('C:\program Files\mysql\my.ini'));文章來源:http://www.zghlxwxcb.cn/news/detail-825129.html
閑聊:我發(fā)現有好多東西沒有總結,確實不是很好,得開始寫寫了文章來源地址http://www.zghlxwxcb.cn/news/detail-825129.html
到了這里,關于RCE代碼執(zhí)行漏和命令執(zhí)行漏洞的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!