滲透之路基礎 -- 命令執行漏洞

漏洞原理

當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。

​ 常見調用的一些系統命令的函數,如PHP中的system(),exec(),shell(),passthru(),popen(),proc_popen()等。

漏洞產生

  • 應用調用執行系統命令的函數

  • 存在系統命令的參數可以被用戶輸入並且拼接到參數中執行
  • 未對用戶輸入進行過濾或過濾不嚴格

漏洞分類

  1. 代碼層過濾措施不完善

    Web應用中通過system函數來調用

  2. 系統的漏洞造成命令注入

    bash破殼漏洞(CVE-2014-6271)

  3. 調用的第三方中間件或組件中存在的漏洞

    如 WordPress 中用來處理圖片的ImageMagick組件

    Java中的命令執行漏洞(struts2/ElasticsearchGroovy等)

    ThinkPHP命令執行

漏洞危害

  1. 利用Web服務器的權限去執行系統命令或讀寫文件
  2. 反彈Shell
  3. 控制整個網站甚至控制服務器
  4. 進一步內網滲透
  5. 等等

PHP中常見的漏洞代碼

  1. system("$arg"); // 直接輸入即可

  2. system("/bin/prog $arg"); // 直接輸入;ls

  3. system("/bin/prog -p $arg"); // 和2一樣

  4. system("/bin/prog --p=\"$arg\""); // 可以輸入";ls;"

  5. system("/bin/prog --p='$arg'"); // 可以輸入';ls;'

在Linux上,上面的 ; 也可以用 ||| 代替

; 前面的執行完執行後面的

| 是管道符,顯示後面的執行結果

|| 當前面的執行出錯時執行後面的

在Windows上,不能用 ; 可以用 &&&||| 代替

A&B 前面的語句爲假則直接執行後面的

A&&B A執行成功,然後纔會執行B

A|B A的輸出,作爲B的輸入

A||B A執行失敗,然後纔會執行B

漏洞防禦

  1. 儘量少用執行命令的函數或者直接禁用
  2. 參數值儘量使用引號包括
  3. 在使用動態函數之前,確保使用的函數是指定的函數之一
  4. 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章