零、前言
最近做專心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、| ,& ,&&,||等操作
