命令執行及代碼執行漏洞

1、命令執行漏洞php

應用有時須要調用一些執行系統命令的函數,當服務器沒有通過嚴格過濾用戶的參數,這時候就可能致使命令執行,從而致使命令執行漏洞正則表達式

漏洞成因shell

1.代碼過濾不嚴格windows

2.系統的漏洞形成命令執行數組

3.調用的第三方組件存在代碼執行漏洞服務器

經常使用命令執行函數函數

system():  該函數會把執行結果輸出。post

passthru():  該函數只調用命令,並把運行結果原樣地直接輸出沒有返回值3d

exec():  不輸出結果,返回執行結果地最後一行blog

shell_exec():  不輸出結果,返回執行結果

 

命令鏈接符

windows和Linux都支持地命令鏈接符:

cmd1 | cmd2 只執行cmd2

cmd1 || cmd2只有當cmd1執行失敗後,cmd2才被執行

cmd1 & cmd2先執行cmd1,無論是否成功,都會執行cmd2

cmd1 && cmd2先執行cmd1,cmd1執行成功後才執行cmd2,不然不執行cmd2

Linux還支持分號(;)cmd1;cdm2按順序依次執行,先執行cmd1再執行cmd2

防範及修復

1. 儘可能少使用執行命令地函數或者直接禁用

2.參數值儘可能使用引號包括

3.再使用動態函數以前,確保使用地函數是指定地函數之一

4.再進行執行命令地函數|方法以前,對參數進行嚴格過濾,對敏感字符進行轉義

2、代碼執行漏洞

代碼執行漏洞

因爲服務器對危險函數過濾不嚴,致使用戶輸入地一些字符串能夠被轉換成代碼來執行,從而致使代碼執行漏洞

漏洞成因

用戶可以控制函數輸入

存在可執行代碼地危險函數

常見地危險函數

eval()、assert()

這兩個函數均可以將輸入地字符串參數做爲php程序代碼來執行

eval()的參數必須是合法的php代碼,因此必須以分號;結尾

assert(mixed $assertion [,string $description])若是assertion是字符串,它將會被assert()看成php代碼來執行

 

 

 

 

還有一些危險函數

preg_replace()、str_replace()、call_user_func()這些函數跟eval、exec等函數地特性相同,都屬於危險函數

preg_replace(mixed pattern,mixed replacement,mixed subject [,int limit]):此函數能夠用來執行一個正則表達式的搜索和替換

$pattern:正則表達式匹配的內容

$replacement:用於替換的字符串或字符串數組

$subject:要搜索替換的目標字符串或字符串數組

當$pattern存在/e模式修正符,容許代碼執行

 

 修復方案

1. 儘可能不要執行外部的應用程序或命令

2.使用自定義函數或函數庫來替代外部應用程序或命令的功能

3.執行函數的參數作成白名單限制,再代碼或配置文件中限制某些參數

瞭解這些漏洞以後,咱們開始去ctfhub上面去作一下rce的題目

0x11 eval執行

這段代碼沒有通過過濾,而後咱們上面也有舉例子,咱們直接用get方式傳入

phpinfo();

由於eval中的參數必須是php標準的語句的字符串,因此必須以分號結尾

最後構造payload:?cmd=system("cat ../../../flag_14453");

拿到ctfhub{bc1644e9e45ddb7e79f9da2d}

0x12文件包含

 

 下面的shell鏈接就是一個一句話木馬,咱們這簡單須要個繞過就是strpos不能等於flag

咱們直接就是利用文件包含構造payload:?file=shell.txt

而後咱們post傳入一個ctfhub=phpinfo();咱們會發現執行了

而後咱們就構造拿flag的payload:ctfhub=system("cat ../../../flag");

拿到ctfhub{3041141beefd6faba007a336}

相關文章
相關標籤/搜索