WEB安全第一篇--對服務器的致命一擊:代碼與命令注入


零、前言

  最近做專心web安全有一段時間了,但是目測后面的活會有些復雜,涉及到更多的中間件、底層安全、漏洞研究與安全建設等越來越復雜的東東,所以在這里想寫一個系列關於web安全基礎以及一些討巧的payload技巧以便於備忘。不是大神、博客內容非常基礎,如果真的有人看而且是大牛們,請不要噴我,歡迎指正我的錯誤(水平有限)。

一、基本原理:

1、代碼注入和命令注入的本質:

  用戶輸入沒有經過過濾而且與程序員開發的代碼拼接后構成完成的可執行的代碼段被服務器執行(命令也是代碼的一部分,不過是拼接在命令執行類函數或方法的參數里面而已)。

2、命令注入舉個例子:Python重度用戶(迷漢子)

 1 @app.route("/osinject")
 2 def osinject():
 3     command = request.args.get("cmd")
 4     response = os.popen(command).read()
 5     return jsonify({"result":response})
 6 
 7 #這是一個flask的一個函數例子:
 8 """
 9 command 就是輸入
10 可以構造http://127.0.0.1:5443/osinject?cmd=ping%20-c%205%20192.168.10.135|whoami
11 就可以執行whoami了
12 """

3、代碼注入例子:

1 //www.local.com
2 /*
3     /codeinject/code.php
4     http://www.local.com/codeinject/code.php?code=phpinfo();
5 */
6 <?php
7     @eval("$_GET["code"]")
8 ?>

4、php、java、python中常見的可以進行命令注入或者代碼注入的函數:

  (1)php的:@我自己,我自己就寫過一遍關於這類函數的小日志,可以訪問看一下:http://www.cnblogs.com/KevinGeorge/p/8127054.html

  (2)python的:

    -*-command:system\popen\subprocess.call\spawn

    -*-code: map\filter\reduce\...   

1 '''
2 python 函數名可以直接作為普通函數的參數的,理論上,如果定義了這樣的函數都危險
3 '''
4 def myreduce(funcname,param):
5     return funcname(param)

  (3)java的:

    -*-command:java.lang.Runtime.getRuntime().exec(command)

    _*_code:不太懂java,這方面的接觸實在不多,囧。

 二、漏洞挖掘:

  1、在請求中出現的位置:

    (1)POST和GET參數中

    (2)URL的filepath或者filename中(類似thinkphp的偽靜態,或者python的url_for構造的一類)

  2、特殊的OS命令注入經常會出現在的業務位置:

    1、系統web管理界面的系統信息配置點:hostname、ipaddress、netmask、gateway、dnsserver、email等。

    2、功能類網站工具:ping、tracert、nslookup等

    3、文件查找或者操作功能:find、locate等

    4、系統信息查看類功能:cpuinfo、meminfo等

    5、關閉重啟類操作、shutdown、ifconfig up、reboot、poweroff等

三、常用payload模式:

  1、| ,& ,&&,||等操作    

   (1)& 表示先執行CMD1 再執行CMD2,這里不考慮CMD1是否成功。使用CMD1 & CMD2
   (2)&& 表示先執行CMD1,成功后再執行CMD,否則不執行CMD2。使用CMD1 && CMD2
   (3)|| 先執行CMD1,CMD1執行成功就不再執行CMD2,CMD1執行失敗則執行CMD2。使用CMD1 || CMD2
  2、payload(& / ‘ “ 空格等特殊符號需要時編碼)
   (1) cmd = 127.0.0.1 | whoami
   (2) cmd = 127.0.0.1 & whoami
   (3) cmd = 127.0.0.1 && whoami
   (4) cmd =  `whoami`
   (5) cmd = '/"|whoami(這里意思是用'/"引號閉合前面   /->表示或)
  3、常用的命令
   (1) 有回顯的:whoami    id(驗證類)
   (2)  沒有回顯的:nslookup wget 等看請求、dnslog httplog等 (驗證類)
   (3)彈shell必須的,參考我自己的( http://www.cnblogs.com/KevinGeorge/p/8120226.html) 
  4、代碼注入:
  (1)php的:檢測phpinfo();攻擊代碼任意。
  (2)python的:import time;time.sleep(20),攻擊代碼任意。
  (3)java的:我是弱雞想不到啊。
四、防御:
  1、禁止相關函數
  2、過濾輸入
  3、制定可輸入內容

  

    

    


免責聲明!

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



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